• ベストアンサー

検索値と検索先のシートが別でもOKなVBAはありますか?

「Excel2002」を使用して、内線番号表を 作ろうと思っています。 「表紙」sheetにあるコンボボックスで選んだ 値(各部署名)が、 「内線番号表」sheetの「E1」に入るとします。 (「LinkedCell:内線番号表!E1」) その「E1」を検索値として「内線番号表」内を 探すマクロを、フォームボタンに登録しました (以下。自分で書いたわけではないのですが)。 Sub 部署を表示() With Worksheets("内線番号表") Sheets("内線番号表").Select Cells.Find(What:=Range("E1"), After:=Cells(2, 1), LookIn:=xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, MatchByte:=False, SearchFormat:=True).Activate End With End Sub これはこれでうまくいったのですが、少し問題が 出てきてしまいました。 「内線番号表」sheetはデータを取り込んで、 列や行を大幅にいじる事が頻繁にあるので、 コンボボックスの「LinkedCell」として指定した 「内線番号表!E1」という アドレスが勝手に変更されてしまうのです。 (「$」をつけても駄目でした) そこで、コンボボックスの「LinkedCell」を、 いじる事がない「表紙」sheetの セルに変えたいと思うのですが… 「検索先のシートの中に検索値がなくても 検索出来る」方法はあるのでしょうか? つまり、「表紙」sheetのセルの値を元に、 「内線番号表」sheetを検索するVBAのコードが あれば、教えて頂きたいのですが…。 (これが出来れば、他にも応用したいと思うので) コントロールBOXやVBAは勉強し始めた ばかりなので、うまく説明出来たかどうか 分かりませんが…よろしくお願い致します。

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

  • ベストアンサー
noname#29107
noname#29107
回答No.4

問題を理解しているか自信がありませんが、 VBAの変更は、 Cells.Find(What:=Sheets("表紙").Range("E1"), {以下略} の1カ所でいいんじゃないですか?

mami0810
質問者

お礼

お礼が遅くなって申し訳ありません。 これでうまくいきました!   こんな簡単な事でよかったんですね。 スミマセン。助かりました。 回答、ありがとうございました。

その他の回答 (5)

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

なんか問題文が長くて判り難いが (1)VBAでやるならLinkedCellなど使わなくて良い。 セルを余分に使うだけです。 変数(仮にbusho)に入れ(代入す)れば良い。 Private Sub ComboBox1_Click() busho = ComboBox1.Text MsgBox busho End Sub を作れば、選んだ項目ItemがMSGBOXに表示されますので、納得出来るでしょう。 そして検索のコードで Cells.Find(What:=Range("E1"), ・・を Cells.Find(What:=busho, にすれば良いのでは。 むしろCELLSがどのシートか指定せねばならない。 fINDメソッドのOBJECT(この概念が判るかな)はセル範囲Rangeで、特定のSheetを指定しないとならず、ブック全体は1度に対象に出来ないと言うこと。 選択部署と言うセルを設け、表示したい(そして挿入などで動く)のなら、見だしの選択部署を設け、選択部署と言う語句を探し、その下のセルなりにCells(i,j)=bushoとすれば済む。 行挿入で問題なのはListFillRangeの事ではないですか。 間に列挿入されると空白行が入ってしまう。 >検索先のシートの中に検索値がなくても検索出来る」方法はあるのでしょうか VBAが同一ブックの他シートも扱えるので、変数に検索語を いれてしまえば、変数がどこのシートのセルから取ったものであろうとiNPUTBOXで入力させたものであろうが関係ない。だからこう言う質問は成り立たないのでは。 >コントロールBOXやVBAは勉強し始めたばかりなので、うまく説明出来たかどうか 扱う(データ値を取得したり、設定したりするセルの)シートを2つ以上扱う場合のやり方を勉強してください。 一般論として 変に我流のvbaコードを載せて、その改良やバグ取りを依頼せずに、vbaコードなどを混ぜずに、やりたいこととシートの状態を説明して、やり方は回答者にまかせ、どれくらい自分の構想と回答がレベルの差があるのかないのか勉強するのが、進歩する上で良いと思いますが。

mami0810
質問者

お礼

お礼が遅くなって申し訳ありません。 私はimogasiさんの回答にはまだついていけない レベルで…スミマセン。 仕事上、必要に迫られてやるものですから、 どうしても「出来上がりさえすればいい」 という風になりがちで、「マクロの自動登録」や 他の社員が作ったもの、ネットで紹介されている もののアレンジに終始してしまい、 基本的な勉強が後回しになっているのが現状です。 (それほど難しいものは求められないので…) でも確かにこのままじゃ人頼みばかりに なってしまって駄目ですよね。頑張って勉強します。 回答、ありがとうございました。

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

ご希望の動作をしない原因は、No.4方が回答されているとおりです。 補足ですが、Sheets("内線番号表").Select によりアクティブシートが[内線番号表]となっていることをご確認下さい。 つまり、Range("E1")のようにシート名を省略して検索語を指定した場合、マクロの解釈は、シート[内線番号表]のE1セルとなっていますね。 別件ではありますが、アドバイスです。 >With Worksheets("内線番号表") >Sheets("内線番号表").Select では With の意味がありません。HELPをご覧下さい。

mami0810
質問者

お礼

お礼が遅くなって申し訳ありません。 何分勉強を始めたばかりで、基本的な事も分からず 聞いてしまってスミマセンでした…。 丁寧な解説、ありがとうございました。

noname#8445
noname#8445
回答No.3

#1の方がいいかも (・・;)ごめんなさい・・

noname#8445
noname#8445
回答No.2

すんませんエクセルが入って無くて穴だらけ そのまま拝借させてもらって Sheet1にボタンを作ります 右上の _□× あたりの灰色の場所で右クリック   「フォーム」を選びます セル上でドラッグして Sub 部署を表示() にリンクを張ります 以下マクロ Sub 部署を表示() on error goto errora: Worksheets("内線番号表").Sheets("内線番号表").Cells.Find(What:=Range("E1"), After:=Cells(1, 1), LookIn:=xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, MatchByte:=False, SearchFormat:=True).Activate exit sub errora: msgbox("データがありません。") end sub でどうでしょう E1は検索元です(要変更)

mami0810
質問者

お礼

お礼が遅くなって申し訳ありません。 マクロを試させて頂いたのですが、 「内線番号表」を選択していないと 「データがありません」となってしまいました…。 私のやり方が悪かったのでしょうか。 スミマセン。 回答、ありがとうございました。

noname#8445
noname#8445
回答No.1

そのまま拝借させてもらって Sheet1にボタンを作ります 右上の _□× あたりの灰色の場所で右クリック   「フォーム」を選びます セル上でドラッグして Sub 部署を表示() にリンクを張ります 以下マクロ on error goto errora: Worksheets("内線番号表").Cells.Find(What:=Range("E1"), After:=Cells(1, 1), LookIn:=xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, MatchByte:=False, SearchFormat:=True).Activate exit sub errora: msgbox("データがありません。") end sub でどうでしょう E1は検索元です(要変更)

関連するQ&A

  • コンボボックスから検索するVBA(エクセル)

    sheet1にメニュー画面 sheet2に一覧表を作成しました。 (1)sheet1でユーザーフォームを起動させる。 (2)ユーザーフォームにはコンボボックスを1つ、コマンドボタンを2個配置しました  (3)コンボボックスのプルダウンメニューはsheet2の一覧表より取得しました (4)sheet2の一覧表は今後データが増えていきます(データは4行目以降) という条件で以下のコードを作成しました。 (1)と(2)のコマンドボタンは正常に作動しています。 コンボボックスのコードのみ書いています。 Private Sub UserForm_Initialize() Dim i As Long With Worksheets("sheet2") For i = 4 To .Cells(Rows.Count, 3).End(xlUp).Row ComboBox1.AddItem Cells(i, 3).Value Next i End With End Sub このときプルダウンメニューを押しても空欄が表示されてしまいます。 できない理由が分かりません。よろしくお願いします。 また、Private Sub ComboBox1_Change()とは何が違うのでしょうか? 最近 VBAを始めた初心者です。よろしくお願いします。

  • VBAにて別シートに貼り付けたいのでができません

    今開いているファイル(A)内のシート(依頼)にVBAを以下の用に記述しました。 これをデスクトップにあるファイル(提出)内のシート(データ更新)に貼り付けたいのですが できません。 「インデックスが有効範囲にありません。」と表示されます。 どこが悪いか教えて下さい。 sub 取り込み( ) Sheets("依頼").Range(Cells(15, 2), Cells(30, 21)).Copy Workbooks.Open Filename:="C:\Documents and Settings\Administrator\デスクトップ \作業中\提出.xls" Sheets("データ更新").Select Range(Cells(15, 2), Cells(15,2)).Select     ActiveSheet.Paste Application.CutCopyMode = False End sub

  • 検索と置換 vba後、そのまま検索できない

    シートに 2014/1/1 が入力されていて VBAで Sub test() If Not Cells.Find(What:=CDate("2014/1/1"), MatchByte:=False) Is Nothing Then Debug.Print "2014/1/1はあります" End If End Sub を実行すると、"2014/1/1はあります"が返りますが このコードを実行し終わってから、ワークシート画面で検索と置換を開くと、 「1/1/2014」の状態で入っています。 そのまま検索ボタンを押しても、さっきはVBAでは"2014/1/1はあります" だったのに、手作業だと「ありません」になります。 どういうことなのでしょう?

  • ユーザーフォームで別シートを検索できますか

    現在エクセルのユーザーフォームを勉強中です。職員データとメモの二つのシートがあります。職員データシート上で職員コード番号で検索し検索画面を閉じるとデータを表示するユーザーフォームが表示されるように作成しました。ここまでは出来ました。これを、コード番号の検索でメモシートの職員番号も検索し該当する番号があれば行番号を取得(変数名:メモRow)無ければカーソルを最終行に移動。データ表示フォームに職員のデータとその職員のメモデータを表示するように、メモを書きたいときはメモ表示ボックスに記入。記入したデータをメモシートにも記入できるようにしたい。 出来ないこと (1)職員データシートの検索画面でメモシートを同時に検索したい (2)メモシートの行番号を変数に格納したい (3)該当番号がなければ最終行にカーソルを移動したい (4)職員データのフォームに記入したデータをメモシートに反映させたい わかる方どうぞ教えてください。 こんな風に作りました Private Sub 初期化_Click() Unload UserForm検索 UserForm検索.次へ.Enabled = False UserForm検索.Label1.Caption = "検索値を入れて検索ボタンを押してください。" UserForm検索.Show vbModeless End Sub Private Sub 検索_Click() Dim 検索値 As String '変数を宣言。 On Error GoTo errhandler 検索値 = TextBox1.Value If 検索値 = "" Then MsgBox "検索する語句を入れてください。" TextBox1.SetFocus 'TextBox1にカーソルを移動。 Else Cells.Find(What:=検索値, After:=ActiveCell, LookIn:=xlValues, LookAt:= _ xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:= _ False, MatchByte:=False).Activate 検索.Enabled = False 次へ.Enabled = True Label1.Caption = "次をさがすには「次へ」ボタンを押してください。" 'Label1のメッセージを変える。 errhandler: ' Select Case Err.Number Case 91 MsgBox "その検索値は存在しません。" End Select ' End If End Sub Private Sub 次へ_Click() Cells.FindNext(After:=ActiveCell).Activate End Sub Private Sub 閉じる_Click() Unload Me DATA.Show End Sub 以上検索画面 ※別シートの検索は可能ですか? 以下は表示画面(DATA) Option Explicit Private myRow As Long Private Sub btm検索_Click() Unload Me 'DATAフォームを非表示に。 UserForm検索.Show '検索フォームを表示 End Sub Private Sub btm前_Click() '前へボタン myRow = myRow - 1 GetData End Sub Private Sub btnCancel_Click() '終了を確認する If MsgBox("終了しますか?", vbYesNo, "確認") = vbYes Then Unload Me End If End Sub Private Sub btn次_Click() '次へボタン myRow = myRow + 1 GetData End Sub ※以下はデータ表示コマンドが続きます最後に Me.tab3資格1.Value = ActiveSheet.Cells(myRow, 111).Value Me.tab3資格2.Value = ActiveSheet.Cells(myRow, 114).Value Me.tab4メモ.Value = Worksheets("メモ").Cells(メモRow, 3).Value                              ↑                  表示できない、具体的に行数を入れると表示する! End Sub ※変数:メモRowをどこで宣言すれば?

  • VBAで作成したComboboxにVBAでマクロを割り当てたい。

    下記コードでcomboboxをつくったのですが 作成されたCombobox1のComboBox1_Changeエベントに 標準モジュール内のSub cal をVBAで割り当てたいのですが可能でしょうか。 コンボボックス作成マクロ x=0 y=0 With Worksheets("Sheet1").OLEObjects.Add(ClassType:="Forms.ComboBox.1", Link:=False, DisplayAsIcon:=False) .Left = X .Top = Y .Width = 53.25 .HEIGHT = 18 .ListFillRange = "AAA" End With これで作成したコンボボックスに標準モジュール内マクロをVBAで割りあてしたい。 標準モジュール sub cal ・ ・ end sub

  • エクセルVBAで検索してシートへ貼り付け。

    どうも。 エクセルでVBAをやっています。 表に映画のデータベースのように打ち込んで VBAフォームでタイトルを検索して、ヒットした行を別シートに出力するというのがやりたいのですが、できないのです。 Private Sub CommandButton1_Click() '変数の宣言 strTitle = "" intEndIndex = 0 intTate = 1 intYoko = 1 With Workbooks("book1.xls").Sheets(1) strTitle = UserForm3("TextBox1") i = 1 Do Until .Cells(i, 1) = "" i = i + 1 Loop 'A1から下へ空白がでるまで検索する感じです。 intEndIndex = i - 1 Do Until intTate > intEndIndex If strTitle = "" Then Exit Do ElseIf InStr(1, .Cells(intTate, intYoko), strTitle) > 0 Then End If intTate = intTate + 1 Loop End With End Sub 検索することはできるのですが、 ヒットした行(タイトルや監督や制作年、出演者などが表に書いてある)を別シートに貼り付ける方を教えてください。 よろしくお願いします。

  • エクセルVBA 別シートからのコンボボックス連動

    エクセルVBA 別シートからのコンボボックス連動について Book1(多人数入力用ブック) ・入力シート ・データ用シート Book2(反映用ブック) ・シート1 Book1にコンボボックスが2列 テキストボックスが2列 * 6行のユーザーフォームを作成しました。 コンボボックス1 コンボボックス2 テキストボックス1 テキストボックス2 コンボボックス3 コンボボックス4 テキストボックス3 テキストボックス4 ・ ・ ・ 左のコンボボックスで「あ」が選ばれたときには、右のコンボボックスで「あ行の顧客」・・・というように連動させたいと考えております。 データ用シートのデータは、   A      B          C 1 あ あ行で始まる顧客 か行で始まる顧客 2 か 3 さ 4 た 5 な 6 Private Sub UserForm_Initialize() Dim c As Range ComboBox1.RowSource = "データ用シート!A1:A9" End Sub Private Sub ComboBox1_Change() 'Dim Rng As Range 'Dim i As Long i = ComboBox1.ListIndex If i > -1 Then Dim c As Range Set Sh = Worksheets("データ用シート") Set Rng = Worksheets("データ用シート").Range("B2:I30") ComboBox2.Value = "" ComboBox2.RowSource = Rng.Columns(i + 1).Address End If End Sub 上記コードですと、コンボボックス2が入力シートのデータを表示してしまいうまくいきません。 欲をいえば、 Book1(多人数入力用ブック)入力シートの特定セルに コンボボックス2・テキストボックス1 コンボボックス4・テキストボックス3というように続けて1セルに反映 Book2(反映用ブック)シート1に コンボボックス2・テキストボックス1・テキストボックス2 を各1セル 1行に反映させたいと考えております。 まったく知識がないのですが 仕事上どうしても必要となったので、各種サイトを見よう見真似でやっております。 ご助力いただければ幸いです。

  • エクセルVBAで検索

    エクセルのVBAで文字の検索をしたいと思います エクセルは2000です エクセルのマクロの記録機能を利用して 下記のようなマクロを作成しましたが これでは、別のシートの文字が検索できません 同一ブックの別のシートも検索できるようにするには どうしたら良いでしょうか、よろしくお願いします 以下同一シートしか検索しない例 Sub Macro1() Dim 検索文字 As String 検索文字 = InputBox("検索文字を入力してください") Cells.Find(What:=検索文字, After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _ xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False) _ .Activate End Sub

  • エクセル2003 別シートの項目を集計したいVBA

    仕事でエクセル2003を使っています。 超初心者なので、うまく説明ができませんがお許しください。 Sheet1に、印刷シートとして「名前」「フリガナ」「住所」「電話番号」「性別」などのデータを入力しています。 これを1回ずつデータを入力して印刷をしています。 印刷をするときに、入力したデータをリストにするためにSheet2へコピーするというマクロを作りました。 ↓こんな風に作ってみました。 Sub 正方形長方形2_Click() Call macro01 Call macro02 End Sub Sub macro01() Dim ws1 As Worksheet, ws2 As Worksheet Dim x As Long, y As Long Set ws1 = Sheets("Sheet1") Set ws2 = Sheets("Sheet3") x = ws2.Cells(Rows.Count, "b").End(xlUp).Row + 1 y = ws1.Cells(Rows.Count, "b").End(xlUp).Row ws1.Cells(21, "g").Resize(y, 9).Copy ws2.Cells(x, "b").PasteSpecial Paste:=xlPasteValues Application.CutCopyMode = False End Sub Sub macro02() Worksheets("Sheet1").PrintOut End Sub ここから本題なのですが… ふと、リストの件数をSheet1に出せないものか?と思ったのです。 マクロを実行することで、Sheet2にデータが増えてその増えたデータの項目の合計件数をSheet1に反映させて印刷する。 「別シートの項目を集計する」で検索してみたのですが、私には難しすぎて理解できずいろんな方の回答をもアレンジできません。 なにとぞ、ご教授いただきますようお願いします。

  • 【エクセルVBA】特定のシートのみ検索したい

    VBA勉強中です。 フォルダにある複数のファイル(1ファイル内には複数シートあります)を順番に開けて検索をかけ、条件に合致した行をあるファイルへ転記・集約させるマクロを組みたいと思っています。 (条件は1番左の列が「○」であることです。) ネットや本を参考にしながら組んでみたのですが、「○」がない(シートの)行も転記されてしまい困っています。 (○があるシートは複数シートの内、1シートのみなのですが、○がないシートからも 「○があるシートの○がある行」と同じ行番号の行がが転記されているようです) 組んでみたマクロは以下のとおりです。 ------------------------------------------------ Sub 楕円1_Click() ActiveSheet.Range("A2:H30").ClearContents Dim ans, fn, wb, x, i, n, sh, myPath ans = "○" '条件 myPath = ThisWorkbook.Path & "\" fn = Dir(myPath & "*.xls") '選択したフォルダ内のExcelファイル Do Until fn = "" If fn <> ThisWorkbook.Name Then 'ファイルが当ファイル以外なら Set wb = Workbooks.Open(myPath & fn) '選択したファイルを開きます For Each sh In wb.Worksheets '各シートごとに x = sh.Cells(Rows.Count, 1).End(xlUp).Row '最終行取得 For i = 1 To x '1行目から最終行まで以下を実行します If Cells(i, 1) = ans Then '条件に合致するか検索 n = n + 1 With ThisWorkbook.Sheets("Sheet1") '転記 .Cells(n + 1, 1) = sh.Cells(i, "B") .Cells(n + 1, 2) = sh.Cells(i, "C") .Cells(n + 1, 3) = sh.Cells(i, "D") .Cells(n + 1, 4) = sh.Cells(i, "E") .Cells(n + 1, 5) = sh.Cells(i, "F") End With End If Next i Next sh wb.Close (False) '選択したファイルを閉じる End If fn = Dir() '次のファイルを検索 Set wb = Nothing Loop '繰り返し --------------------------------------------------------- このマクロでは各ファイルの全てのシートを検索していると思うのですが、 全シートを検索していることが問題でしょうか? 検索したいデータは特定のシートにのみ存在するので(全ファイル同じ名前のシートです) 特定のシートのみ検索してくれればそれで良いのですがどう変更すればよいかわかりません。 「For Each sh In wb.Worksheets '各シートごとに」 色々と調べてここを変更してみたのですが 何れもエラーとなり上手くいきませんでした。 どなたか上手く直す方法を教えて下さい。 宜しくお願いします。

専門家に質問してみよう