- ベストアンサー
ループ処理で複数の名前を変えて処理を行う方法
- エクセルマクロ初心者の方がループ処理で複数の名前を変えながら処理を行いたい場合、For~Next文を使用することで実現することができます。
- 名前がJPN、CHN、KOR、HOZ、USAのように順に変わる場合、For文のカウンタ変数に名前のリストを設定し、処理内容にその変数を利用することで、スマートかつ効率的なコードを書くことができます。
- これにより、名前が変わっても同じ処理を繰り返し実行することができ、重複や漏れの発生も防ぐことができます。是非、試してみてください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
他の方向けのお礼に掲示された内容を盗み見してる状態で、こちらとしては大変心苦しいのですが。 初心者さんが絶対一度、やらかしますが、変数名を""で囲っちゃ全くだめです。 sub macro1() dim a as variant for each a in array("JPN","CHN","KOR","HOZ","USA") with worksheets("harituke").range("B1:B500") .autofilter field:=1, criteria1:=a activesheet.autofilter.range.offset(1).copy destination:=worksheets(a).range("A1") .autofilter end with next end sub 寄せられた回答を「それぞれ」よく見て、回答同士でもどこが違ってるのか(けどどちらも正しい)キチンと把握して、正しく応用してください。
その他の回答 (3)
- xls88
- ベストアンサー率56% (669/1189)
>No.1 この回答へのお礼 既に、No.3でkeithinさんが回答されていらっしゃいますように 折角の変数を""で囲むと単なる文字列(定数)という事になってしまいます。 願わくばNo.1の回答内容を再吟味してください。 No.1 私の回答は入門者レベルだと思います。 No.2 keithinさんの回答はVBAに精通された1段階レベルUPした内容だと思います。 非常に参考になりました。ありがとうございました。
お礼
xls88さん ありがとうございました。 いろんなご回答を頂けるので、逆にいろいろと試すことができています。 勉強になります。 ありがとうございました。
- keithin
- ベストアンサー率66% (5278/7941)
For Each Nextで配列の中身を直接ぐるぐる廻すのでも構いません。 sub macro1() dim a as variant for each a in array("JPN","CHN","KOR","HOZ","USA") msgbox a next end sub
お礼
keithinさん ご回答ありがとうございました。 得たい処理がまだうまくいっていませんが、まずはお礼申し上げます。 xls88さんのお礼コメントに記載いたしましたが、Valiant型を使用しているa(xls88さんの場合はarg)をfor~nextの間の処理に入れてみました。オートフィルタをかけ、指定したaのシートに貼り付ける部分でエラーになってしまいます。 書き方が悪いのかどうなのか、解決できていない部分です。
- xls88
- ベストアンサー率56% (669/1189)
配列にします。 Dim arg As Variant Dim i As Long arg = Array("JPN", "CHN", "KOR", "HOZ", "USA") For i = LBound(arg) To UBound(arg) MsgBox arg(i) Next
お礼
xls88さん ご回答ありがとうございます。 得たい結果が得られていないのでループ処理がうまくいっているのかどうかまだ分かりませんが、まずはお礼申し上げます。 Variant型を使用しているので、argを処理中のどの位置に挿入しても処理が回ると思っているのですが、うまくいきません。 下記のように、"harituke"シートのB列にargが存在していて、オートフィルタをかけた後 事前に準備されている各argのWorksheetsに貼り付けていく作業をしています。 すると .CurrentRegion.SpecialCells(xlVisible).Copy Worksheets("arg").Range("A1") でエラーになってしまい、得たいループ処理が初めでつまづいてしまっています。 下記ソースをForとNextの間に入れるだけではうまくいかないのでしょうか。 Sheets("harituke").Activate With Worksheets("harituke").Range("B1:B500") .AutoFilter Field:=1, Criteria1:="arg" .CurrentRegion.SpecialCells(xlVisible).Copy Worksheets("arg").Range("A1") .AutoFilter Worksheets("arg").Range("1:1").Delete End With
お礼
keithinさん ありがとうございました。うまくいきました。 >初心者さんが絶対一度、やらかしますが、変数名を""で囲っちゃ全くだめです 載せたコードのご指摘いただいた部分以外でも""で囲ってエラーになってしまった部分がたくさん発生し、""を外すことでうまくいきました。 ""で囲う、囲わない、で意味合いが全く異なってくること、しっかり勉強していきたいと思います。