ID非公開
ID非公開さん
2020/11/10 23:34
2回答
画像にあるようなループをしたいのですが、どうするのが綺麗に処理できるでしょうか?
画像にあるようなループをしたいのですが、どうするのが綺麗に処理できるでしょうか? ①現状は画像のようにフィルターした結果を別の場所の空白セルに貼り付け ②Sheet名と記号を変数に格納 (E列の変数名Sheetに移動し、同行のF列の記号を使用して処理します。EとFはセットですが、処理の為にバラバラに変数に入れています。) ③該当する変数のSheet名があるか探す ④あればそのSheetをアクティブにして処理をする (無ければ処理終了) ⑤③に戻って繰り返す のようなコードを組んでいますがSheet名を変数に入れているので、シート名毎に変数に入れているためループできずにダラダラと長いコードになっています。 画像を例にすると 1ループ目 snA = ActiveSheet.Range("E2").Value kiA = ActiveSheet.Range("E2").Value このように変数に格納して③④⑤の処理をしていますが、画像の例ですとの2ループ目はE3を変数snBに入れるて③④⑤の処理を行うのでforやDoのループが組めずにE列が1行下がるごとに変数を変えて同じマクロを書いてという原始的な感じになって困っています。 このような場合はどのような処理を行うのがベストでしょうか? 先入観のある自分のコードから考えずに勉強したいので慣れた方に1から考えていただきたいため、コードはあえて載せておりません。 宜しくお願い致します。
追記です Sheet名はサンプルなので非常に単調ですが、実際は複雑で法則の無い数字と文字の組み合わせです。
Excel | Visual Basic・109閲覧・100
ベストアンサー
重複削除は、 Dictionaryオブジェクト http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_dictionary.html を使うと高速・便利。 新しい表を考える必要なし。 VBAプログラミングの中級以上の方には、必須のテクニック。 この際、自分のものにすべきです。 Sub sample() Dim Dic, rng As Range, i As Long, xKeys Dim sheet名 As String, 記号 As String Set Dic = CreateObject("Scripting.Dictionary") With ActiveSheet On Error Resume Next For Each rng In .Range("A2", .Cells(Rows.Count, 1).End(xlUp)) With rng Dic.Add .Value & vbTab & .Offset(, 1).Value, .Offset(, 1).Value End With Next rng On Error GoTo 0 End With xKeys = Dic.keys For i = 0 To Dic.Count - 1 sheet名 = Split(xKeys(i), vbTab)(0) '処理対象のシート名 記号 = Dic.Item(xKeys(i)) '処理対象の記号 Worksheets(sheet名).Select '実際の処理を記述 Next i End Sub
ID非公開
ID非公開さん
質問者
2020/11/11 7:36
考えもしていなかった手段なので非常に興味深いのですが、各部分の詳細な説明をお願いできますでしょうか?
質問者からのお礼コメント
本当に勉強になりました。 ありがとうございましたm(__)m
お礼日時:2020/11/17 19:02