• 締切済み

エクセルVBAでデータ検索(Win2000,Excel2000)

エクセルで毎日の業務で手計算している作業をVBAコードかいて試しているのですが、縦と横の検索で行き詰まってしまい質問しました。どうぞよろしくお願いします。 _A__B____C____D__E__F___G___H 1| 2|_______その他_1~3_4~6_7~10_11~20_21~30 3| 3|__項目A___ 0___50__49__46___43__40 4|__項目B___ 0___45__44__39___37__34 5|__項目C___ 0___43__42__34___30__ 28 行 *このデータは現在(B3:V42)にあり今後増える可能性あり *1行目とA列は空白です。 *2行目とB列は対応する項目です。 *3行目は関係ない値が入っています(データをつくる為の値) このようなデータが、"Sheet2"にあると仮定します "Sheet1"のシート上に配置したComboBox(コントロールツールボックスの)に検索値があります。 (ComboBox1 → 数値 , ComboBox2 → 数値 , ComboBox3 → 文字)*リストは"Sheet1"に登録してあります。 TextBox1 ÷ 2 の結果を小数点以下切上げし、これにTextBox2の値をかけたもの(仮にAAAとする)が、2列目のそれぞれのセルの数値範囲に対応し、TextBox3の文字列がB列に対応し、両検索結果の交わったセルの値を返すようにしたい。 例)もしAAAが「8」なら「F列」をみる。TextBox3 の文字列が「項目B」なら「4行目」をみる。この結果、交わったセルは「F4」なので、「F4」にある値「39」を"Sheet1"."A1"に返す。 また、これらコンボボックス(このシートとは別にテキストボックスを使うこともある)にはひとつずつchangeイベントでいきなり別シート("Sheet3")に書くコードが既に書いてあります。このセルから取り出すことも可能です。よろしくお願いします。

みんなの回答

  • popesyu
  • ベストアンサー率36% (1782/4883)
回答No.2

よく伝わってなかったようですが。 もしどうしてもシート上の表示を 2|__その他_1~3_4~6_7~10_11~20_21~30 としたいのであれば、 C列の最大値は3、D列の最大値は6とわざわざ抜き出すコードを追加しなければならないので、最初から最大値の3、6、10...だけの表示にしておけばという意味なんですよ。この表の横軸って連続値なんですよね?? ※例えば1~5、8~10(6,7が無い)ではないですよね? であれば最大値だけの表示でも意味は通じますし。わざわざコード上で列を登録しなくても表の値がそのまま利用できますし。 ということで 下記見本コードですと 2|__その他____3_6_10_20_30.... と書いておくことで 例えば「25」というような値が検索値であれば30の値が入っているセルの列数を引いてくるんですが。 正確に書くなら「最初に対象値>=検索値になった列数」です。この場合は30>=25が初めて条件成立したセルですのでそこの列数をとります。

rurucom
質問者

補足

popesyuさん!ありがとうございます。理解しました。2|__その他____3_6_10_20_30.... としました。 で、早速試してみました。 1)TextBoxにコードを書いた為、TextBoxに入力中に実行されてしまいます。これは、とりあえずボタンを作ってこれで実行させました。できたら、最後のBoxが入力された時点で実行させたいです。 2)実行した結果、どの値を入れても「その他」を返してきます。その他を「0」にしたらその該当するセルの列数ではなく、該当するセルの値が返ってきました。(AAAが15なら20) 現在このように書いてます。 Private Sub CommandButton1_Click() Worksheets("Sheet2").Activate AAA = TextBox1 / 2 MsgBox AAA For Each c In ActiveSheet.Range("C2:V2") If c.Value >= AAA Then よこ = c.Column Exit For End If Next c MsgBox c Worksheets("Sheet1").Activate End Sub 3)実際には、Sheet1でいろんな項目を書き込んでいくのでActivateSheetではなく動いてほしいのですが・・・これはしょうがないですよね。 4)たて = ActiveSheet.Columns(1).Find(TextBox3).Row はすみません!理解できませんでした。 とりあえず書いてみたんですが、実行時エラー'91':オブジェクト変数またはWithブロック変数が設定されていません。といわれました。 お手数ですが、宜しくお願い致します。

  • popesyu
  • ベストアンサー率36% (1782/4883)
回答No.1

たて列の検索はFind関数ですぐに出てくるでしょう たて = ActiveSheet.Columns(1).Find(TextBox3).Row 横は・・・1~3_4~6_7~10_11~20_21~30 と表示するなら文字列になってしまうので、 そこから比較対象の値を無理やり抜き出しても良いのですが、 3_6_10_20_30 のように数字で表示した方が楽で良いかなと。 後はその範囲でループさせて一つ一つ値をチェックしていくとか。 For Each c In ActiveSheet.Range("C2:H2") If c.Value >= AAA Then よこ = c.Column Exit For End If Next c

rurucom
質問者

補足

説明が足りませんでした。 1~3_4~6_7~10_11~20_21~30については、検索値が1~3の間ならD列を4~6の間ならE列を・・・というようにしたいので、予めCaseなどで値に対応する列を登録しておく必要があるのかなぁ・・・とも思っています。 また、この値は、1000まであり、1列づつ値にしてしまうと1000列書かないといけなくなります。後のメンテの大変なので・・・ できたら、検索値がxなら何列をみて!と指示を出したいと思っているのですが、あまりVBAも詳しい方では無いのでこのあたりで苦戦をしております。

関連するQ&A

  • VBAで条件が2つある場合の転記について

    現在Book1.xlsmでユーザーフォームを作成しています。 ここにComboBox7(日付)、ComboBox8(項目)、TextBox11(数値)を配置しています。コンボボックス やテキストボックスに入力があるとBook1.xlsmのSheet1にそれぞれComboBox7はA2、ComboBox8はB1、TextBox11はB2に入力されるようになっています。 ここで、B2の数値を別なブックBook2.xlsxのSheet2に転記したいと考えております。 Book2.xlsxのSheet2では、A列に日付、B1~AZ1に項目が入っています。 Book1.xlsmのSheet1のA2と同じ日付、B1と同じ項目が交差するところにB2の数値を転記したい場合はどのようにしたら良いのか教えていただけませんでしょうか?

  • EXCEL VBAについての質問です

    質問させてください。 添付した画像のような表にて在庫の管理をしたいと考えています。 VBAのフォームを使用し、テキストボックスに入出庫の数値を入れ、 入庫、出庫のボタンを押し、在庫の数値を増減させたいと思っています。 下に書かせていただいたような流れでできないものかと思ったのですが、 3行目と4行目のプログラムがうまく動作させられません。 offsetを使用し、セルをずらすことができるかと思いましたが エラーが出てしまい実行することができませんでした。 どなたか方法をご存知の方がいましたら回答よろしくお願いします。 また、もっとベターな方法がありましたらアドバイスをよろしくお願いします。 Private Sub CommandButton1_Click() '「a」という単精度浮動小数点数型 の変数を宣言する. Dim a As Single 'ワークシート「Sheet1」をアクティブにする. Worksheets("Sheet1").Activate 'textbox1の内容を変数aに入れる. a = TextBox1.Value1 'Comboboxで選択したセルの4つ右隣のセルの値を(A32)に記入する Worksheets("Sheet1").Range("A32") = ComboBox1.Offset(4,0).Value 'セル(A32)と変数aを足し、その値をComboboxで選択したセルの4つ右隣のセルに記入する 'Worksheets("Sheet1").ComboBox1.Offset(4,0).Value = a + ComboBox1.Offset(4,0).Value End Sub

  • Excel ユーザーフォームでコンボボックスを使用してデータ入力

    Excelのユーザーフォームでコンボボックスを使用して、シートのデータを表示しています。 コンボボックス:ComboBox1 テキストボックス1-3:TextBox1-3 コンボボックスのRowSource:シート名!A2:C100 コンボボックスの変更時の動作: Me!TextBox1.Value = ComboBox1.Value とここまではできたんですが、テキストボックス2にシートのB列の値を、テキストボックス3にシートのC列の値を入れたいのですが、 どのようにしたらいいのでしょうか?

  • VBAで最終行の取得について

    UserFormのConboBoxで「○○」を選んで、 UserFormのTextBoxで『あいう』と入力すると、ワークシートに A      B 1 ○○   ×× 2 あいう と表示され、 UserFormのConboBoxで「××」を選んで、 UserFormのTextBoxで『アイウ』と入力すると A      B 1 ○○   ×× 2 あいう  アイウ 3 :    : と表示されるようにしたいと思います。 以下のプログラムまではできています。 ********************************************* Private Sub UserForm_Initialize()  Dim lasClm As Integer, i As Integer  lasClm = Sheet1.Range("A1").End(xlToRight).Column   For i = 1 To lasClm   ComboBox1.AddItem Sheet1.Cells(1, i).Value   Next i End Sub ********************************************* Private Sub CommandButton1_Click()  Select Case ComboBox1.Text  Case Sheet1.Cells(1, 1).Value '「○○」が選択  Sheet1.Cells(2, 1).Value = TextBox1.Text ・・・(1)  Case Sheet1.Cells(1, 2).Value '「××」が選択  Sheet1.Cells(2, 2).Value = TextBox1.Text ・・・(2)  End Select  UserForm1.Hide End Sub ********************************************** 今は(1)、(2)のように直接セルを指定しているのですが、 この部分を各列(A列、B列)の最終行の値を取得して、 最終行+1のセルに順次TextBoxに入力された値を代入していきたいのですが、 どのようにしたらよいのでしょうか。 しかし、A列とB列は同じように値が増えていくとは限りません。 例)    A     B 1 ○○   ×× 2 あいう  アイウ 3 かきく 4 さしす となる場合もあるので、A列とB列それぞれの最終行の値を取得したいと思っています。

  • エクセル関数を使って検索したいです。

    やりたいことは以下の通りです。 Sheet1~Sheet15が存在します。Sheet2~Sheet15には3列で行がそれぞれ異なる表があります。例えばSheet1は5行3列、Sheet2は10行3列、Sheet4は30行3列のように。ちなみにこれらの表は行が追加されていきます。 Sheet1にも同様に3列の表があるのですが、Sheet1のB列(2行目)に、式を作りたいです。 どんな式かと言うと、Sheet1のA列(1行目)に値を入れると、それと同じ値を、Sheet2~Sheet15のA列(1行目)と同じものを探し、そのSheetのB列(2行目)の値を返すというようにしたいです。 VLOOKUPを使うといいかと思うのですが、Sheetを14個もまたいで検索したい時にIFで作るとエクセル2003なので入れ子が7個以上になってしまいうまくいきません。 ちなみに、Sheet1に入力する値はAAA1やBBB2の様にアルファベットと数字の組み合わせです。 よって、例えばSheet2のA列にはAAA1、AAA2、AAA3、AAA4の様に、Sheet2のA列にはBBB1、BBB2、BBB3、BBB4の要に入力された状態になっています。 どなたかうまく切り抜ける方法を教えてください。

  • エクセルVBAのコードの書き方を教えてください

    エクセルVBAの初心者です。 下記①-⑲のようなコードを書きたいのですが、どなたかお分かりになる方がいましたら、 ご教示いただけますと幸いです。 ① オートフィルターでシート[list]のA列に"●"がある特定の行だけを以下作業の対象にしたい ② ①で特定した行のE列セルの値を、シート[output]のB9セルにコピペする ③ ①で特定した行のF列セルの値を、シート[output]のB12セルにコピペする ④ ①で特定した行のG列セルの値を、シート[output]のB15セルにコピペする ⑤ ①で特定した行のH列セルの値を、シート[output]のB18セルにコピペする ⑥ ①で特定した行のI列セルの値を、シート[output]のB21セルにコピペする ⑦ ①で特定した行のJ列セルの値を、シート[output]のB24セルにコピペする ⑧ ①で特定した行のK列セルの値を、シート[output]のB27セルにコピペする ⑨ ①で特定した行のL列セルの値を、シート[output]のB30セルにコピペする ⑩ ①で特定した行のM列セルの値を、シート[output]のB33セルにコピペする ⑪ ①で特定した行のN列セルの値を、シート[output]のB36セルにコピペする ⑫ ①で特定した行のO列セルの値を、シート[output]のB39セルにコピペする ⑬ ①で特定した行のP列セルの値を、シート[output]のB42セルにコピペする ⑭ ①で特定した行のQ列セルの値を、シート[output]のB45セルにコピペする ⑮ ①で特定した行のR列セルの値を、シート[output]のB48セルにコピペする ⑯ ①で特定した行のS列セルの値を、シート[output]のB51セルにコピペする ⑰ ①で特定した行のT列セルの値を、シート[output]のB54セルにコピペする ⑱ ①で特定した行のU列セルの値を、シート[output]のB57セルにコピペする ⑲ シート[output]のB3:B59をテキストファイルを呼び出してコピペする ※このとき、上記②-⑱で記述したB9からB57のセルには改行が含まれる場合が  あるため、テキストファイルへのペースト時に""が表示されてしまうが、  もし可能であれば、この""が表示されないようにしたい。

  • vbaのclassモジュールを呼び出し

    現在フォームに書いてるcode ーーー ’シート1のB列250件くらい有る(名前)→コンボボックスに漢字1−2文字入れて表示件数を絞り込み→comboboxにリスト表示している。 ーーー ーーーーー Private Sub ComboBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) Dim i As Integer '押されたキーが、Enterキー以外は終了 If KeyCode <> vbKeyReturn Then Exit Sub 'テキスト部分が選択されている場合 If ComboBox1.ListIndex = -1 Then ComboBox1.Visible = False 'コンボボックスを非表示 ComboBox1.Visible = True 'コンボボックスを表示 ComboBox1.List = Array() 'コンボボックスのリストをクリア '値を部分一致で抽出 For i = 2 To Sheets("Sheet1").Cells(Rows.Count, "B").End(xlUp).Row If InStr(Sheets("Sheet1").Cells(i, "B"), ComboBox1.Text) > 0 Then 'コンボボックスのリストに追加 ComboBox1.AddItem Sheets("Sheet1").Cells(i, "B") End If Next End If KeyCode = 0 'コンボボックスをフォーカス ComboBox1.DropDown 'リストを表示 End Sub ーーーーー ーーー ’上記Combobox1で表示された内容の同行&別列で対応するセル内容をLabelに表示させたい、が「行 = 行 + 1」でエラー吐く。 ーーー ーーーーー Private Sub ComboBox1_Change() Dim 行 As Integer 行 = 1 Do 行 = 行 + 1 Loop Until ComboBox1.Text = Worksheets("Sheet1").Cells(行, 2) 'ComboBox1に表示されてる文字列が、B列の何行目に記載されてるか取得 FormMain.Label1.Caption = Worksheets("Sheet1").Cells(行, 1) 'B列に記載されてる文字列と同じ行にある、A列の文字を取得してTextBox1に表示 FormMain.Label2.Caption = Worksheets("Sheet1").Cells(行, 4) 'B列に記載されてる文字列と同じ行にある、D列の文字を取得してTextBox1に表示 End Sub ーーーーー 検索絞り込み・Labelに表示・最終行の取得(これはエラーなく動かせてる)は、Sheet2でも使うのでclassモジュールに書きたい+formでの呼び出しがうまく行かない。 インターネットで調べながら組み合わせたが自力解決出来なかったのでよろしくお願いします(Vbaの知識は無し)。 元データーは現在Accessで動いてますが、B列(名前250件くらい)ComboBoxで全件読み込みから目当ての名前1つを探し出す宝探し状態。 元データー制作は10年くらい前に業者発注した物(当時は250件を想定してなかったのだろう)→現在は連絡取れない方なのです。 Vba(ComboBox絞り込み)での作り直しを希望してます。

  • エクセル2007VBAで検索するコードを知りたい。

    エクセル2007(Excel2007)のVBAで【検索と置換】と同等の機能をもった検索アプリケーションを作りたいのですが、 そのコード(コマンドボタンを実行したときのコード)を教えていただけないでしょうか。 (おそらくですが、リストボックスのコードも必要だと思います。) 正しくは、【検索と置換】から【置換】機能を無くしたものとイメージしていただきたいです。 ●設置するもの ユーザーフォーム(UserForm1) テキストボックス(TextBox1) コマンドボタン(CommandButton1) リストボックス(ListBox1) ●仕様 ユーザーフォームのテキストボックスに入力してコマンドボタンを押すと、検索対象を見つけ、 リストボックスにその対象一覧を行ごとに表示するものになります。 ●検索するときの条件 (1)大文字と小文字を区別しない (2)半角と全角を区別しない (3)部分一致すれば(一部でも一致すれば)検索対象にする (4)今、開いているワークシート上の「全てのセルが検索対象(列や行を指定しない)」 ※検索されたセルの存在する行ごとに、ユーザーフォームのリストボックスに(1行ずつ)表示したいです。 そして、リストボックスに表示されたデータのうち、どれか1つを選ぶと、その選択対象の行の【D列】にアクティブセルを移動するようにしたいです(画面もアクティブセルが見える位置にスクロールします)。 ●リストボックスに(1行ごとに)表示するもの● ↓↓↓ (左から)I列の値、D列の値、O列の値、Q列の値(→4列の値になります) ※リストボックスにQ列の値が表示された場合のみ(Q列に何かしらのデータがある場合のみ)、 リストボックス上の【その行の(I列の値、D列の値、O列の値、Q列の値の)文字すべてを赤色】にして表示していただきたいです。 分かる方がいましたらよろしくお願いいたします。

  • エクセルVBAについて質問です。

    エクセルVBAについて質問です。 シート1のユーザーフォームにコンボボックスとテキストボックスが各1つずつ、 シート2のA列には1行目から順に「あ」「い」「う」と文字が入っていて、B列には「1」「2」「3」と値が入っています。 コンボボックスのリストにはシート2のA列の文字が選択できる状態にあります。 この状態で、例えばコンボボックスで「い」を選んだら、テキストボックスに自動的に「2」と入る、というように、コンボボックスのリストの中から任意の文字を選択したときに、テキストボックスにB列の値が入るようにするにはどのようにすればいいのでしょうか?よろしくお願いします。

  • excel VBA リストボックス複数選択後の処理

    どなたか教えてください。 Sheet1にユーザーフォームを使用しデータを入力しています。 リストボックスが複数選択した後にコマンドボタンをクリックした際、 選択項目を1行のセル[Cells(myRow, 16)~Cells(myRow, 20)]に左詰めで表示したい場合はどのようにするのでしょうか? 例:リストボックスには10項目あるとして、そのうち1行目、3行目、5行目だけが選択された場合のパターンで、1行目がCells(myRow, 16)、3行目がCells(myRow, 17)、5行目がCells(myRow, 18)に表示したいのですが・・・。 最大5項目選択とみています。 ※コマンドボタンは他のTextBox等も含まれ、下記のような感じです。 Private Sub CommandButton1_Click() Dim myRow As Long Sheets("Sheet1").Select myRow = Range("A65536").End(xlUp).Offset(1, 0).Row '各テキストボックの値をセルに入力 Cells(myRow, 1).Value = TextBox1.Value Cells(myRow, 2).Value = TextBox2.Value Cells(myRow, 3).Value = ComboBox1.Value Cells(myRow, 4).Value = TextBox3.Value Cells(myRow, 5).Value = TextBox4.Value . . . Cells(myRow, 16).Value = Cells(myRow, 17).Value = Cells(myRow, 18).Value = . . . 'セルに入力が各テキストボックの値をクリア TextBox3.Value = "" TextBox4.Value = "" ComboBox2.Value = "" ComboBox3.Value = "" 'フォーカスをTextBox3に移動 TextBox3.SetFocus End Sub

専門家に質問してみよう