• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:フォームに入力された日付のデータのみコピペする)

フォームに入力された日付のデータのみコピペする

このQ&Aのポイント
  • ExcelのVBAを使用して、フォームに入力された日付のデータのみをコピーして集計シートに貼り付ける方法を教えてください。
  • フォームを使用して、入力された日付と一致するデータを抽出し、それ以外のデータを削除する方法を教えてください。
  • VBAを使用して、集計シートに[東京支店]、[名古屋支店]、[大阪支店]のデータをコピーし、フォームに入力された日付と一致するデータのみを残す方法を教えてください。

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

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

こんばんは。 今のマクロで失敗しているのは、行を「上から下に向かって順に調べて、行削除している」からです。 下端行から順に上に向けて調べて削除していけば、失敗しません。定石なので、必ずマスターしておいてください。 で。 >[日付がXXXのデータのみコピぺする]といった具合にしたいのです。 実際には、全データを1行ずつ舐めまわしながら操作していくのは、いかにも非効率です。(実際そういうマクロは、確かに簡単ですが一番遅いです) とりあえず高速な手としては、各支店シートに「オートフィルタ」を取り付けて欲しい日付のデータだけ抽出し、そのままふつーにコピーして集約します。 今のマクロに「オートフィルタで絞り込む」だけ追加すれば、ほとんど変更なしに作成できます。

yakkun2338
質問者

お礼

keithinさん、ご連絡が遅くなりまして申し訳ございません。 ご教授いただきましたオートフィルターの設定で実現できました! 複雑なロジックを組まないといけないのかな、と心配していたのですがこのようなシンプルな方法もあるのですね! この度は本当にありがとうございました!!(^^)

yakkun2338
質問者

補足

keithinさん、早速のご連絡ありがとうございます。 いつもありがとうございます。 なるほど!そkうゆーことだったのですね。。 とても勉強になりました。 ただ今からPCから離れてしまいますため後程ご教授いただきました方法で試させていただきます! 取り急ぎお礼申しあげます。

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

その他の回答 (1)

  • tsubuyuki
  • ベストアンサー率45% (699/1545)
回答No.2

> '集計シートのデータを全READ > i=2 > Do > 'フォームのTextBox1に入力された日付以外は削除 > If Cells(i, 1).Value <> TextBox1.Value Then > Rows(i & ":" & i).Select > Selection.Delete Shift:=xlUp > End If > i = i + 1 > Loop Until Cells(i, 1) = "" 現状、2行目から初めて、最終行まで・・と上から下へ見に行ってますよね。  1行目  11/6  い  2行目  11/5  ろ  3行目  11/4  は  4行目  11/6  に と入力されているセルを、例えば11/6日以外を削除、i=i+1して繰り返し・・と考えたとき、 1行目は11/6ですから、残してi=i+1して2行目を見に行きますね。 2行目は11/5ですから、削除対象です。行削除した結果、  1行目  11/6  い  2行目  11/4  は  3行目  11/6  に こうなりますね?  でも、i=i+1で次は3行目(「に」の行)を見に行ってしまいます。 これでは現在の2行目(「は」の行)は残ってしまいますね。 これが行(列)削除・挿入を繰り返すときの落とし穴です。 この場合、下(右)から消していくのがセオリーとされています。 行を見るための変数iの初期値を「開始前の最終行」にしてやり、 1行処理したら「前の行」としてやるために、   '集計シートのデータを全READ   i=Cells(Rows.Count, 1).End(xlUp).Row   Do     'フォームのTextBox1に入力された日付以外は削除     If Cells(i, 1).Value <> TextBox1.Value Then       Rows(i).Delete Shift:=xlUp     End If     i = i - 1   Loop Until i = 1 こんな感じにします。 ここから先は好みの問題が大きく左右されますが、 “私なら”For~Nextを使います。   '集計シートのデータを全READ   '最終行から2行目まで、-1行しながら繰り返し   For i = Cells(Rows.Count, 1).End(xlUp).Row To 2 Step -1     'フォームのTextBox1に入力された日付以外は削除     If Cells(i, 1).Value <> TextBox1.Value Then       Rows(i).Delete Shift:=xlUp     End If   Next i こんな感じですね。

yakkun2338
質問者

お礼

tsubuyakinさん、ご連絡が遅くなりまして申し訳ございません。 最終行の調べ方、今後はしっかりと覚えていきたいと思います! 今回は他の方にご教授いただきましたオートフィルターで絞る方法で進めさせていただくことにしましたが、tsubuyakiさんからご教授いただきました方法でも実現できました! この度は本当にありがとうございました!!(^^

yakkun2338
質問者

補足

tsubuyakiさん、早速のご連絡ありがとうございます。 いつもありがとうございます。 そのような落とし穴だったのですね! 何回やってもおかしいなーと思っていたのです・・(^^) とても勉強になりました。 ただ今からPCから離れてしまいますため後程ご教授いただきました方法で試させていただきます! 取り急ぎお礼申しあげます。

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

関連するQ&A

  • 複数シートの内容を1つのシートに集計するVBA

    お世話になります。 ExcelのVBAについて質問させていただきます。 集計.xlsというブックがあります。 この中に[集計]、[東京支店]、[名古屋支店]、[大阪支店]というシートがあります。 やりたい事は[東京支店]、[名古屋支店]、[大阪支店]のシート内容を[集計]シートに順番にコピペしていきたいのです。 下記のVBAを組んでみましたがうまくいきません。 [東京支店]はうまくコピペ出来ますが、[名古屋支店]がコピペされず、[大阪支店]はコピペされますが東京支店のデータのすぐ下ではなく、50行ぐらい下の位置にコピペされてしまいます。 各支店のシートの内容は次の通りです。この内容を[集計]シートにコピペしたいのです。 [日付] [担当者] [金額] 11/1 田中 100円 11/2 山田 500円 どなたかご教授いただけますでしょうか? 環境 Windows XP SP3 Excel2003 ****VBA**** Sub test() Dim 下 As Integer '東京支店 Sheets("東京支店").Select Range("A2").Select '東京支店シートの見出し以外の全データをコピー Range(Selection, Selection.End(xlDown)).Select Range(Selection, Selection.End(xlToRight)).Select Selection.Copy '集計シートに貼り付け Sheets("集計").Select Range("A2").Select ActiveSheet.Paste '次は名古屋支店 Sheets("名古屋支店").Select Range("A2").Select '名古屋支店シートの見出し以外の全データをコピー Range(Selection, Selection.End(xlDown)).Select Range(Selection, Selection.End(xlToRight)).Select Selection.Copy '集計シートの最下行を取得 Sheets("集計").Select 下 = Range("A1").CurrentRegion.Rows.Count + 1 '集計シートに貼り付け Range("A2").Select ActiveCell.Offset(下 & "," & 0).Select ActiveSheet.Paste '最後に大阪支店 Sheets("大阪支店").Select Range("A2").Select '大阪支店シートの見出し以外の全データをコピー Range(Selection, Selection.End(xlDown)).Select Range(Selection, Selection.End(xlToRight)).Select Selection.Copy '集計シートの最下行を取得 Sheets("集計").Select 下 = Range("A1").CurrentRegion.Rows.Count + 1 '集計シートに貼り付け Range("A2").Select ActiveCell.Offset(下 & "," & 0).Select ActiveSheet.Paste End Sub

  • ォームに入力された日付のデータのみコピペする続

    お世話になります。 前回に質問させていただきました本件ですが、新たに2点質問させていただきます。 集計.xlsというブックがあります。 この中に[集計]、[東京支店]、[名古屋支店]、[大阪支店]というシートがあります。 [東京支店]、[名古屋支店]、[大阪支店]のシート内容を[集計]シートに順番にコピペすることは出来ました。その際にフォームに入力された日付(Texe.box1)に入力された日付でオートフィルターして絞った結果のデータのみコピぺすることも出来るようになりました。 皆様本当にありがとうございました! 作成したフォーム(Form1)に条件に使う日付を"Text.box1"に入力させるようにしてあります。 各支店のシートの内容は以下の通りです。 日付] [担当者] [金額] 11/1 田中 100円 11/2 山田 500円 ここからが今回の質問2つです。 下記VBAは皆様からご教授いただきましたVBAで、動作は完璧です。しかしお恥ずかしい話ですが私がロジックを細かく理解していないため、細かい修正が出来ずにおります。 (1) やりたいことは、現在は[集計]シートにA2から各支店のデータが貼り付けられるのですが、A3から貼り付けるようにしたいのです・・。cells(X,X)の箇所をいろいろいじりましたが、うまくいきませんでした・・。 本当に初歩的で申し訳ございません。。 (2) 日付をオートフィルターで絞っていますが、新たに[担当者]という項目("Textbox2")をフォームに追加して入力された担当者でも絞れるようにしたいのですが、[日付](Textbox1)と[担当者](Textbox2)同時にオートフィルターをかけるロジックが分からないのです。。 何度も申し訳ありませんが、どなたかご教授いただけますでしょうか? 環境 Windows XP SP3 Excel2003 以下、皆様からご教授いただきましたVBAを少し私が加工したものです。 ↓ Private Sub CommandButton1_Click() Dim i As Long Dim j As Long Dim k As Long Dim str As String Dim myArray As Variant Dim ws As Worksheet Set ws = Worksheets("集計") myArray = Array("東京支店", "名古屋支店", "大阪支店") i = ws.Cells(Rows.Count, 1).End(xlUp).Row j = ws.Cells(1, Columns.Count).End(xlToLeft).Column If i > 1 Then Range(ws.Cells(2, 1), ws.Cells(i, j)).ClearContents End If For k = 0 To UBound(myArray) str = myArray(k) '日付でオートフィルター' With Worksheets(str) .Range("A1").AutoFilter Field:=1, Criteria1:=TextBox1.Value End With i = Worksheets(str).Cells(Rows.Count, 1).End(xlUp).Row Range(Worksheets(str).Cells(2, 1), Worksheets(str).Cells(i, j)).Copy _ ws.Cells(Rows.Count, 1).End(xlUp).Offset(1) Next k

  • マクロでシート2~6のデータをシート1に転記したい

    マクロでシート2~6のデータをシート1に転記したいです。 シート2~6のデータを シート1に順番に転記したくてマクロの記録を利用して作成しました。 シート2~6は列は同じですが行数は異なります。 また行数は作業の都度異なります。 同じ記述が繰り返されているので もう少し記述が短くできるのではと思うのですが どうすればいいでしょうか? Sub データ更新() 'シート1の前回データをクリア Sheets("シート1").Select Range("A2:Q2").Select Range(Selection, Selection.End(xlDown)).Select Range(Selection, Selection.End(xlDown)).Select Selection.ClearContents Range("A2").Select Sheets("シート1").Select Range("A1").Select Sheets("シート2").Select Range("A1").Select 'ヘッダーも合わせて取得 Range(Selection, Selection.End(xlToRight)).Select Range(Selection, Selection.End(xlDown)).Select Selection.Copy Sheets("シート1").Select ActiveSheet.Paste Application.CutCopyMode = False Selection.End(xlDown).Select Selection.Offset(1, 0).Select Sheets("シート3").Select Range("A2").Select 'データのみ取得 Range(Selection, Selection.End(xlToRight)).Select Range(Selection, Selection.End(xlDown)).Select Selection.Copy Sheets("シート1").Select ActiveSheet.Paste Application.CutCopyMode = False Selection.End(xlDown).Select Selection.Offset(1, 0).Select Sheets("シート4").Select Range("A2").Select Range(Selection, Selection.End(xlToRight)).Select Range(Selection, Selection.End(xlDown)).Select Selection.Copy Sheets("シート1").Select ActiveSheet.Paste Application.CutCopyMode = False Selection.End(xlDown).Select Selection.Offset(1, 0).Select Sheets("シート5").Select Range("A2").Select Range(Selection, Selection.End(xlToRight)).Select Range(Selection, Selection.End(xlDown)).Select Selection.Copy Sheets("シート1").Select ActiveSheet.Paste Application.CutCopyMode = False Selection.End(xlDown).Select Selection.Offset(1, 0).Select Sheets("シート6").Select Range("A2").Select Range(Selection, Selection.End(xlToRight)).Select Range(Selection, Selection.End(xlDown)).Select Selection.Copy Sheets("シート1").Select ActiveSheet.Paste Application.CutCopyMode = False Selection.End(xlDown).Select Selection.Offset(1, 0).Select End Sub

  • Excel 繰り返しマクロ

    下記のようなマクロを使ってn個あるシートの内容を「集計」シートにコピーさせるようにしました。 (自動マクロとの組合せなので、スマートではないかもしれませんが) でも、これだと「集計」シートもコピー作業を行ってしまうので、 「集計」シートはコピー作業をしないように除外したいのですが、どうしたら良いのでしょう? 実際にはシート数は30程度、コピペ項目は1シートあたり30項目程度あります。 よろしくお願いします。 ------------------------- Sub テスト2() ' For i = 1 To Worksheets.Count '案件番号等コピー ' Sheets(i).Select Range("D3").Select Application.CutCopyMode = False Selection.Copy Sheets("集計").Select Range("A4").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False '案件名 Sheets(i).Select Range("F3").Select Application.CutCopyMode = False Selection.Copy Sheets("集計").Select Range("B4").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False '国名 Sheets(i).Select Range("E3").Select Application.CutCopyMode = False Selection.Copy Sheets("集計").Select Range("C4").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False '選択セルの解放 Application.CutCopyMode = False '行挿入 ' Sheets("集計").Select Rows("4:4").Select Selection.Insert Shift:=xlDown Next i End Sub

  • エクセルの入力データーを別のシートの日付と氏名の交差点に記録していくマクロ

    現在別のカテゴリーで教えていただいたマクロなのですが、 Sheet1に入力されたデータをSheet2に転記するマクロに苦しんでおります。週明けには解決したいのでこのカテゴリーにも質問することにしました。 現在の状況は以下の通りです。 Sheet1    A   B   C   D   1 日付 氏名 成績 区分 2 9/23 佐藤 95  優 ここでマクロを実行すると Sheet2    A   B   C   D   E   F  G 1       1組       2組 2    田中 佐藤 小林 近藤 三浦 遠藤 3 9/19 90  4 9/21         80 5 9/21    95 6 9/21            95 7 9/22                 95 となって欲しいのですが、同じ日付で続けて入力すると Sheet2    A   B   C   D   E   F  G 1       1組       2組 2    田中 佐藤 小林 近藤 三浦 遠藤 3 9/19 90  4 9/21    95   80  95 5 9/21     6 9/21             7 9/22                 95 となってしまいます。 マクロは Sub Macro001() 'まず日付を転記します  Range("A2").Select  Selection.Copy  Sheets("sheet2").Select  Range("A65536").Select  Selection.End(xlUp).Select  ActiveCell.Offset(1, 0).Select  Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _  False, Transpose:=False  Sheets("sheet1").Select  Application.CutCopyMode = False  Range("C3").Select '続いて転記します  Dim x As Long  Dim y As Integer  x = Application.Match(Sheets("sheet1").Range("a2"), Sheets("sheet2").Columns(1), 0)  y = Application.Match(Sheets("sheet1").Range("b2"), Sheets("sheet2").Rows(2), 0)  Sheets("sheet2").Cells(x, y) = Sheets("sheet1").Range("C2") End Sub です。 どうかよろしくお願いいたします。

  • エクセルVBA マクロの記録をコマンドボタンにコピペしても動かないのはなぜ?

    マクロを記録した以下は問題なく動くのですが、 Sub Macro1() Sheets("AAA").Select Range("A39:AQ39").Select Selection.Copy Sheets("BBB").Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False End Sub これをシート”BBB”のコマンドボタンに下記のようにコピペすると Range("A39:AQ39").Selectでエラーが発生し動きません。 どうすれば動くようになるのでしょうか? また、どうしてボタンだとコピペするだけではいけないのでしょうか? Private Sub CommandButton1_Click()    ここにコピペ End Sub

  • 増減するデータの集計について

    Excel2013使用です。 「受注書」というシートのデータを集計し、「集計表」というシートに 書き出したいです。 【シート「受注書」】    C      D      E       F     G   1 商品名   色     数量    単価   備考 2 データ・・・・・・・・・・・・・・・ 【シート「集計表」】    A      B      C      D     E 6 商品名   色     数量    単価   備考 7 シート「受注書」のC~Fのデータをコピーし、 シート「集計表」のA~Dに貼り付け後、商品名を基準に重複を削除し、 各商品の合計数量をSUMIF関数で集計するようにしました。 テストデータでは上手く行ったのですが、「受注書」のデータは都度 増減があるため、データを増やして再度テストしたところ、増やした分の データが「集計表」の下部に残ってしまいます。 こんな感じ↓ 【シート「集計表」】    A      B      C      D     E 6 商品名   色     数量    単価   備考 7 *****    **     ***     ***    ** 8 ****     **     ***  ***    ** 12****     **     ***     ***    ** ←増やしたデータ コードは以下の通りです Sheets("受注書").Select Range("C2:G2").Select Range(Selection, Selection.End(xlDown)).Select Selection.Copy Sheets("集計表").Select Range("A7").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.CutCopyMode = False ActiveSheet.Range("$A$6:$E$25").RemoveDuplicates Columns:=1, Header:=xlYes Range("C7").Select Range(Selection, Selection.End(xlDown)).Select Selection.ClearContents Range("C7").Select ActiveCell.FormulaR1C1 = "=SUMIF(受注書!C3:C5,集計表!RC1,受注書!C5)" Range("C7").Select Selection.AutoFill Destination:=Range("C7:C9"), Type:=xlFillValues Range("C7:C9").Select Range("A2").Select End Sub 試しに ActiveSheet.Range("$A$6:$E$25").RemoveDuplicates Columns:=1, Header:=xlYes の部分を ActiveSheet.Range("$A:$E").RemoveDuplicates Columns:=1, Header:=xlYes に変えてみたところ、下部の重複データは消えたのですが、集計結果が何故か A7以降にではなくA4以降に表示されてしまい、罫線も消えてしまいました。 更に、C列の数量に不要な0が表示されてしまいます。 こんな感じ↓   A      B      C      D     E 4 商品名   色     数量    単価   備考 5 *****    **     ***     ***    ** 6 ****     **     ***  ***    ** 7                0 8                 0 どこを直したら良いでしょうか?

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

    ユーザーファームを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

  • エクセル2000のVBAで、入力セルのデータを転記したい

    シート1の5行目あたり(例えばBの5)に入力用セルを置き、値を入れてボタンを押したら 11/6の部分にその値が表示されるようにしたい。 同じシート1の10行目に題名を入れている(下記ではABCD・・・の部分) 11行目からデータ内容を下に記載していく。 10    A      B     C       D 11 2007/11/1 $2000 月平均  半月平均 12 2007/11/2 $2300 月平均  半月平均 13 2007/11/3        月平均  半月平均 14 2007/11/4 $2350 月平均  半月平均 15 2007/11/5        月平均  半月平均 16 2007/11/6        月平均  半月平均 このデータは日付A列がもともと入っています。 毎日の為替相場をデータにしていきたいと考えてください。 土日祝日等は入力しませんので、入力しない日(休祝日だった場合)はそのまま空欄に していくと言う形です。11/5が休みだといって11/4の次のセルを11/6にすると言うのではありません。 1年365日あるのでデータとしては日付部分に365行分先に入力されている形です。 Bだけが空欄で、CとDはアベレージ計算式が入っています。 下のマクロを組みましたが、これだと17行目の指定した列から入力されてしまいます。 どのようにしたらいいのか教えていただけますか? 入力セルに日付も必要ですか? Sub ボタン1_Click() Application.ScreenUpdating = False Sheets("シート1").Select Range("B5").Select Selection.Copy Sheets("シート1").Select Range("A65536").Select Selection.End(xlUp).Select Selection.Offset(1, 0).Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=True Application.CutCopyMode = Flase Sheets("シート1").Select Range("C10").Select Selection.ClearContents Range("B5").Select End Sub

  • マクロを使ったコピペがうまく動作しない。

    あるデータを転記用のブック(月毎にシートが分かれています。シートの内容は同一)に貼り付ける処理を行うため、下記のようなマクロを組んだのですが、何故か貼りつきません。処理終了時には、転記元ブック(シート)で最終処理の範囲(5番目のB287)を選択しています。一体何がいけないのでしょうか? データはA1からPまでで毎月可変しています。 また、転記用ブックが12枚あるため、月を指定してから貼り付けたいのですが、どのようにすればよいでしょうか?(下記は直接シ-トを指定しました) Sub test() Dim 最終行 As Integer '-------------------------------------------- 開始 Windows("21-12.xls").Activate 最終行 = Range("p65536").End(xlUp).Row Sheets("1").Range("A1:p" & 最終行).Select Selection.Copy Windows("転記.xls").Activate Sheets(12月).Select Range("B1").PasteSpecial Paste:=xlPasteValues '-------------------------------------------- 1 Windows("21-12.xls").Activate 最終行 = Range("p65536").End(xlUp).Row Sheets("2").Range("A1:p" & 最終行).Select Selection.Copy Windows("転記.xls").Activate Sheets(12月).Select Range("B83").PasteSpecial Paste:=xlPasteValues '-------------------------------------------- 2 Windows("21-12.xls").Activate 最終行 = Range("p65536").End(xlUp).Row Sheets("3").Range("A1:p" & 最終行).Select Selection.Copy Windows("転記.xls").Activate Sheets(12月).Select Range("B157").PasteSpecial Paste:=xlPasteValues '-------------------------------------------- 3 Windows("21-12.xls").Activate 最終行 = Range("p65536").End(xlUp).Row Sheets("4").Range("A1:p" & 最終行).Select Selection.Copy Windows("転記.xls").Activate Sheets(12月).Select Range("B227").PasteSpecial Paste:=xlPasteValues '-------------------------------------------- 4 Windows("21-12.xls").Activate 最終行 = Range("p65536").End(xlUp).Row Sheets("5").Range("A1:p" & 最終行).Select Selection.Copy Windows("転記.xls").Activate Sheets(12月).Select Range("B287").PasteSpecial Paste:=xlPasteValues --------------------------------------------- 5 End Sub 

専門家に質問してみよう