EXCEL VBAで行・列の該当データを抽出する方法

このQ&Aのポイント
  • EXCEL VBAを使用して、出荷データ一覧のマクロを作成し、特定の商品名と対応するデータを抽出する方法を知りたいです。
  • データシートには商品名がA2から下方向に、日付がB1から右方向に入力されています。商品の有無によって出荷日がランダムになるため、黄色に塗りつぶされたセルの数値と該当する商品名を抽出したいです。
  • 現在は特定の数値以外を削除してマクロを実行していますが、新しい方法を考えています。
回答を見る
  • ベストアンサー

EXCEL VBAで行・列の該当データ

出荷データ一覧のマクロを作りたいのですが、抽出の仕方で苦戦してます。 A2から下方向に商品名、B1から右方向に日付の入ったシートのA3から任意のセル(変わります)に 数値のデータが入ってます。 商品の有無により出荷日は日付通りにいかずランダムになります。 例えば、数値データセルを任意で黄色に塗りつぶしたところの数値と該当する商品名を抽出するにはどうすればいいのでしょうか。 現在は以下のようなマクロを必要数値以外を削除して実行していますが、新しいものを思案中です。 Sub 行列を非表示() Rows("2:200").Hidden = True Columns("B:AO").Hidden = True Selection.SpecialCells(xlCellTypeConstants).EntireRow.Hidden = False Selection.SpecialCells(xlCellTypeConstants).EntireColumn.Hidden = False End Sub

  • ss696
  • お礼率94% (868/915)

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

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.2

>数値データセルを任意で黄色に塗りつぶしたところの数値と該当する商品名を抽出する ご利用のエクセルのバージョンが不明ですが、Excel2003以降で。 sub macro1()  dim c as range  dim c0 as string  with range("A1").currentregion  application.findformat.interior.colorindex = 6  set c = .find(what:="", searchformat:=true)  if c is nothing then exit sub  c0 = c.address  do   if c <> "" then    msgbox cells(c.row, "A") & vblf & c.value   end if   set c = .find(what:="",after:=c,searchformat:=true)  loop until c.address = c0  end with end sub あとはまぁ、実際にヤリタカッタ事に応じて適宜応用してみて下さい。

ss696
質問者

お礼

ありがとうございます。 以下のように変えて思い通りのマクロができました。 まだまだ稚拙ではありますが勉強いたします。 しかし、今回は勉強になりました。 ダブルクォーテーションのないMsgboxを初めてみましたしその他難解なものもありました。 本当にありがとうございました。 Sub macro1() Dim c As Range Dim c0 As String Dim G As Integer Dim R As Integer G = 1 R = 1 With Range("A1").CurrentRegion Application.FindFormat.Interior.ColorIndex = 6 Set c = .Find(what:="", searchformat:=True) If c Is Nothing Then Exit Sub c0 = c.Address Do If c <> "" Then D1 = Cells(c.Row, "A") D2 = c.Value With Worksheets(1) .Cells(G, 1) = D1 G = G + 1 .Cells(R, 2) = D2 R = R + 1 End With End If Set c = .Find(what:="", after:=c, searchformat:=True) Loop Until c.Address = c0 End With End Sub

その他の回答 (1)

  • kybo
  • ベストアンサー率53% (349/647)
回答No.1

元の表の範囲がよくわかりません。 >A2から下方向に商品名 なのに、「A3から任意のセル」というのはおかしくないですか 元の表の範囲がB2:Z1000だとして Sub macro() Dim C As Range For Each C In Range("B2:Z1000").SpecialCells(xlCellTypeConstants) C.Interior.ColorIndex = 6 MsgBox "数値は:" & C.Value & vbTab & "商品名は:" & Range("A" & C.Row).Value Next C End Sub

ss696
質問者

お礼

ありがとうございます。 A3はB2の間違いでした。申し訳ありません。 コードを実行してみましたが、数値の入ったセルを黄色に塗りつぶし、その塗りつぶしたセルに該当の商品名と数値を返すものでした。 説明が足りなかったのかもしれませんが、人間の手で任意で黄色に塗りつぶしたセルの数値と該当する 商品名を返す方法をお願いします。

関連するQ&A

  • 指定した範囲内が空白なら行削除するマクロ

    エクセルで指定した範囲内(A列からC列まで)で何も文字が入っていなければ(空白)、行を削除する、というマクロを教えてください。 いくつか調べて、以下を試しましたが、何も動作しませんでした。 どなたかアドバイスをいただければ助かります。 よろしくお願いします。 Sub DeleteBlankRows2() Application.ScreenUpdating = False On Error Resume Next With Columns("A:C") .SpecialCells(xlCellTypeConstants).EntireRow.Hidden = True .SpecialCells(xlCellTypeFormulas).EntireRow.Hidden = True .SpecialCells(xlCellTypeComments).EntireRow.Hidden = True .SpecialCells(xlCellTypeVisible).EntireRow.Delete .EntireRow.Hidden = False End With Application.ScreenUpdating = True End Sub

  • マクロで不要な行を削除したい

    エクセル97を使っています。  日付 名前 品目 ・・・  1 2 3 ・ ・ といった表で、日付は2003/2/13という表示になっています。 そこで、今日以前(今日は含まない)の日付の行を削除してしまいたいのですが どうすればいいでしょうか? ちなみに、空白行を削除するのに、 Application.ScreenUpdating = False On Error Resume Next With Columns("E:F") .SpecialCells(xlCellTypeConstants).EntireRow.Hidden >=TODAY() .SpecialCells(xlCellTypeFormulas).EntireRow.Hidden >=TODAY() .SpecialCells(xlCellTypeComments).EntireRow.Hidden >=TODAY() .SpecialCells(xlCellTypeVisible).EntireRow.Delete .EntireRow.Hidden = False End With このような記述を使っています。 「今日」というとTODAY()関数ですよね。 でも、関数ってマクロに組み込めるのでしょうか? しかも「今日以前」という記述はどうすればいいのか? など考えると、わけがわからなくなりました。 今日以前の行を削除するマクロを教えてください。 ちなみに、日付の行では、曜日を追記する関数を使っております。 条件書式も3パターン使い切っております。 よって、マクロで行いたいです。 宜しくお願いします。

  • エクセルシート:ボタン押下で特定列の表示←→非表示切り替え

    (行いたいこと) sheet1の中にコマンドボタン1があって、そのボタンが押されたとき既にC列からF列が非表示のときは表示してやり、また逆に表示のときは非表示にする。 (macroを作って実行したい) (現在の考えている状況) 後どうすればいいですか。今は何も動作しません。 今macro3というマクロの中に次のようなものが入っています。 Private Sub CommandButton1_Click() If Selection.EntireColumn.Hidden = True Then Columns("B:G").Select Range("G1").Activate Selection.EntireColumn.Hidden = False Else: Columns("C:F").Select Selection.EntireColumn.Hidden = True End Sub Sub Macro3() ' ' Macro3 Macro ' マクロ記録日 : 2006/3/24 ユーザー名 : ' Columns("C:F").Select Selection.EntireColumn.Hidden = True Columns("B:G").Select Range("G1").Activate Selection.EntireColumn.Hidden = False Range("B2").Select End Sub

  • エクセルVBA・空白セルのある列を非表示にするには?

    エクセルのVBAについてです! 表で上から2行目(G2:CX2)に空欄があった場合、その列を非表示にする、 というマクロを組みたくて、以下のように書いてみました。 一応、ちゃんと動くのですが、止まる(結果が出る)までにやたらと時間がかかり、これでは使えません。。 本を見ながら何となく書いたので、自身では詳しくわかりません。 どこ(何)がおかしくて、どう書き換えたらよいか、お分かりになる方、ぜひ教えてください! よろしくお願い致します。 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ Sub 空欄のある列を非表示にする() Dim cl As Range Range("G2:CX2").SpecialCells(xlCellTypeBlanks).Select For Each cl In Selection r = cl.Column 'MsgBox r Columns(r).EntireColumn.Hidden = True Next End Sub ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・

  • 13行目のセルの値が0のとき、その列を非表示にする

    Windows7 Excel2007でマクロ作成中の初心者です。 13行目のセルの値が、0のときは、その列を非表示にするというマクロを作ろうとしましたが なかなか難しくておてあげです。探したら次のようなコードがでてきました。 ボタンを押すとK列の値を参照して「A」と表示されている行を隠し、「表示する」ボタンを押すと、 解除するという処理。 Option Explicit Private Sub Cmd隠す_Click()  Dim 行番号 As Long  '行を隠す  For 行番号 = 4 To 13   If Cells(行番号, 11).Value = "A" Then    Cells(行番号, 1).EntireRow.Hidden = True   End If  Next 行番号 End Sub Private Sub Cmd表示する_Click()  '表全体を再表示する  Cells.Select  Selection.EntireRow.Hidden = False  Selection.EntireColumn.Hidden = False  Cells(1, 1).Select End Sub このコードを利用して、13行目のセルの値が、0のときは、その列を非表示にするというコードにしたいのです。 よろしくおねがいします。

  • エクセルのマクロで行選択

    現在、エクセルでマクロを組んでいます。 行いたい内容としては 1.行6~1765までを選択 2. 1.で選択した行を非表示 3. 行6~"セルH2の値"までをを選択 4. 3.で選択した行を再表示 3の段階で失敗してしまいます。 Rangeメソッドに失敗しました、と出ます ソースは以下のとおりです ----- Private Sub CommandButton2_Click() Dim x As Integer Range("6:1765").EntireRow.Select Selection.EntireRow.Hidden = True x = Range("H2").Value Range("6:x").EntireRow.Select Selection.EntireRow.Hidden = False End Sub ---- 解決法がわかる方、教えてください よろしくお願いします。

  • マクロ教えてください!コマンドボタンがどんどん大きくなっていきます・・・

    質問ですが、コマンドボタンを使ってマクロを動かしたいのですが、一回目押下すると正常に動くんですが、二回目以降コマンドボタンを押下すると、コマンドボタンの大きさ、ボタンの中の文字の大きさがどんどん大きくなっていきます。なぜですか?ちなみに自分なりにどこで大きくなるか調べたところ .SpecialCells(xlCellTypeVisible).EntireRow.Delete の後からその現象がおきます。教えてください。もっと詳しくロジック必要ならおっしゃってください。 Application.ScreenUpdating = False On Error Resume Next With Columns("F:G") '空白行F~Gの間(文字列が入っていない行)を削除 .SpecialCells(xlCellTypeConstants).EntireRow.Hidden = True .SpecialCells(xlCellTypeComments).EntireRow.Hidden = True .SpecialCells(xlCellTypeVisible).EntireRow.Delete .EntireRow.Hidden = False End With Application.ScreenUpdating = True

  • この場合エクセルVBAでどう書けばいいでしょうか?

    あるシートのH列で、H21からH46のあいだで"False"がある行を非表示にしたいのです。 下記の冗長なマクロでもそうなりますが、For Nextというのを使うともっと簡潔に記述できると思うのですが、初心者のためよくわかりません。ご教示ください。 また、下記の式はシートが保護されていると働きませんが、保護したシートでも動く方法があればそれもあわせて教えていただけると幸いです。 エクセルは95です。 Sub 空白行非表示() G% = Sheets("見積書").Range("H48").Value With Sheets("見積書") Rows("19:47").RowHeight = G% If Range("H21") = False Then Rows("21").EntireRow.Hidden = True End If If Range("H22") = False Then Rows("22").EntireRow.Hidden = True End If If Range("H23") = False Then Rows("23").EntireRow.Hidden = True End If If Range("H24") = False Then Rows("24").EntireRow.Hidden = True End If 途中、繰り返しのため省略 If Range("H42") = False Then Rows("42").EntireRow.Hidden = True End If If Range("H43") = False Then Rows("43").EntireRow.Hidden = True End If If Range("H44") = False Then Rows("44").EntireRow.Hidden = True End If If Range("H45") = False Then Rows("45").EntireRow.Hidden = True End If If Range("H46") = False Then Rows("46").EntireRow.Hidden = True End If End With End Sub

  • WORD VBA 繰り返し処理

    WORD VBAについて教えてください。 つぎのようなマクロがあり、これを検索する文字列がなくなるまで、繰り返して、処理するようにしたいのですが、どうすればよいのでしょうか? Sub Macro1() Selection.Find.ClearFormatting With Selection.Find .Text = "あ" .Replacement.Text = "" .Forward = True .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchByte = False .MatchAllWordForms = False .MatchSoundsLike = False .MatchWildcards = False .MatchFuzzy = True End With Selection.Find.Execute Selection.MoveRight Unit:=wdCharacter, Count:=1 End Sub

  • エクセル VBA 表示範囲の簡素化

    よろしくお願いします。 下記構文の簡素化ができないでしょうか。 CommandButtonが30個ほどあります。 ーーーーーーーーーー Private Sub CommandButton1_Click() Dim rng As Range Application.Goto Sheets("基本台紙").Range("A1") Set rng = Range("A1:D7") Rows.Hidden = True rng.EntireRow.Hidden = False Columns.Hidden = True rng.EntireColumn.Hidden = False rng(1).Select Unload Me UserForm1.Show vbModeless End Sub ーーーーーーーーーー Private Sub CommandButton2_Click() Dim rng As Range Application.Goto Sheets("基本台紙").Range("A1") Set rng = Range("A8:B21") Rows.Hidden = True rng.EntireRow.Hidden = False Columns.Hidden = True rng.EntireColumn.Hidden = False rng(1).Select Unload Me UserForm1.Show vbModeless End Sub ーーーーーーーーーー Private Sub CommandButton3_Click() Dim rng As Range Application.Goto Sheets("基本台紙").Range("A1") Set rng = Range("C8:D21") Rows.Hidden = True rng.EntireRow.Hidden = False Columns.Hidden = True rng.EntireColumn.Hidden = False rng(1).Select Unload Me UserForm1.Show vbModeless End Sub

専門家に質問してみよう