- ベストアンサー
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枚だけは選択されないようにしたいのです。 どのようにコードをかいたらよろしいでしょうか
- みんなの回答 (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 ご参考までに。
その他の回答 (2)
- n-jun
- ベストアンサー率33% (959/2873)
>For Each SheetName In Worksheets >'If文追加 >Sheets(SheetName).Activate >Call 請求書作成用部品 >'End If >Next にして、変数SheetNameが4つのシート以外の時に目的を実行するよう If文を作るとか?ではダメですかね。 (4つが決まっているのならば)
お礼
なるほどIf文を作ることはかんがえもしませんでした。勉強になりました。 ありがとうございました。当地は激しい雷で昨日はやむなくPCつながずお礼が遅くなりもうしわけないです
- imogasi
- ベストアンサー率27% (4737/17069)
質問文ばかり長くて、何を聞きたいのかがわかり難い (1)集計用シート以下4つのシートを指定しないArrayを作る (2)Ubound(list)-4までを処理を繰り返す ではダメなんですか。 焦点を絞って質問文をかけないですか?
補足
もうしわけございません。 端的に再質問させていただきます。おっしゃるとおり (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までを処理を繰り返す・・・・これについては作ったことがないのでわかりません。 すいません。
お礼
私のような超初心者にも良く理解できました。思っていることが完璧にできたコードでした。ありがとうございました。