• ベストアンサー

エクセルVBAの初歩的質問です

皆様のお知恵を拝借させてください。 商品1000、商品2000、商品3000・・・・というシート名があります。 商品1000であるマクロを実行した後、次に商品2000で作業、その後商品3000・・・・というように順々にシートを選択していきたいのですが、 なにぶん初心者なものでよくわかりません。ちなみに現在は   Sheets("商品1000").Select Range("E28").Select Sheets("商品2000").Select Range("D30").Select Sheets("商品3000").Select Range("D30").Select というようなかんじになっています。(もちろんrangeをセレクトするだけではなくもう少し長く書き込んでいます。) 超初心者でそれぞれのコードが長くなっている上に同じ作業を各シートでするだけなのに、なにかいい方法はないかなあと悩んでいます。 詳しい方教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • Raistlin
  • ベストアンサー率63% (65/102)
回答No.1

Sheet3, 5, 7それぞれののセルC3の値を「ここがC3」にしたいときは以下のようにすれば良いのですが、こういう答えでよいのでしょうか。 Sub KRKS() Dim vShtNm As Variant vShtNm = Array("Sheet3", "Sheet5", "Sheet7") For i = 0 To 2 WrtVl vShtNm(i) Next End Sub Sub WrtVl(strShtNm) ThisWorkbook.Sheets(strShtNm).Range("C3").Value = "ここがC3" End Sub

piropiro101
質問者

お礼

回答ありがとうございます。 実はarrayを使って少しコードを書いてみたのですが、 Dim sht As Variant sht = Array("1000", "2000", "3000", "4000", "5000") For i = 0 To 5 sht(i).Select Next 当たり前でしょうがシートをセレクトしません。 何が原因か教えていただければ幸いです。昨日から必要にせまられ 勉強しているドシロウトです。よろしくおねがいします。

すると、全ての回答が全文表示されます。

その他の回答 (4)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.5

こんばんは。 少し、コメントを入れておきます。 #1のお礼の部分で、エラーが出るのは、まだ、サブルーチンがわかっていらっしゃらないから、サブルーチンに渡していないからです。ただ、このレベルでは、私は、サブルーチンを使う必要はあまりないと思います。 Dim sht As Variant sht = Array("1000", "2000", "3000", "4000", "5000") For i = 0 To 4  Sheets(sht(i)).Select  '処理 Next となります。 この場合の配列のインデックスは、0 ~ 4 まで。#3の場合は、1~5までです。 コンテナスタイル---Worksheets("1000").Range("D1").Value ="ABC"--は、もう少し、慣れてからでも、また、テキストをみて参考にしてもよいと思います。私は、前回・今回を含めて、それについては触れません。一応、Excelのマクロの基本は、「標準モジュール」に書くということさえ、守っていれば、入門時には良いと思います。(Excelのみです)理由は、難しい言い方をすれば、親オブジェクトの属性が、Application だから、ということになります。 後、ご質問者さんは、どうも、VBAのテキストなどは、ある程度、持っていらっしゃるようですね。テキストを一度読んだ程度では、なかなか、実務レベルのマクロまでは作れないのも事実です。

piropiro101
質問者

お礼

お返事遅くなりまして申し訳ありません。大変参考になります。 sht = Array("1000", "2000", "3000", "4000", "5000") のようなVBAをサクサク書けるレベルになるのはまだまだ先のようです・・・・。(ーー;) VBAは仕事上必要にせまられ現在勉強しているのですが、 ど素人ながらFor Next が理解できたらある程度それっぽい簡単なモノはつくれそうです。(ただ以上に長く重たいです。・・・) ありがとうございました。

すると、全ての回答が全文表示されます。
  • Raistlin
  • ベストアンサー率63% (65/102)
回答No.4

No.1のお礼に書かれた内容で引っかかるのは、 ・「商品1000」と「1000」の違い ・Sheetが5枚しか指定されていないのに「For i = 0 To 5」となっている(普通はTo 4) ぐらいでしょうか。 #参考URLは余裕があるときにでも・・・

参考URL:
http://officetanaka.net/excel/vba/speed/s2.htm
piropiro101
質問者

お礼

お返事遅くなりましてもうしわけありません。 色々と試してみた結果何とかなりそうです。 ありがとうございました。 商品1000と1000の違いですが、書き間違えただけです。(*^_^*)

すると、全ての回答が全文表示されます。
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんばんは。 入門編では、なるべくインデックスを使ったほうがよいです。 インデックスというのは、ワークシートですと、左から順番という意味です。 確か、左端のシートは、「商品名」シートですから、2番目から順に処理していくというなら、以下のようにします。 For i = 2 To Worksheets.Count  Worksheets(i).Select Next i しかし、Range("E28").Select と場所が変わる場合は、規則があればよいのですが、そうでない場合は、ちょっと難しいですね。 もちろん、配列に入れる方法もありますが、もし、もう段階的な勉強など必要ないというなら、以下の方法や、または、Collection にしてしまうという方法もあります。 Dim whs As Variant Dim i As Integer  Set whs = Worksheets(Array("1000", "2000", "3000", "4000", "5000"))  For i = 1 To 5   whs(i).Select  Next i なお、私は、Sheets とWorksheets は、区別して使うようにしています。理由は、必ずしも、Sheets は、ワークシートではないからです。グラフシートも、ダイアログシートも、マクロシートも、全部総称して、Sheets として扱うからです。

piropiro101
質問者

お礼

Wendy02さんに回答をいただけるのは2度目でしょうか? いつもわかりやすいご回答ありがとうございます。 For i = 2 To Worksheets.Count  Worksheets(i).Select のコードで問題が解決しました。私の知識レベルに沿った的確なご回答で無事完成しそうです。ありがとうございました。  ただ、申し訳ありませんが、ポイントは早く回答をいただいた方から付与させていただこうと考えています。ご了承ください。

すると、全ての回答が全文表示されます。
  • imogasi
  • ベストアンサー率27% (4737/17070)
回答No.2

質問だけではArrayが良いのか下記が良いのかいえません Sub test01() Dim ws As Worksheet For Each ws In Worksheets MsgBox ws.Name If ws.Name = "Sheet1" Then MsgBox "AA" If ws.Name = "Sheet2" Then MsgBox "BB" Next End Sub を実行すしてみて質問者は使えると思うかどうか、行ってみてください。 (例)処理をスキップするシートが多いとか 本番の実際はMsgBox "AA"のところへ、処理ルーチンが入る。

piropiro101
質問者

お礼

お返事おそくなりまして申し訳ありません。大変参考になりました。 それにしてもVBAは奥がふかいですねー(~_~;) ど素人ながらなんとなく必要なVBAがかけそうです。(以上にながいコードにはなりましたが・・・) ありがとうございました。

すると、全ての回答が全文表示されます。

関連するQ&A