自分は出来てから、分けるのが好きなので、FunctionとSubで分けてみます。
VBの場合、ByValとかByRefとか関数の引数に付きますが、少しあやふやですが、単一の変数以外であれば、例えば配列などの場合は、参照渡しになるようだ、と思ってます。この辺も解釈がいろいろあって、自分の考えもはっきりしませんが、アドレスのコピーが渡されると解釈する方も居るようです。なので値渡し以外無い、とか。
一応動いたので、良いとは思いますが。(笑)
入力データのチェックは、単に入力されたものが、allcardになければエラーで、再入力する、だけで良いように思います。