none
VBA(Excel 2013) 配列の変数を延々とカンマで繋げなくてよい方法はありますか? RRS feed

  • 質問

  • コミュニティの皆様:

    お知恵をお貸しいただけると幸いです。

    配列で作った変数の値に一致しないセルを含む行を削除するコードを以下のように作りました。

    これはこれで動作するので目的は達成できております。

    しかし、以下の例では要素が4つだけですが、実際は40あり、これからも増え続ける予定です。

    質問は以下のコードに含まれるArray(aG(1), aG(2), aG(3), aG(4)), 0))の部分にあります。

    Array(の次にインデックスで分けた変数を延々とカンマで40も繋げなくてはいけないので非常に時間がかかります。 

    コードも非常に長くなります。

    この部分ですが、延々と40個の変数をカンマで繋げず、配列の複数の変数を1つにまとめる(グループ化とでも言いましょうか?)方法はあるのでしょうか?

    VBA関数を使うのか、それとも40個の変数をまとめてまた別の変数に格納するのかイメージはあるのですが

    いろいろ調べてもどうしても方法がわかりません。

    恐れ入りますがよろしくお願いいたします。

    Sub 行削除_()

    '配列の変数の値に一致しない行を削除

    '配列を宣言する

    Dim aG(1 To 4) As Long

    '格納   

    aG(1) = 666100

    aG(2) = 666900

    aG(3) = 666200

    aG(4) = 622000

       

    Worksheets("Trend").Activate

    With ActiveSheet

    LR = Range("C" & Rows.Count).End(xlUp).Row

    '配列の変数の値に一致しない行を削除

    For i = LR To 11 Step -1

        If IsError(Application.Match(Range("C" & i).Value, Array(aG(1), aG(2), aG(3), aG(4)), 0)) Then Rows(i).Delete

    Next i

    End With

    End Sub


    LiLi803

    2016年9月17日 1:36

回答

  • If IsError(Application.Match(Range("C" & i).Value, Array(aG(1), aG(2), aG(3), aG(4)), 0)) Then Rows(i).Delete

    の「Array(aG(1), aG(2), aG(3), aG(4))」の部分を「aG」とだけすればよろしいかと思います。

    If IsError(Application.Match(Range("C" & i).Value, aG, 0)) Then Rows(i).Delete

    • 回答としてマーク LiLi803 2016年9月20日 0:19
    2016年9月17日 4:44
  • If IsError(Application.Match(Range("C" & i).Value, Array(aG(1), aG(2), aG(3), aG(4)), 0)) Then Rows(i).Delete

    の「Array(aG(1), aG(2), aG(3), aG(4))」の部分を「aG」とだけすればよろしいかと思います。

    If IsError(Application.Match(Range("C" & i).Value, aG, 0)) Then Rows(i).Delete

    nombo様:

    できました!目から鱗です。ありがとうございました。 40個まとめて別の変数に格納するどころか、もう最初からaGという変数が40個の親というか、親的な変数なのですね。

    恐れ入りますがもしよろしかったら、もう一つ関連付けて教えていただいてよろしいでしょうか? Array( の後に40個全部の変数を入れるのならaGを入れればいいのですが、もし、Array(の中に、aG(1), aG(2), aG(4)のみを選びたい場合(実践では40個の全体の変数から25個選びたい・・・などの状況になります)、やはりカンマで延々25個を並べなくて済む方法はありますか?

    aGは40個をすべて含む変数であることはわかりました。 その中でいくつかを選択して使いたいときにその選択した要素の変数のみを一つの変数に格納する方法はありますでしょうか?

    まだ動的配列をきっちりと理解していない上でこの質問をするのは申し訳ないのですが、同時進行で勉強し続けています。

    nombo様、また助けていただいてありがとうございます。前に作ったVBAは毎日仕事で活躍しています。





    LiLi803

    • 回答としてマーク LiLi803 2016年9月20日 0:19
    2016年9月17日 18:59
  • 最後の質問は具体的なコードについてではないので、今回はこの質問はお答えいただいたということで閉じることにいたします。

    本当にありがとうございました。


    LiLi803

    • 回答としてマーク LiLi803 2016年9月20日 0:19
    2016年9月20日 0:14

すべての返信

  • If IsError(Application.Match(Range("C" & i).Value, Array(aG(1), aG(2), aG(3), aG(4)), 0)) Then Rows(i).Delete

    の「Array(aG(1), aG(2), aG(3), aG(4))」の部分を「aG」とだけすればよろしいかと思います。

    If IsError(Application.Match(Range("C" & i).Value, aG, 0)) Then Rows(i).Delete

    • 回答としてマーク LiLi803 2016年9月20日 0:19
    2016年9月17日 4:44
  • If IsError(Application.Match(Range("C" & i).Value, Array(aG(1), aG(2), aG(3), aG(4)), 0)) Then Rows(i).Delete

    の「Array(aG(1), aG(2), aG(3), aG(4))」の部分を「aG」とだけすればよろしいかと思います。

    If IsError(Application.Match(Range("C" & i).Value, aG, 0)) Then Rows(i).Delete

    nombo様:

    できました!目から鱗です。ありがとうございました。 40個まとめて別の変数に格納するどころか、もう最初からaGという変数が40個の親というか、親的な変数なのですね。

    恐れ入りますがもしよろしかったら、もう一つ関連付けて教えていただいてよろしいでしょうか? Array( の後に40個全部の変数を入れるのならaGを入れればいいのですが、もし、Array(の中に、aG(1), aG(2), aG(4)のみを選びたい場合(実践では40個の全体の変数から25個選びたい・・・などの状況になります)、やはりカンマで延々25個を並べなくて済む方法はありますか?

    aGは40個をすべて含む変数であることはわかりました。 その中でいくつかを選択して使いたいときにその選択した要素の変数のみを一つの変数に格納する方法はありますでしょうか?

    まだ動的配列をきっちりと理解していない上でこの質問をするのは申し訳ないのですが、同時進行で勉強し続けています。

    nombo様、また助けていただいてありがとうございます。前に作ったVBAは毎日仕事で活躍しています。





    LiLi803

    • 回答としてマーク LiLi803 2016年9月20日 0:19
    2016年9月17日 18:59
  • 最後の質問は具体的なコードについてではないので、今回はこの質問はお答えいただいたということで閉じることにいたします。

    本当にありがとうございました。


    LiLi803

    • 回答としてマーク LiLi803 2016年9月20日 0:19
    2016年9月20日 0:14