• ベストアンサー

エクセルVBAでシート名検索

エクセル2000です。 あるブックにAAAという名前のワークシートが存在するかどうかの判定方法の質問です。 現在はそのブックを開き、 Sub test() For Each sh In ActiveWorkbook.Worksheets If sh.Name = "AAA" Then flag = "ありまする。" Else flag = "ないでござる。" End If Next MsgBox flag End Sub のように判定しています。 質問は、 1.開かずに判定することは可能かどうか?可能ならその方法 2.上記コードのように各シート総当り以外にシート名を検索する方法があるか?あるならその方法 です。よろしくお願いします。

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

  • ベストアンサー
  • ja7awu
  • ベストアンサー率62% (292/464)
回答No.2

それ以前に、このコードでは、 「ブックにAAAという名前のワークシートが存在するかどうかの判定」するのではなくて 一番右のシートが、"AAA" かどうかの判定です。  あっても、"ないでござる。" になるのでござる・・・ 何かが抜けているような・・・  

merlionXX
質問者

お礼

あははは!ほんとですねえ、何やってんだろ馬鹿だなあ。 テストしてるブックがみんな最後のシートだったので気付きませんでした。 Sub test() For Each sh In ActiveWorkbook.Worksheets If sh.Name = "AAA" Then flag = True Next MsgBox IIf(flag, "ありまする", "ないでござる。") End Sub ならいいですね。

その他の回答 (3)

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

こんにちは。 Wendy02です。 >> Excel VBAでは、IIf は、普通は使わないことになっていますが。 Access の一般関数にはありますが、ExcelのVBAでは、反応が遅いということでしょうね。

merlionXX
質問者

お礼

> Access の一般関数にはありますが、ExcelのVBAでは、反応が遅いということでしょうね。 わかりました。以後、注意します。 ありがとうございます。

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

こんにちは。 あえて、書くなら、以下のようになるかな? Sub testR() Dim sh As Worksheet Dim flag As Boolean For Each sh In ActiveWorkbook.Worksheets  If StrComp(sh.Name, "AAA", vbTextCompare) = 0 Then   flag = True: Exit For  End If Next MsgBox IIf(flag, "ありまする", "ないでござる。") End Sub Excel VBAでは、IIf は、普通は使わないことになっていますが。 私なら、以下のようになるかな? Sub TestShFind() Dim ret As Variant Dim ShName As String Dim msg As String  ShName = "AAA"   ret = Evaluate(ShName & "!A1")   If IsError(ret) Then    msg = ShName & "はありません。"   Else    msg = ShName & "は見つかりました。"   End If  MsgBox msg End Sub

merlionXX
質問者

お礼

いつもありがとうございます。 If IsError(ret) Then・・・やはりエラーで判定するわけですね。 わかりました。 > Excel VBAでは、IIf は、普通は使わないことになっていますが。 そうなんですか?どうしてでしょう?

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.1

>1.開かずに判定することは可能かどうか? どこかのセルにブック(シートの任意のセル)へのリンク式(フルパス)を設定して、リンクの更新。 無ければエラーになる。 >2.上記コードのように各シート総当り以外にシート名を検索する方法があるか? シート名を指定してエラーになったら「無し」

merlionXX
質問者

お礼

2.シート名を指定してエラーになったら「無し」は思いついたのですが、ほかに方法がないかと思い質問しました。 1.はそういう方法があるんですね。有難うございます。 ただ、事前にリンクを設定しておくのは無理なので・・・・。

関連するQ&A

  • エクセルVBA 呼出し

    エクセルVBA 呼出し FormをひらいてTextBox31に数字(ID番号)が入り それをSheet”計”のF4に入れます! そのF4を他のブックの WSName = "DATA.xls"にて IDを検索して、名前や色々なものをSheet”計”に写します。 それを再度、FromのそれぞれのTextBoxに入れます。 しかし、SH1.Cells(lngNumber, 2) = Worksheets("計").Range("B2").Value '名前 が上手くできません!!エラー表示などはないのですが… DATA.xlsにはID番号があるのですが、それを入力しても値が入りません どこの部分が間違っているのか? すいません、教えてください WSName = "DATA.xls"を呼出す記述は省略!! 'DATA.xlsとSheet1をセットする。 Set WS = Workbooks(WSName) Set SH1 = WS.Worksheets("Sheet1") 'ブックが存在していないのであればメッセージを出し処理を抜ける。 Else MsgBox WDName & "が存在していません。設置してください。", vbExclamation, "確認してください" Exit Sub End If flag = False For lng = 1 To lngYcnt_K '計のF4と同じ値を見つけてテキストボックスの値を入力。 If CStr(Worksheets("計").Range("F4").Value) = CStr(SH1.Cells(lng, 1)) Then flag = True lngNumber = lng Exit For End If Next lng If flag = True Then SH1.Cells(lngNumber, 2) = Worksheets("計").Range("B2").Value '名前 With Worksheets("計") ’計のSheetの値を開いているFromのTextBox4に再度値を入れる TextBox4.Value = .Range("B2").Value '計のSheetからTextBox1の値の名前’ End With MsgBox " 記録を呼び戻しました" Else TextBox31.Value = "確認必要" End If

  • エクセルVBA ワークシート検索について?

    エクセルで所定のワークシートにデーターを自動で記入させようと しています。 所定のワークシートが在るか無いか判断して、存在すれば、 VBAは記入動作を開始し、無ければ、VBAを終了させる。 こういった動きを作ろうとしていますが、存在しない場合に VBAを抜ける所が上手く作動しません。書き方に問題があると 思うのですが、どのような書き方がいいのか教えていただけない でしょうか。 コードの方は以下に示します Set ThisYearSheet1 = ActiveWorkbook.Worksheets("本年度基データ") With ThisYearSheet1 myYear = Mid(.Cells(1, 1), 3, 4) myMonth = Mid(.Cells(1, 1), 8, 2) End With mySheetName = CStr(myYear) & CStr(Format(myMonth, "00"))<<<<シートの名前仮取得 myMsg = "「" & mySheetName & "」" & vbCrLf & _ "のシートデーターを更新します。" & vbCrLf & _ "よろしいですか?" myButt = MsgBox(myMsg, vbYesNo) Select Case myButt Case vbYes For Each mySheet In Worksheets<<<<仮取得したシート名を探す If mySheet.Name = mySheetName Then Set ThisYearSheet2=ActiveWorkbook.Worksheets(mySheetName)<<<<仮取得したシート名が存在すれば、オブジェクトとしてセット Exit For Next mySheet Case vbNo Exit Sub End Select If ThisYearSheet2 = Nothing Then<<<エラー箇所(無ければ、VBAを終了させたい) MsgBox "" Exit Sub End If エラー箇所では、nothingの使い方が不正ですと出るのですが、、、 どなたか宜しくお願いいたします。

  • エクセルVBAでワークシート削除

    ブックの中にある、表示されているシートで、たとえば図表1~図表4(何番まであるかは不定です)という名前のシートを削除するVBAを作りました。ただの「図表」という名前のシートや、「何々図表」、「図表集計」等のシートは削除しません。 Sub 保存図表削除() Dim SN As String For Each sh In Worksheets SN = sh.Name If sh.Visible And IsNumeric(Mid(SN, 3, Len(SN) - 2)) And Left(SN, 2) = "図表" Then ans = MsgBox(SN & "を削除してよい?", vbYesNo) If ans = vbYes Then Application.DisplayAlerts = False sh.Delete Application.DisplayAlerts = True End If End If Next End Sub これでうまく作動するのですが、いちいちシートごとに削除の有無を聞かずに、削除するシート名をまとめて表示し、それらを削除するかしないかを聞くにはどうすればよいでしょうか? 「図表1,2,3,4があります。これらを削除しますか?」というような感じです。

  • VBAで一番後尾のシート見出しの色を変更したい

    WIN XP エクセル2003 BOOK内の一番後尾のシート見出しの色を変更したいのですが 下記コードでは見出しの色が変わりません。 何処が間違っているのかわかりません。ご教授お願い致します。 Sub シート見出し色変更() Dim N As Integer Dim sh As Worksheet N = ActiveWorkbook.Worksheets.Count Worksheets(N).Activate Set sh = ActiveSheet sh.Tab.ColorIndex = 3 Worksheets(1).Select End Sub

  • Excel VBA 指定シートの有無確認

    指定した名前のシートがあるかないか判断させてますが、 以下のやりかたでは、 グラフ作成したシートを認識してくれません。 そのようにすれば良いでしょうか? Dim ws As Worksheet, flag As Boolean For Each ws In Worksheets If ws.Name = "シート" Then flag = True  Next ws If flag = True Then  msgbox "あります  Else  Sheets.Add  ActiveSheet.Name = "シート" End If

  • エクセルのマクロでシート名の検索をしたい

    マクロの初心者です。お教え下さい。 ブックの中に複数のシートがあります。 どのシートにも「個人別データ」という名前のシートが無い時に 「個人別データのシートがありません。」とメッセージボックスを 表示させ、マクロを終了したいのです。 下記の通り記述すると、個人別データの シートがあっても「個人別データのシートがありません。」と メッセージボックスが表示されてしまい、うまく行きません。 ご教授下さい。  Dim Sh As Worksheet For Each Sh In Sheets If Not Sh.Name = "個人別データ" Then MsgBox "個人別データのシートがありません。" Exit Sub End If Next

  • エクセルVBA 1つのシートで出来ますか?

    説明が下手で申し訳ございませんが、宜しくお願い致します。 sheet(1)に20個のボタンがあります。 ボタンをクリックすると、別のシートが開きます。 開いたシートにも複数のボタンがあり、そのうちの任意のボタンをクリックすると、そのボタンの値がsheet(1)のそれぞれのボタンに対応したセルに入力される、という動作を実現したいと思っています。 現状、下記のようなコードで目的の動作は実現できてはいるのですが、各ボタンそれぞれにシートを作っているような状況です。(データ自体は全く同じ内容のものが、計20シート) たぶん、もの凄く頭の悪い事をやっているんだろうと思います。 sheet(1)を除いた各シートの入力データ自体は全く同じなので、シート一枚で出来るんじゃないのかなと思い、ネットや本で調べながら色々試してみたのですが、どうも上手く行きません。データが同じでも、sheet(1)のクリックしたボタンによって入力するセルを変えなければならないのが問題です。 sheet(1)のボタンとセルの関連付けや、sheet(1)のどのボタンを押したのかの判別ができればいいのかなと思って調べてみても、初心者にはよく理解できず、もう何週間もチャレンジしているのですがお手上げです。 上級者の方の知恵をお借りできれば幸いです。 Sub sheet2を開く() Worksheets(2).Select End Sub Sub 入力1() Worksheets(1).Range("F8") = "データ1" Worksheets(1).Select End Sub Sub 入力2() Worksheets(1).Range("F8") = "データ2" Worksheets(1).Select End Sub Sub 入力3() Worksheets(1).Range("F8") = "データ3" Worksheets(1).Select End Sub Sub sheet3を開く() Worksheets(3).Select End Sub Sub 入力1() Worksheets(1).Range("H8") = "データ1" Worksheets(1).Select End Sub Sub 入力2() Worksheets(1).Range("H8") = "データ2" Worksheets(1).Select End Sub Sub 入力3() Worksheets(1).Range("H8") = "データ3" Worksheets(1).Select End Sub Sub sheet4を開く() Worksheets(3).Select End Sub Sub 入力1() Worksheets(1).Range("M8") = "データ1" Worksheets(1).Select End Sub Sub 入力2() Worksheets(1).Range("M8") = "データ2" Worksheets(1).Select End Sub Sub 入力3() Worksheets(1).Range("M8") = "データ3" Worksheets(1).Select End Sub    ・    ・    ・    ・    ・

  • エクセルVBAで、作業対象を全ワークシートか選択シートかを切り替えたい

    エクセル2000です。 VBAで、作業対象を全部のワークシートか選択されたシートかを任意で切り替えたいのです。 ためしに無理とは思いながら以下のように作ってみましたが、当然のようにエラーになります。 どうかお知恵をお貸しくださいませ。 お願い致します<(_ _)> Sub test() sc = ThisWorkbook.Worksheets.Count ssc = ActiveWindow.SelectedSheets.Count If sc <> ssc Then ans2 = MsgBox(ssc & " 枚のシートだけでいいんですね?" _ & vbCr & "" _ & vbCr & "もし全部のシート(" & sc & "枚)を対象にするなら" _ & vbCr & "いいえを選択してください。", vbYesNo + vbQuestion, " o(^-^)o") ts = IIf(ans = vbNo, Worksheets, ActiveWindow.SelectedSheets)'ここでエラー End If For Each sh In ts sh.Activate sh.Cells(1, 1).Value = sh.Name Next sh End Sub

  • 同じシート名を一枚にまとめる

    エクセルのマクロでファイル内の同じシート名を一枚にまとめたい。 シート名が"売上"、"売上(2)"、"売上(3)"・・・ のようになっていて、売上シートの枚数は変動します。 他にも、、"部署"、"部署(2)"、"部署(3)"・・・・ のようにシート枚数が変動します。 売上、部署シートの1行目はタイトル行になっています。 そして、BOOK内には、他にもシートがいくつかあります。 BOOK内の "売上"シート名を一枚にまとめ、 "部署"シート名を一枚にまとめる方法をどうかご教授願います。 複数のBOOKから一つのファイルにまとめる事が出来たのですが、 どうやっても、同じシート名同士だけをまとめるマクロが出来ず、 とても困っています。 どうか、助けて頂けないでしょうか? 何卒お願い致します。 ちなみに、 下記は途中で断念した案の一つです。 統合表シートを売上シートが隣に並ばないといけないのと、 売上、売上(2)も隣に並ばないと動かないのと 部署(2)、部署(3)・・・もまとめてしまうから、 駄目でした。 とりあえず、売上だけはまとめようとしました。 下記のコードには、こだわりませんので、助けてください。 お願いします。 Sub まとめ() Dim sh1 As Worksheet Dim sh2 As Worksheet Dim j As String Dim d As String Dim i As Integer Set sh1 = Worksheets("統合表") j = 2 '統合表のデータ書きこみ開始行 For Each sh2 In ActiveWorkbook.Worksheets If sh2.Name = "発注" Or _ sh2.Name = "部署" Or _ sh2.Name = "使い方" Or _ sh2.Name = "残すシート" Then Exit For '統合表は統合対象外 d = sh2.Range("A65536").End(xlUp).Row '各シートの最終行を知る ' MsgBox d For i = 2 To d sh1.Cells(j, "A") = sh2.Cells(i, "A") sh1.Cells(j, "B") = sh2.Cells(i, "B") j = j + 1 Next i Next End Sub

  • エクセルVBA シート名の部分一致検索について エクセル2007

    VBAでエクセルの全シート名を部分一致で検索したいと考えています。 そこで以下のコードを書いたのですが、 インプットボックスにどんな文字列を入力しても全てのシート名を 取得してしまって途方にくれています。 どなたかお助けください。 Sub test01() Dim name As String Dim ws As Worksheet shn = InputBox("検索文字列を入力") For Each ws In ThisWorkbook.Worksheets If ws.Name Like " * " & name & " * " Then ws.Activate MsgBox ws.Name End If Next ws End Sub

専門家に質問してみよう