• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VBAに詳しい方に質問です。)

VBA初心者のための一覧表から出力フォームへのデータ呼び出しVBAについての質問

このQ&Aのポイント
  • VBA初心者の方への質問です。エクセルで入力したデータを一覧表に転記し、出力フォームにデータを呼び出し印刷するプログラムを作成しています。一覧表から出力フォームにデータを呼び出すVBAについて教えていただけないでしょうか。
  • シート2にはこれまでに入力したデータが一覧表として存在しており、シート3の出力セルに日付を入力すると、その日付を基準に一覧表から該当するデータを出力するプログラムを作りたいです。どのようなVBAのコードを書けば良いでしょうか。
  • VBAに詳しい方、上記の要件を満たすためのVBAコードの書き方についてアドバイスをいただけないでしょうか。初心者のため、具体的なサンプルコードや手順を教えていただけると助かります。

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

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

>前回の質問の続きなのですが、 複アカ使っているのですか?複アカはマズいですし、それに、前の質問の続きとは思わないです。 #1のベテランのimogasi氏の回答で標準的な回答です。本来、言葉だけで、VBAを組み立てれればよいのですが、なかなか、ここの質問者はそうはいきません。 ここでは掲示板のVBAの回答としては、ひとつの質問で、せいぜいパターンとしては2~3種類程度しかありません。後は、味付け方法が違うだけです。私は、自分の発言するスレは、他人の回答も、かならずチェックしています。めったに新しいパターンは見られません。後は、想定するエラー処理だけです。 '//シートモジュール Private Sub CommandButton1_Click()  Dim Sh2 As Worksheet  Dim myDate As Variant  Dim rng As Range  Set Sh2 = Worksheets("Sheet2")  myDate = Range("A1").Value  If IsDate(myDate) = False Then MsgBox "検索値は日付ではないです。", 48: Exit Sub  Range("A3", Cells(Rows.Count, 1).End(xlDown)).Resize(, 3).ClearContents  Application.ScreenUpdating = False  With Sh2.Range("A1").CurrentRegion  If WorksheetFunction.CountIf(.Columns(1), CLng(myDate)) = 0 Then MsgBox "該当日付がありません。",48: Exit Sub   If Sh2.AutoFilterMode Then    .AutoFilter   End If   .AutoFilter Field:=1, Criteria1:=CDate(myDate)   Set rng = Sh2.AutoFilter.Range   rng.Offset(, 1).Resize(, 3).Copy Worksheets("Sheet3").Range("A3")   .AutoFilter  End With  Application.ScreenUpdating = True  Set Sh2 = Nothing End Sub

すると、全ての回答が全文表示されます。

その他の回答 (9)

  • layy
  • ベストアンサー率23% (292/1222)
回答No.9

officeカテゴリで 「エクセルのマクロについて困っています。2」2010/05/21頃 5910394番 今回と同じような要件になっていますから、 ここでどういう議題があったか、参考に。 エクセルで良く使うリンク3つを提供します。 「エクセルでお仕事」 「すぐに役立つエクセルVBAマクロ集」 「ExcelVBAへの道」

すると、全ての回答が全文表示されます。
  • layy
  • ベストアンサー率23% (292/1222)
回答No.8

なんか、事の進め方に疑問あります。 >このようなVBAを作り出す場合、どのような文を書いたらよいのでしょうか。 >早くimogasiさんの書かれたコードをまず理解できるように頑張ろうと思います。 >明日会社でさっそく試してみようと思います。 そうでしょうか?。 提示されたコードをそのまま使って結果がOKならOKでしょうか?。 まず、コマンド、文、を書けなくても 「どういうロジックを組立て(=プログラミング)たら実現するか」であって、 コーディングの前にプログラミング(設計)、です。 VBAでどういうことしたらいいのか?、 VBAでどういうことができるのか、をまず把握することでは?。 コードなんて人それぞれですし、みんなオリジナル、解答例ですから 10人が10パターンで、どれも同じ結果になるというのもありえます。 また、完全に質問者様と同じ環境でないと同じ動きは保障できないです。NO3の勘違いもその1つ。 厳密にいうと、10パターンとも動作確認する必要はないと思ってます・・・。 質問する→提示してもらったコードをそのまま使う →うまくいかない箇所が見つかる→回答者へ聞く、また質問する の繰り返しになりませんか?。なんか無駄です。 その仕組みを組み込んで保守するのは質問者様自身であり、 ここの回答者でないのでそこは十分理解してほしいですね。 ----------------- 「指しているセルをA2からA3、A4、・・・と移動させ内容取得するにはどうしたらいいか」 「セルがA2を指しているとき、そのままでB2やC2の内容を取得するにはどうしたらいいか」 「ボタンを押したとき、シート2の内容についてシート3へ列挙するにはどうしたらいいか」 「入力した値と一致かどうかはどう判断したらよいか」 「結合セルはどうしたら良いか」 こういう各機能ごとに絞って使うコマンドや関数、ロジックは何?、から考えたらと思います。 VBAにするうえで、どの機能が一番困っているのでしょうか?。 同じような仕組みを求めている過去質問も探してみましたか?。 期限が迫ってどうにもならない作業を任されているという事情があるかもしれませんが・・・。 学習する時間があれば、1つずつクリアしてじっくりやって欲しいですね。

すると、全ての回答が全文表示されます。
  • mar00
  • ベストアンサー率36% (158/430)
回答No.7

たびたびすいません。ANo.2です。 シート2は4列目までしかないと勘違いしていました。 ANo.2とANo.5の回答は無視して下さい。

すると、全ての回答が全文表示されます。
  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.6

No.3・4です! たびたびごめんなさい。 前回のお詫びと言っては失礼ですが、 もう一度やってみました。 Sheet2にSheet1のデータを表示させるようにしています。 Sheet2にコマンドボタンを作成し、↓のコードをコピー&ペーストしてみてください。 Private Sub CommandButton1_Click() Dim i, j As Long Dim 入力, 一覧 As Worksheet Set 入力 = Worksheets("sheet1") Set 一覧 = Worksheets("sheet2") For i = 2 To 入力.Cells(Rows.Count, 1).End(xlUp).Row j = 一覧.Cells(Rows.Count, 1).End(xlUp).Row + 1 Cells(j, 1) = 一覧.Cells(Rows.Count, 1).End(xlUp).Offset(1) If 入力.Cells(i, 1) = 一覧.Cells(1, 1) Then Cells(j, 1) = 入力.Cells(i, 2) Cells(j, 2) = 入力.Cells(i, 3) Cells(j, 3) = 入力.Cells(i, 4) End If Next End Sub 以上、お役にたてば良いのですが 今回も外していたらごめんなさいね。m(__)m

すると、全ての回答が全文表示されます。
  • mar00
  • ベストアンサー率36% (158/430)
回答No.5

ANo.2です。 セルの結合をしているという事なので Range(Cells(i, 2), Cells(i, 4)).Copy Sheets("Sheet3").Select GYOU = Cells(Rows.Count, 1).End(xlUp).Row + 1 Cells(GYOU, 1).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.CutCopyMode = False の部分を NAMAE = Cells(i, 2) JYUSYO = Cells(i, 3) DENWA = Cells(i, 4) Sheets("Sheet3").Select GYOU = Cells(Rows.Count, 1).End(xlUp).Row + 1 Cells(GYOU, 1) = NAMAE   1を入れたいせるの列番号に変える Cells(GYOU, 2) = JYUSYO   2を入れたいせるの列番号に変える Cells(GYOU, 3) = DENWA   3を入れたいせるの列番号に変える に変えて下さい。 Cells(GYOU, 1~3)の数字の部分を入れたいセルの列番号に変えて下さい。 例えば C列とD列のセルを結合しているのであれば、結合している一番前の セルの列番号C列の3にすればOKです。

すると、全ての回答が全文表示されます。
  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.4

No.3です! 大きく勘違いしていました。 前回の方法は無視してください。 どうも失礼しました。m(__)m

すると、全ての回答が全文表示されます。
  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.3

こんばんは! 単純にやってみました。 Sheet2(一覧)に表示させた後に、Sheet1(入力)のデータは消去するようにしています。 Sheet1は必ず2行目から入力し、入力し終わってからマクロを実行するとしています。 一例です。 Sub test() Dim i, j As Long Dim 入力, 一覧 As Worksheet Set 入力 = Worksheets("sheet1") Set 一覧 = Worksheets("sheet2") For i = 2 To 入力.Cells(Rows.Count, 1).End(xlUp).Row For j = 1 To 入力.Cells(i, Columns.Count).End(xlToLeft).Column 一覧.Cells(Rows.Count, 1).End(xlUp).Offset(1).Select Selection = 入力.Cells(i, 1) Selection.NumberFormatLocal = "yyyy/mm/dd" With Selection .Offset(, 1) = 入力.Cells(i, 2) .Offset(, 2) = 入力.Cells(i, 3) .Offset(, 3) = 入力.Cells(i, 4) End With 入力.Cells(i, j).Clear Next j Next i End Sub こんな感じではどうでしょうか? 参考になれば良いのですが 外していたらごめんなさいね。m(__)m

mineko619
質問者

お礼

ありがとうございます。 コードがとてもわかりやすくなっていて助かります^^ まだ実際のエクセルで試していないのでどうなるかはわかりませんが、 参考にしていきたいとおもいます。

すると、全ての回答が全文表示されます。
  • mar00
  • ベストアンサー率36% (158/430)
回答No.2

VBAに詳しい方ではないですが、作ってみました。 シート3 出力.cells(1,1)に日付を入力しボタンを押すとを 前提にしてます。 Sub Macro1() INPDATE = Range("A1") Application.ScreenUpdating = False Sheets("Sheet2").Select For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row Sheets("Sheet2").Select If Cells(i, 1) = INPDATE Then Range(Cells(i, 2), Cells(i, 4)).Copy Sheets("Sheet3").Select GYOU = Cells(Rows.Count, 1).End(xlUp).Row + 1 Cells(GYOU, 1).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.CutCopyMode = False End If Next i Application.ScreenUpdating = True End Sub

mineko619
質問者

お礼

ありがとうございます^^ 明日会社でさっそく試してみようと思います。 ただ、ひとつ気になったのがcopyなのですが… シート3の項目の中に枠幅合わせのために結合してしまったセルが含まれています。 シート2はそのまま結合されていないセルとなっているのですが、これは影響にでてしまいますか? できれば他の項目にも影響してしまうので、セルの形は崩したくはないのですが… もしわかれば教えていただけると嬉しいです。

すると、全ての回答が全文表示されます。
  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.1

こういうことを質問する前に、エクセルVBAは、エクセルの機能をコードで実行するものだから エクセルのどういう機能を使ってやればできるかまず勉強すべきです。コードテクニックばかりに拘らない。 ざっと考えて色んなやり方がある (1)セルを全行なめて、条件に該当するか聞いて処理するやり方 VB(6)的やり方 泥臭いが考えやすい。 (2)Filterの機能を使う (3)Find検索機能を使う (4)Msクエリをつかう (5)その他 こんなにあるのだ。 ーー ここではマクロの記録を修正する方法、初心者向けともいえる方法を示してみる。 エクセルをある程度知っていて、Filterを使い慣れている必要があろう。 このように>VBAに詳しい方、も良いが、エクセルをしっかり勉強しないとならない。 ーーー 例データ(質問には例データとしてこれぐらい多様性のある例を挙げるべし) Sheet1 日付 名前 年齢 電話番号 2010/6/28 山田太郎 33才 090-×× 2010/7/1 石川花子 12才 090-×× 2010/7/2 岡田君子 15才 090-×× 2010/6/28 上田太郎 33才 090-×× 2010/7/1 石岡川花子 12才 090-×× 2010/7/3 岡島田君子 15才 090-×× 2010/6/28 山下太郎 33才 090-×× 2010/7/4 石村花子 12才 090-×× 2010/7/1 岡田君子 15才 090-×× 2010/6/28 山上太郎 33才 090-×× 2010/8/1 石井花子 12才 090-×× 2010/7/1 岡辺君子 15才 090-×× これをデーターフィルターフィルタオプションの設定の操作をやって、マクロの記録を採る。 準備として F1:F2に 日付 2010/7/1 を指定しておく。 マクロの記録は Sub Macro2() Application.CutCopyMode = False Range("A1:D13").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range( _ "F1:F2"), CopyToRange:=Range("H1:K13"), Unique:=False End Sub ーーーーー これをSheet2に結果を出す A1セルに日付指定する(下記では見出しと内容が必要だが) ために改変すると Sub Macro1() Dim sh1, sh2 As Worksheet Set sh1 = Worksheets("Sheet1") Set sh2 = Worksheets("Sheet2") sh1.Range("A1:D13").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=sh2.Range( _ "A1:A2"), CopyToRange:=sh2.Range("A3:D15"), Unique:=False Range("G8").Select End Sub のように変える。実行すると Sheet2で 日付 2010/7/1 日付 名前 年齢 電話番号 2010/7/1 石川花子 12才 090-×× 2010/7/1 石岡川花子 12才 090-×× 2010/7/1 岡田君子 15才 090-×× 2010/7/1 岡辺君子 15才 090-×× のようになる。 ーーーーーーーーーーー 質問文について注意 >それを一覧表に転記 一覧表とはシート2のことか。表現を統一すること。 >最終的に出力フォームに フォームという言葉はエクセル(VBA)では、別の意味もある。表の様式とか表のレイアウトとか書いたほうが良い。 >最終的に出力フォームに こういう(上記のようなの)のは呼び出しとは言わない。フィルタや抜き出しや検索などというべきか。 >印刷する シートを印刷すればよかろう。マクロの記録でも採るべし。判っているなら質問事項に入れない。 >出力.cells(1,1)に日付を入力しボタンを押すと、 このためにはコマンドボタンをシートに設け、クリックイベントに上記マクロを記述するか 、1行でMacro1と書けば良い。

mineko619
質問者

お礼

解答ありがとうございます。 まだまだ勉強途中なもので申し訳ありません。 正直私にはまだ高度そうな感じであやふやですが、 早くimogasiさんの書かれたコードをまず理解できるように頑張ろうと思います。

すると、全ての回答が全文表示されます。

専門家に質問してみよう