Excel VBAでユーザーフォームに開始日と終了日を入力し、該当するセルを別シートにコピーする方法

このQ&Aのポイント
  • Excel VBAを使用して、ユーザーフォームに開始日と終了日を入力し、該当するセルを別のシートにコピーする方法を教えてください。
  • 現在はメッセージボックスを使用して範囲を指定し、コピー&ペーストしていますが、ユーザーフォームで開始日と終了日を指定して、コピーしてSheet2に貼り付けたいと考えています。
  • 私の試みではうまくいきませんでした。Private Sub CommandButton1_Click()を使用しましたが、うまく動作しません。解決方法を教えてください。
回答を見る
  • ベストアンサー

EXCEL VBAで教えてください。 ユーザーフォームに開始日、終了日

EXCEL VBAで教えてください。 ユーザーフォームに開始日、終了日を入れ、コマンドボタンを押し、sheet1の開始日から終了日に該当するセルをコピーし、sheet2に貼り付けたいのですが、うまくいきません。 今は、メッセージボックスで範囲指定し、コピー&ペーストしているのですが、ユーザーフォームで開始日終了日を指定して、コピーしSheet2へ貼り付けたいのです。 -------------------- Sub 届() Dim myPath As String Dim myFName As String Dim ファイル名 As String Workbooks("処理.xls").Activate Range("B10:K80").Select Selection.ClearContents myPath = ActiveWorkbook.Path ChDir myPath myFName = Dir("m.txt") Dim データ形式 As Variant Dim 区切りタブ As Variant ファイル名 = "m.txt" データ形式 = xlDelimited 区切りタブ = True Workbooks.OpenText Filename:="m.txt", DataType:=xlDelimited, Tab:=True Selection.AutoFilter Selection.AutoFilter Field:=3, Criteria1:="<>" Columns("C:E").EntireColumn.AutoFit Range("C2").Sort key1:=Columns("C"), Order1:=xlAscending, Header:= _ xlGuess Worksheets.Add Worksheets("m").Select Dim moto As Range, saki As Range On Error Resume Next Set moto = Application.InputBox("どの範囲をコピーしますか?" & Chr(13) & "開始日、終了日を確認してください" & Chr(13) & "A列からE列まで選択してください", Type:=8) If moto Is Nothing Then Exit Sub If moto.Parent.Name <> "m" Then MsgBox "m から選択してください" Exit Sub End If Worksheets("Sheet1").Select Set saki = Application.InputBox("どこに貼り付けますか?" & Chr(13) & "A4", Type:=8).Cells(1, 1) If saki Is Nothing Then Exit Sub If saki.Parent.Name <> "Sheet1" Then MsgBox "Sheet1 から選択してください" Exit Sub End If On Error GoTo 0 moto.Copy saki ActiveWorkbook.SaveAs Filename:="届.xls", FileFormat:=xlWorkbookNormal MsgBox "対象者をコピーしました" End Sub ------------------ 下記でやってみたのですがうまくいきません。 Private Sub CommandButton1_Click() With Worksheets("sheet1") 開始日 = ">=" & TextBox1.Text 終了日 = "<=" & TextBox2.Text ActiveSheet.Range("A1:N200").AutoFilter , Field:=3, _ Criteria1:=開始日, Operator:=xlAnd, _ Criteria2:=終了日 Unload UserForm1 End With End Sub

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

  • ベストアンサー
  • hige_082
  • ベストアンサー率50% (379/747)
回答No.1

コードを拝見しましたが 無駄なコードと、意味のなさそうなコードが多く やりたいことが良く分からなかった 取り合えず、userformは これで問題無いと思いますが ただ、textboxの入力に注意が必要かも 対象の日付の入ったセルをクリックして 数式バーに表示される形式で入力しないと ヒットしないかもしれません Private Sub CommandButton1_Click() Dim 開始日, 終了日 With Worksheets("sheet1") 開始日 = ">=" & TextBox1.Text 終了日 = "<=" & TextBox2.Text .Range("A1:N200").AutoFilter .Range("A1:N200").AutoFilter Field:=3, _ Criteria1:=開始日, Operator:=xlAnd, _ Criteria2:=終了日 Unload UserForm1 End With End Sub あと、やりたいことを もう少し詳しく文章でも説明が欲しいです 参考まで

hatsume
質問者

お礼

回答ありがとうございます。ユーザーフォームで思ったようにできました。 ユーザーフォームに、開始日、終了日、コマンドボタンを作成し実行するのがまだうまくいきません。 開始日と終了日にyyyy/mm/ddと入れても、mm/ddと入れてもヒットしてしまうのですがうまくいきません。 もう少しやってみてまた質問させていただきます。

その他の回答 (1)

  • mimeu
  • ベストアンサー率49% (39/79)
回答No.2

意欲的に新しい機能を試しておられて、すばらしいですね。 セルが整数値ではなく日付のときの AutoFilter の使い方の問題ですが 私もよく知らないのですが (^-^; 試した結果では セルの表示と検索文字の表示をどちらも yyyy/mm/dd 形式 つまり 2010/5/11 ではなく、2010/05/10 とするとウマクいきました。 たぶんここで詰まったためにコピーするロジックまでは書いてありませんが http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_autofilter.html は良かったです。 また、AutoFilter した後は     WorkSheets("Sheet1").AutoFilterMode = False などとしておいた方がスマートかとおもいます。 余談ですが、 Excel の InputBox ってオモシロイ機能があるのですね~ (^-^) 参考になりました。

hatsume
質問者

お礼

回答ありがとうございます。

関連するQ&A

  • エクセルVBAについて

    VBAを勉強しているものです。 添付資料のようなグラフを作っております。 ############################################################### Sub 時間グラフ作成() Dim 開始 As Date Dim 終了 As Date Dim 開始経過時間 As Long, 終了経過時間 As Long Dim 開始目盛 As Long, 終了目盛 As Long 開始 = Worksheets("(1)(1)(1)(1)(1)").Range("F2").Value 開始経過時間 = DateDiff("n", CDate("9:00"), 開始) 開始目盛 = Int(開始経過時間 / 5) Worksheets("(2)(2)(2)(2)").Range("H2").Offset(, 開始目盛).Interior.ColorIndex = 8 If 開始 <= "11:00" And 終了 >= "12:00" Then 終了 = Worksheets("(1)(1)(1)(1)(1)").Range("G2").Value 終了経過時間 = DateDiff("n", CDate("9:00"), 終了) 終了目盛 = Int(終了経過時間 / 5) Worksheets("(2)(2)(2)(2)").Range("H2").Offset(, 終了目盛 - 12).Interior.ColorIndex = 8 Range(Range("H2").Offset(, 開始目盛), Range("H2").Offset(, 終了目盛 - 12)).Interior.ColorIndex = 8 Else 終了 = Worksheets("(1)(1)(1)(1)(1)").Range("G2").Value 終了経過時間 = DateDiff("n", CDate("9:00"), 終了) 終了目盛 = Int(終了経過時間 / 5) Worksheets("(2)(2)(2)(2)").Range("H2").Offset(, 終了目盛).Interior.ColorIndex = 8 Range(Range("H2").Offset(, 開始目盛), Range("H2").Offset(, 終了目盛)).Interior.ColorIndex = 8 End If End Sub ############################################################### 休憩時間のIfの処理がうまくいかなくて困っています・・・。 &とAndで変わったり(どちらもうまくいかず)、 ()をつけたりしても変わらず、そもそも根本的に 間違っているのか・・・。 よろしくお願いいたします。 (グラフの繰り返しの処理は未だ考え中で触っておりません)

  • エクセルVBAでConsolidate

    以下は、ネット検索で見つけたサンプルコードです。 同じフォルダ内の全ブックのSheet1のA1:B10をThisWorkbookのSheet1に統合しています。 Sub test2() Dim MyFile As String, MyPath As String Dim SumFile() As Variant, i As Long MyPath = ThisWorkbook.Path & "\" MyFile = Dir(MyPath, vbNormal) Do Until MyFile = "" If MyFile <> ThisWorkbook.Name Then ReDim Preserve SumFile(i) 'A1からB10の値を変数に代入 SumFile(i) = "'" & MyPath & "[" & MyFile & "]Sheet1'!R1C1:R10C2" i = i + 1 End If MyFile = Dir Loop If i = 0 Then MsgBox "データが有りません": Exit Sub Worksheets("Sheet1").Range("A1").Consolidate Sources:=SumFile() End Sub 質問1 Sheet1だけでなく全シートのA1:B10をThisWorkbookのSheet1に統合するためにはどう書き換えればよいのでしょうか? 質問2 上記コードではなぜ、ブックを開かずにデータがとれるのでしょうか?

  • Excel VBA ユーザフォームの検索について

    添付の画像のようなユーザフォームを作っています。 TextBox1に検索ワードを入力して、CommandButton1をクリックすると、下のComboBox1に一覧が出るようにしたいと思い、ほかのサイトから下記のコードを見つけて、作ってみました。参照先のsheet2を表示しているときは大丈夫なのですが、別のシートを選んでいるとエラーになります。 sheetは3つあり、それぞれ違うリストが入力されています。今回はsheet2のリストを参照したいのですが、最初はsheet1が表示されている状態で実行したいです。 エラーの内容は 実行時エラー9 インデックスが有効範囲にありません。 コチラがコードです。 Private Sub UserForm_Initialize() Dim i As Long, imax As Long Dim tbl() As Variant imax = ThisWorkbook.Worksheets("sheet2").Cells(Rows.Count, "A").End(xlUp).Row ReDim tbl(imax) For i = 1 To imax tbl(i) = Range("A" & i).Value Next i With ComboBox1 .List() = tbl() End With End Sub Private Sub CommandButton1_Click() Dim i As Long, imax As Long Dim tbl() As Variant Dim cnt As Long, j As Long j = -1 With ThisWorkbook.Worksheets("sheet2") imax = .Cells(Rows.Count, "A").End(xlUp).Row cnt = Application.CountIf(Range("A1:A" & imax), "*" & TextBox1.Text & "*") ReDim tbl(cnt) For i = 1 To imax If InStr(.Range("A" & i), TextBox1.Text) > 0 Then j = j + 1 tbl(j) = Range("A" & i).Value ←この部分がエラーになる End If Next i End With With ComboBox1 .List() = tbl() End With End Sub どこを直せば良いか、教えてください。 よろしくお願いします。

  • エクセルのフォームのVBAについて

    VBAがまったくわからないのに参考書を見て高度な事に挑戦しています フォームは作れてフォームをクリックやら入力やらして作ったOKボタンを押すと シート2のA1B1C1‥の列に入力文字だけが羅列されます。 しかし次にやろうとするとA2B2C2‥と下に行かず又A1B1C1‥の列の文字が変更になり続きません。何がいけないのでしょうか? Sub 入力() Dim LastRow As Long With Worksheets("sheet2") LastRow = Worksheets("sheet2").Range("A" & Rows.Count).End(xlUp).Row .Range("A" & LastRow).Value = Worksheets("sheet1").Range("A5").Value .Range("B" & LastRow).Value = Worksheets("sheet1").Range("A7").Value .Range("C" & LastRow).Value = Worksheets("sheet1").Range("A8").Value .Range("D" & LastRow).Value = Worksheets("sheet1").Range("A10").Value End With End Sub と参考書とおりいれたのですが‥。教えて下さい。

  • excel ユーザーフォームでシートごとに転記2

    先日ユーザーフォームへの転記について質問させていただきました。 ご回答いただき、ありがとうございました。 今度はオプションボタンで選択したときに、シートごとに転記する方法を 教えていただけますでしょうか。 ユーザフォーム上で、オプションボタンを選択。 OptionButton1・・・シート1へ転記 OptionButton2・・・シート2へ転記 これをOKボタンを押したときに転記するようにしたいと思っています。 Private Sub OK_Click() Dim CLrow As Long Dim KYrow As Long CLrow = Worksheets("Sheet1").Range("A65536").End(xlUp).Row KYrow = Worksheets("Sheet2").Range("A65536").End(xlUp).Row If OptionButton1.Value = True Then Worksheets("Sheet1").Range("A" & CLrow).Value = .TextBox1.Value ElseIf OptionButton2.Value = True Then Worksheets("Sheet2").Range("A" & KYrow).Value = .TextBox1.Value End With End Sub ここまでやってみたのですが「参照が不正または不完全です」 と出てしまいます。 どなたかご教示願います。 よろしくお願いします。

  • エクセルVBAについて

    前回質問させていただきました件の追加機能になります。以前質問させていただきましたマクロが下記のものです。 Sub TESTa() Dim A As Long Dim B As Long Dim C As Long Dim D As Long Dim E As Long Dim F As Long '表の行数を調べる A = Worksheets("sheet1").Range("C65536").End(xlUp).Row - 1 For C = 1 To A For B = 4 To 7 'Sheet1のデータをSheet2に複写する Worksheets("Sheet2").Cells(B - 3 + D, 15) = Worksheets("Sheet1").Cells(C + 1, 1) Worksheets("Sheet2").Cells(B - 3 + D, 6) = Worksheets("Sheet1").Cells(C + 1, B) Worksheets("Sheet2").Cells(B - 3 + D, 14) = Worksheets("Sheet1").Cells(C + 1, 3) Worksheets("Sheet2").Cells(B - 3 + D, 10) = Worksheets("Sheet1").Cells(1, B) Worksheets("Sheet2").Cells(B - 3 + D, 13) = Worksheets("Sheet1").Cells(C + 1, 2) Next D = C * 4 Next 'Sheet2の表の行数を調べる Sheets("Sheet2").Select E = Worksheets("sheet2").Range("F65536").End(xlUp).Row '0欄の確認 For F = E To 1 Step -1 If Worksheets("Sheet2").Cells(F, 6) = 0 Then '0の場合は行を削除する Cells(F, 1).EntireRow.Delete End If Next End Sub カウントするとデータ個数がSheet1で約120件になりSheet2においては、4倍になりますので約480件になります。 そこで Sheet1において12件ごとに、Sheet2,3,4...としたいのです。 Sh1 NO.1~12がSheet2 Sh1 NO.13~24がSheet3 ... 10枚のシートにしたいのですが、このマクロにどのような命令を加えればよろしいでしょうか? お手数ですがよろしくお願いいたします。

  • ユーザーフォームのデータ

    ユーザーファームを2つ作成しました。 そのユーザーフォームのデータを表の最終行に追加をしたいのです。 Range("A65536").End(xlUp).Offset(1,0).select を使おうと思っていますが、うまくいきません。 どなたか教えてください。 <ユーザーフォーム1> Private Sub CommandButton1_Click() Sheet2.Range("H7") = TextBox1 Sheet2.Range("I7") = TextBox2 Sheet2.Range("J7") = TextBox3 Sheet2.Range("K7") = TextBox4 Sheet2.Range("L7") = TextBox5 Sheet2.Range("P7") = TextBox6 If CheckBox1.Value = True Then Worksheets(2).Range("M7") = "0:30" Else Worksheets(2).Range("M7") = "0:00" End If If CheckBox2.Value = True Then Worksheets(2).Range("R7") = "1000" Else Worksheets(2).Range("R7") = "0" End If If CheckBox3.Value = True Then Worksheets(2).Range("S7") = "3000" Else Worksheets(2).Range("S7") = "0" End If If CheckBox4.Value = True Then Worksheets(2).Range("T7") = "1500" Else Worksheets(2).Range("T7") = "0" End If Unload Me End Sub <ユーザーフォーム2> Private Sub CommandButton1_Click() Sheet2.Range("V7") = TextBox1 Sheet2.Range("W7") = TextBox2 Sheet2.Range("X7") = TextBox3 Unload Me End Sub

  • Excel VBAについて

    Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Excel.Range, cancel As Boolean) If Intersect(Target, Range("F:F")) Is Nothing Then Exit Sub Application.Goto Worksheets("人件費").Range("A1") Worksheets("人件費").Cells(Rows.Count, "A").End(xlUp).Offset(1).Value = Target.Offset(, -5).Value cancel = True End Sub Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Excel.Range, cancel As Boolean) If Intersect(Target, Range("G:G")) Is Nothing Then Exit Sub Application.Goto Worksheets("外注費").Range("A1") Worksheets("外注費").Cells(Rows.Count, "A").End(xlUp).Offset(1).Value = Target.Offset(, -5).Value cancel = True End Sub 上の指令はFの列をダブルクリックすると人件費のシートが開いてAある値を人件費の新しいセルのAに代入する指令ですが それをG列ダブルクリックで外注費シートに同じようにやろうと思いましたが出来ません。 たぶん根本的に書き方が間違っているのかと思われますが、ご指導のほどお願いします。

  • VBA ユーザーフォーム

    VBA初心者です。以下の様なソースを見つけました。この場合は、文字を検索するとD1 にその該当番号が表示されます。 ※A列には番号、B列には文字列 そうではなく、そのクリックした行のA列にセルが移動し、ユーザーフォームが閉じられる様にできますでしょうか? よろしくお願い致します。 Private Sub ListBox1_Click() Sheets("Sheet1").Range("D1").Value = ListBox1.Value End Sub Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean) Dim v() As Variant Dim c As Range Dim k As Long ListBox1.Clear With Sheets("Sheet1") With .Range("A1", .Range("A" & .Rows.Count).End(xlUp)) ReDim v(1 To 2, 1 To .Rows.Count) For Each c In .Cells If c.Offset(, 1).Value Like TextBox1.Value & "*" Then k = k + 1 v(1, k) = c.Value v(2, k) = c.Offset(, 1).Value End If Next If k = 0 Then MsgBox "指定の値は存在しません" Else ReDim Preserve v(1 To 2, 1 To k) ListBox1.List = WorksheetFunction.Transpose(v) End If End With End With End Sub

  • Excel VBA 入力規則

    入力規則を利用して、3つのセルを連携させることを考えていますが、 不適合な値を張り付けらられた場合に拒否をする方法があるのでしょうか。 Private Sub Worksheet_Change(ByVal Target As Range) Dim ad As String Dim ma As Range Dim ma2 As Range Dim r As Range Dim r2 As Range Dim r3 As Range Dim r1 As Range Dim m As Long Dim m2 As Long Application.EnableEvents = False If Target = "" Then Range("F7").Validation.Delete Range("F7") = "" If Target.Address(0, 0) = "B7" Then Range("D7").Validation.Delete Range("D7") = "" End If GoTo EXIT_SUB End If With Worksheets("Sheet1") ad = "A4" Set r = .Range(ad) Set ma = r.MergeArea Set r1 = r.Offset(0, 1) m = Application.Match(Range("B7"), .Range(r1, .Cells(r.Row + ma.Count - 1, r1.Column)), 0) Set r2 = .Cells(r.Row + m - 1, r1.Column) Set ma2 = r2.MergeArea If Target.Address(0, 0) = "B7" Then If ma.MergeCells Then setValiS Target.Offset(0, 2), r2 Range("F7").Validation.Delete Target.Offset(0, 2) = "" Target.Offset(0, 4) = "" Else MsgBox "A列が連結されていません。" End If ElseIf Target.Address(0, 0) = "D7" Then Set r3 = r2.Offset(0, 1) m2 = Application.Match(Target, .Range(r3, .Cells(r2.Row + ma2.Count - 1, r3.Column)), 0) setValiS Target.Offset(0, 2), .Cells(r2.Row + m2 - 1, r3.Column) Target.Offset(0, 2) = "" End If End With EXIT_SUB: Application.EnableEvents = True End Sub Sub setVali2() Dim tc As Range Dim c As Range Set tc = Worksheets("登録").Range("D3") Set c = Worksheets("Sheet1").Range("C3") setValiS tc, c End Sub Sub setValiS(tc As Range, c As Range) Dim ss As String Debug.Print tc.Address, c.Address ss = getChildren(c) If ss > "" Then With tc.Validation .Delete .Add Type:=xlValidateList, Formula1:=getChildren(c) End With End If Worksheets("登録").Activate End Sub Function getChildren(c As Range) Dim c1 As Range Dim ss As String Dim s1 As String Worksheets("Sheet1").Activate ss = "" For Each c1 In c.MergeArea s1 = c1.Offset(0, 1) If s1 <> "" Then ss = ss & "," & s1 Next c1 If ss <> "" Then ss = Mid(ss, 2) Else MsgBox "データがありません!" End If getChildren = ss End Function Sub Outline() Dim CheckRow As Long Dim Moji As String Dim TopRow As Long Dim EndRow As Long With ActiveSheet .Range("A2").ClearOutline .Outline.SummaryRow = xlAbove CheckRow0 = .Range("A" & .Rows.Count).End(xlUp).Row CheckRow = CheckRow0 Do If Moji = "" Then Moji = .Cells(CheckRow, 1).Value EndRow = CheckRow ElseIf yy_mm(CDate(.Cells(CheckRow, 1).Value)) = yy_mm(CDate(Moji)) Then TopRow = CheckRow If TopRow = 1 Then .Rows(TopRow + 1 & ":" & EndRow).Rows.Group Exit Do End If Else .Rows(TopRow + 1 & ":" & EndRow).Rows.Group CheckRow = CheckRow + 1 Moji = "" End If CheckRow = CheckRow - 1 Loop Until CheckRow = 1 .Rows(CheckRow + 1 & ":" & EndRow).Rows.Group .Outline.ShowLevels RowLevels:=1 ExecuteExcel4Macro "SHOW.DETAIL(1," & CheckRow0 & ",TRUE)" End With End Sub Function yy_mm(d As Date) yy_mm = Format(d, "yy/mm") End Function

専門家に質問してみよう