• ベストアンサー

Arry関数または他の方法で手入力でなく自動でシートを選択したい

winXP Excel2003でマクロ作成している初心者です。 0)シート名は次のようになっています。  AAA会社 BBB会社 CCC会社・・・・以下10枚(増減あり)  集計用シート 印刷用シート リンク用シート 会社見本シートの4枚 1)全シート名が表示されるリストボックスを配置しました。  任意のシート名をクリックすると即座にその会社のデータ入力ができます。 2)さらに、一番右の会社見本シートを複写し、そのシート名をWWW会社に変更しAAA会社シートの前に追加できるようコマンドボタンを配しました。シート削除のボタンも併設しました。 3)このブックには次のコードが書いてあります。 Sub 請求書入力() Application.ScreenUpdating = False Dim list, SheetName list = Array("1.AAA", "2.BBB", "3.CCC", "5.DDD", "6.EEE", "7.FFF", "8.GGG", "9.HHH ", "10.III", "12.JJJ", "13.KKK") For Each SheetName In list Sheets(SheetName).Activate Call 請求書作成用部品 Next End Sub ここで会社見本シートを複写してWWWの会社を新規作成したとき、 list = Array("1.AAA", "2.BBB", "3.CCC",・・・・の部分を手入力で変更しないとindexエラーが発生してしまいます。このエラーが出ないようにし、ブックの全シート14枚のうち、集計用シート 印刷用シート リンク用シート 会社見本シートの4枚だけは選択されないようにしたいのです。 どのようにコードをかいたらよろしいでしょうか

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

  • ベストアンサー
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.3

こんにちは。 リストは固定化されたもの、最小限で済むものを優先させると良いですよ。 あとは、#2 ご回答のロジックのとおりです。 Array でもいいですけど、今回の用途なら定数の文字列で定義しておいて、 ワークシートコレクションをループさせ、InStr でシート名が上記定数 に含まれるか調べると楽です。 Sub 請求書入力()   ' // 処理を除外するシート名リスト   Const EXCEPT_NAME = "集計用 印刷用 リンク用 会社見本"   Dim sh As Worksheet   For Each sh In ThisWorkbook.Worksheets     If InStr(EXCEPT_NAME, sh.Name) = 0 Then       sh.Activate       Call 請求書作成用部品     End If   Next End Sub ただし、私ならブックの保護等でユーザーにシート名が変更されない という保障がない限り、シート名による分岐は余り使いません。多分 シートのコードネームの方を使うと思います。   ※コードネームは Excel 画面で目にみえるシート名とは別物です    VBE のプロパティーウインドウで確認できます。これは、任意    に変更できるものですが、VBE 画面からしか変更できません。 Sub 請求書入力2()   ' // 処理を除外するシートのコードネームリスト   Const EXCEPT_NAME = "shCalc shPrint shLink shTemplate"   Dim sh As Worksheet   For Each sh In ThisWorkbook.Worksheets     If InStr(EXCEPT_NAME, sh.CodeName) = 0 Then       sh.Activate       Call 請求書作成用部品     End If   Next End Sub ご参考までに。

aitaine
質問者

お礼

私のような超初心者にも良く理解できました。思っていることが完璧にできたコードでした。ありがとうございました。

その他の回答 (2)

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.2

>For Each SheetName In Worksheets >'If文追加 >Sheets(SheetName).Activate >Call 請求書作成用部品 >'End If >Next にして、変数SheetNameが4つのシート以外の時に目的を実行するよう If文を作るとか?ではダメですかね。 (4つが決まっているのならば)

aitaine
質問者

お礼

なるほどIf文を作ることはかんがえもしませんでした。勉強になりました。 ありがとうございました。当地は激しい雷で昨日はやむなくPCつながずお礼が遅くなりもうしわけないです

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.1

質問文ばかり長くて、何を聞きたいのかがわかり難い (1)集計用シート以下4つのシートを指定しないArrayを作る (2)Ubound(list)-4までを処理を繰り返す ではダメなんですか。 焦点を絞って質問文をかけないですか?

aitaine
質問者

補足

もうしわけございません。 端的に再質問させていただきます。おっしゃるとおり (1)集計用シート以下4つのシートを指定しないArrayを作るということです。 現在は list = Array("1.AAA", "2.BBB", "3.CCC", ・・に固定されています。ので、シートを追加したときは list = Array("11.WWW", "1.AAA", "2.BBB", ・・にコードを修正しなければなりません。 やりたいことは、シートの追加・削除があったばあいでも「コード修正」によらず集計用シート以下4つのシートを指定しないArrayを作ることです。よろしくお願いします。(2)のUbound(list)-4までを処理を繰り返す・・・・これについては作ったことがないのでわかりません。 すいません。

関連するQ&A