VBAでユーザーフォームから日付データを処理する方法

このQ&Aのポイント
  • Excel 2007を使用している場合、VBAを使ってユーザーフォームから日付データを処理する方法を考えています。具体的な処理内容は、テキストボックスにYYYY/M形式の日付データを入力し、コマンドボタンを押下することで日付データを確認し、オリジナルデータから条件に該当する行を別のシートにコピーするというものです。
  • 上記の処理は、コマンドボタンのクリックイベント処理としてまとめて記述することができます。
  • 日付データのオブジェクト名を「TextBox1」とし、コマンドボタンのクリックイベント処理などを行うサンプルコードはありませんが、VBAの基本的な文法を使って処理することができます。
回答を見る
  • ベストアンサー

VBA; ユーザーフォームからの処理

Excel 2007を使用しています。 下記のようなことを考えています。 1. テキストボックスにYYYY/M形式の日付データを入力 2. コマンドボタンを押下。 3. 日付データを確認 4. オリジナル(sheet1)の列値、日付データ(A列)、商品番号(B列)、商品名(C列)から条件に 該当した行をサマリー(sheet2)にコピー。 オリジナルの3行目のベッダー情報は先頭に置いて、その下に該当行を付ける。 オリジナルデータ; 注文日付 商品番号 商品名 2010/9 312000 ノコギリ 2011/12   542000 ハンマー . . . . . . 2014/5 312000 ノコギリ サマリー; 注文日付 商品番号 商品名 2010/9 312000 ノコギリ 2014/5 312000 ノコギリ ご質問; 1. 上記3、4の処理はコマンドボタンのクリックイベント処理として、まとめて 記述すれば 良いのでしょうか? 2. 日付データのオブジェクト名を"TextBox1"として、コマンドボタンのクリックイベント処理 など、これらの処理を行うにあたりサンプルなるコードはありませんか?   オリジナルの行数は変動します。 3. ユーザーフォームを作らずにシート上(shhet1)にテキストボックス、 コマンドボタンを作成できますか?   ありましたら方法を教えてください。 以上、宜しくおねがいします。

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

  • ベストアンサー
  • eden3616
  • ベストアンサー率65% (267/405)
回答No.1

1. 上記3、4の処理はコマンドボタンのクリックイベント処理として、まとめて 記述すれば 良いのでしょうか? まとめて一つのプロシージャで処理出来ます。 2. 日付データのオブジェクト名を"TextBox1"として、コマンドボタンのクリックイベント処理 など、これらの処理を行うにあたりサンプルなるコードはありませんか?   オリジナルの行数は変動します。 「最終行セルのオブジェクト.End(xlup).Row」で最終行の行番号を取得できます。 以下参照。 3. ユーザーフォームを作らずにシート上(shhet1)にテキストボックス、 コマンドボタンを作成できますか? できます。以下参照。 ---------------------------------------------------------------- (1)前提条件: ・シート名は「オリジナルデータ」と「サマリー」(出力先)とします。 ・オリジナルデータは3行目に項目行が1行あり、4行目からデータが入力されているとします。 ・サマリーシートは1行目に項目行(1行)、2行目からコピーしたセルを貼り付けます。 (2)オリジナルデータシートにコントロールを配置する方法: ・エクセルの開発タブ(無ければエクセルオプションから表示設定してくさい)の  挿入からActiveXから「テキストボックス」と「コマンドボタン」を配置してください。 ・各コントロールを(開発タブのデザインモードをONにして)右クリック>プロパティを表示し、  オブジェクト名を「Textbox1」と「CommandButton1」としてください。 ・コマンドボタンの表示名は同じくコマンドボタンのCaptionプロパティで変更できます。 (3)コードの追加 ・(開発タブのデザインモードがONの状態で)コマンドボタンをダブルクリックしてVBE画面を開く。 ・「Private Sub CommandButton1_Click() ~ End Sub」を最下のVBAコードと差し換え。 (4)VBAの実行 ・開発タブのデザインモードをOFFにした状態にする。 ・テキストボックスに「yyyy/m」形式で日付を入力。 ・コマンドボタンをクリックします。 ・結果がダイアログで表示されます。 シートが無い等のエラー処理は行っていませんので必要であれば追加してください。 様式に変更がある場合は適切に修正願います。 ■VBAコード Private Sub CommandButton1_Click() '変数を定義 Dim i As Long Dim maxRow As Long Dim cnt As Long Dim outSheet As Worksheet '出力先のシートをオブジェクト変数へ格納 Set outSheet = Worksheets("サマリー") 'テキストボックスの内容を判定 If (Me.TextBox1.Value = "") Or (Not IsDate(Me.TextBox1.Value)) Then   MsgBox "日付が入力されていません"   Exit Sub End If '最終行番号を取得 maxRow = Me.Cells(Rows.Count, "A").End(xlUp).Row 'オリジナルデータの最終行番号で分岐処理 If maxRow > 3 Then   '出力先を削除してヘッダーをコピー   outSheet.Cells.Delete   Me.Range("A3:C3").Copy outSheet.Range("A1:C1") Else   '4行目以降にデータが入力されていなければメッセージで終了   MsgBox "オリジナルデータがありません"   Exit Sub End If '4行目から最終行まで繰り返し For i = 4 To maxRow   'A列が日付であれば処理   If IsDate(Me.Cells(i, "A").Value) Then     'テキストボックスの年/月とA列が一致した行をコピー     If Year(Me.Cells(i, "A").Value) = Year(Me.TextBox1.Value) And _     Month(Me.Cells(i, "A").Value) = Month(Me.TextBox1.Value) Then       Me.Cells(i, "A").Resize(1, 3).Copy outSheet.Cells(cnt + 2, "A")       cnt = cnt + 1     End If   End If Next i '結果表示 If cnt > 0 Then   MsgBox cnt & "件コピーしました" Else   MsgBox "一致する日付が有りませんでした" End If End Sub

関連するQ&A

  • ユーザーフォームで教えてください。

    ユーザーフォームで教えてください。 エクセルシートで、A列に1から100までナンバーがあり、 B列~E列までデータが入っている表があります。 テキストボックスにナンバーを入力(もしくはスピンボタン)して 「検索」のコマンドボタンを押すと、B列以降のデータが各テキストボックスに表示される。 という形にしたいのですが、やり方が分からず困っています。 これまでは表の外に最初の行と最後の行を表示させて、 それを変数として扱い、「前」、「次」のコマンドボタンで1ずつ増減させて 表示していたのですが、ナンバーから直接表示させたほうが効率が良いと思いました。 (データが少ないときはよかったのですが。) 希望としては、 例としてテキストボックス1に「50」と入力する。(またはスピンボタンで50を選択) コマンドボタン「検索」でナンバー50のB列~E列のデータをテキストボックス2~5へ表示。 コマンドボタン「前」「次」を配置し、「前」でナンバー49、「次」でナンバー51のデータを表示。 1もしくは100(最後のナンバー)のときに「前」「次」を押してもデータは表示せず、 メッセージで「これが最初(最後)です」と表示。 という感じです。 できればでいいのですが、 ナンバー50のデータが表示された状態で、 B列以降のデータを直してナンバー50の行に上書きする「修正」、 表示された行を削除して1行上にずらす「削除」の コマンドボタンがあると助かります。 長くなってしまいましたが、よろしくお願いします。

  • エクセルVBA ユーザーフォーム 検索

    現在VBAにてユーザーフォームにて入力したデータをシート1に転記するものを作成しました。 この転記したデータを生かして作業したいと考えております。 データは商品データで A    B C E F 商品コード 商品名  区分  単価  備考 となっており ユーザーフォームも TEXTBOX1=A TEXTBOX2=B と言う様になってます。 現在考えているのがこのデータの一部を変更したい場合、コマンドボタンを押すと商品コード入力用boxがでてきて、商品コードを入力するとA列から検索し該当する商品データをユーザーフォーム上に表示するようにしたいのです。 そのデータがA75行にあったとします。 そのユーザーフォーム上で単価を変更した場合検索した行(A75行)にそのまま上書きする様にしたいです。 説明がうまくできてないかも知れませんが、どなたかご教授願います。

  • Excelユーザーフォームでのデータ検索

    現在Excelマクロの勉強中ですが、ユーザーフォームでテキストボックスを4個とコマンドボタン1個を作成し、テキストボックス1にコードを入力してコマンドボタンを押すと、ワークシート(ワークシート名、住所録)に作成されたデータのA列からコードを検索(データは2行目から始まる)し、一致したデータのB列にある「名前」をテキストボックス2、C列の「住所」をテキストボックス3、D列の「電話番号」をテキストボックス4に表示する。 というマクロが書けず困っています。 わかる方教えてください。

  • テキストボックスの日付と文字列の処理

    Excel 2007 VBAを使用しています。 下記のようなことを考えています。 1. テキストボックスにyyyy/m形式の日付データを入力 2. ボタンシートのコマンドボタンを押下。 3. テキストボックスの日付データを確認 4. 商品シートの列値、日付データ(A列)、商品番号(B列)、商品名(C列)、状況(D列)から条件に 該当した行を結果シートに行コピー。   ただし、日付データ(A列)には日付データ以外にも文字列データ、"未定"、空白セル("")などがございます。 そして、商品シートの3行目のベッダー情報は先頭に置いて、その下に該当行を行コピーしていく。 質問; 解らないのは、同じif文で日付データと文字列データとの処理です。 テキストボックスのyyyy/m形式の日付データを基にその日付以降の該当する行を別のシートに コピーしていくのですが、参照元の商品シートの日付データ(A列)には他に文字列データが存在します。 この文字列データも抽出の対象にしたいのです。 あと、テキストボックスのyyyy/m形式の日付データは半角入力しますが全角入力されたとき エラー表示させる方法はありますか? これらの処理を行うにあたりサンプルなるコードはありませんか? 商品シートの3行目のベッダー情報は先頭に置いて、その下に該当した行を行コピーしていく。 1. 商品シート; 注文日付 商品番号 商品名 状況 2010/9 312000 ノコギリ 受取済み 2014/5    542000 ハンマー n/a 未定 544000 トンカチ n/a (空白セル) 542000 ハンマー n/a 2014/11 312000 ノコギリ 注文中 ・ ・ 2. ボタンシートで、日付データを入力(2014/5)、実行ボタンを押下。 条件は2014/5以降で、状況が"受取済み"、"注文中"以外の行データをコピーして状況が未確定のリストを作成します。 そして、注文日付が"未定"、空白セル("")の行データもコピーします。 そして、順次、結果シートに行コピーしてします。 結果シート; 注文日付 商品番号 商品名 状況 2014/5    542000 ハンマー n/a 未定 544000 トンカチ n/a (空白セル) 542000 ハンマー n/a ・ ・ VBAコード; Option Explicit Private Sub CB2_Click() '変数を定義 Dim i As Long Dim maxRow As Long Dim cnt As Long Dim inSheet As Worksheet Dim outSheet As Worksheet '入出力先のシートをオブジェクト変数へ格納 Set inSheet = Worksheets("商品シート") Set outSheet = Worksheets("結果シート") 'テキストボックスの内容を判定 '全角入力されたときエラー表示させる方法はありますか? If (Me.TextBox1.Value = "") Or (Not IsDate(Me.TextBox1.Value)) Then MsgBox "日付が正しく入力されていません" Exit Sub End If maxRow = inSheet.Cells(Rows.Count, "A").End(xlUp).Row '商品シートの最終行番号で分岐処理 If maxRow > 3 Then '出力先を削除してヘッダーをコピー outSheet.Cells.Delete inSheet.Range("A3").EntireRow.Copy outSheet.Range("A1") Application.CutCopyMode = False Else '4行目以降にデータが入力されていなければメッセージで終了 MsgBox "該当データがありません" Exit Sub End If '4行目から最終行まで繰り返し For i = 4 To maxRow 'ここからが上手くいきません。 'If IsDate(inSheet.Cells(i, "A").Value) Then 'フィルター条件; 'A列 注文日付 → 2014年05月以降、未定、(空白セル) 'D列 金額 → 受取済み、注文中以外 If inSheet.Cells(i, "A").Value >= CDate(Me.TextBox1.Value) And _ CStr(inSheet.Cells(i, "A").Value) = "未定" And _ CStr(inSheet.Cells(i, "A").Value) = "" And _ CStr(inSheet.Cells(i, "D").Value) <> "受取済み" And _ CStr(inSheet.Cells(i, "D").Value) <> "注文中" Then inSheet.Rows(i).Copy outSheet.Rows(cnt + 2) cnt = cnt + 1 End If 'End If Next i End Sub

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

    ユーザーフォームのコマンドボタンのリストの イニシャルにWorkSheetの全てのシート名を入れるにはどうしたらいいのでしょうか? 戻り値や引数でデータの受け渡しで行うにはどうしたらいいのでしょうか? 初心者でよくその受け渡しがわかりません。 どうぞご教授よろしくお願いします。

  • Excelユーザーフォームでのデータ検索

    初心者の質問で申し訳ございません。 ユーザーフォームを利用して検索ボタンを作ろうと考えています。 ユーザーフォームでテキストボックスを2個と コマンドボタン1個を作成し、 テキストボックス1に検索したい氏名を入力して コマンドボタンを押すと、 ワークシート(ワークシート名、データ)に作成されたデータのD列から 一致するものを検索し、 一致したデータのA列にある「番号」をテキストボックス2、 表示する。 というマクロが書けず困っています。 よろしくお願いします。

  • VBAでユーザーフォームを再表示させたい。

    ExcelのVBAでユーザーフォームを作成し、 Initializeイベントで初期化をし、コマンドボタンを クリックしたら処理を行うように作成しました。 ところがコマンドボタンによって処理を行った後、 再度Initializeイベントを呼びたいんです。。 (コンボボックスの表示を更新する処理を 含んでいるため) なんとかうまい方法はないでしょうか??

  • エクセル VBA コンボボックスで検索

    エクセルVBA初心者です。 シート1行目には工場名、2行目に見出し、3行目からデータが記入されています。 2行目に見出しとして、A列には作業者名、B列に工事番号、C列から作業時間などが記入されています。 ユーザーフォームにコンボボックス、コマンドボタンを設置し、コンボボックスには工事番号一覧が表示されるようにするところまではできましたが、コンボボックスで工事番号を選択し、コマンドボタンを実行することで、1シート内の一致する行だけを表示したいのですが、いろいろなサイトを参考に試してみたのですがうまくいきませんでした。 同じ内容のシートが複数ありますが、シート毎での検索・抽出をしたいと考えています。 どのようなコードを作成したら良いのかご教授願えたら幸いです。 よろしくお願い致します。

  • Excel VBA

    Excel VBAについて シート1にはデータが入ってます。 G列に日付、L列に商品名、N列に件数。 シート2には集計結果を入力したいです。 セルB2に、日付が10月1日から15日までで、商品名がAの件数の合計。 セルB3は、日付が10月16日から末日まで、セルB4は、日付が11月1日から15日までと半月毎に集計を半年後の末日まで繰返し、B2の数行下には、商品名Bの集計行を作り、その数行下には商品名Cの集計行を作りたいです。 これまでは関数SUMIFSで集計していましたが、複数店舗分のシートの更新・メンテナンスが大変なので、VBAでの集計を考えいろいろ調べてるのですが、方法が思い付かないので、ご教授ください。

  • エクセルでユーザーフォームを利用したいのですが・・・

    エクセルでユーザーフォームを利用したいのですが・・・ ユーザフォームは作れるのですが、なにせ、コマンドボタンを押したときのマクロを教えていただきたいです。 たとえば、A欄に日付B欄に会社名C欄に数字を入力するとしまして、 とうぜん、ユーザーフォームには日付、会社名、数字の入力ボックスとコマンドボタン(入力ボタン)があるわけです。 入力ボタンを押せば順に入力していただきたいのですが、条件があるのです。 その1、1行目2行目は使いますので3行目から入力してもらいたい。 その2、入力順、日付順に並べてほしい。 その2をもう少し詳しく書かせていただきますと、今日に10行分のデータを入力したとしまして あしたの分も2行ほど早めに入力したとします。 明日の分は当然、明日の日付でするわけです。 さて、今日の分を追加したいとき、明日の日付の前にこないと駄目という条件でございます。 よろしゅうおねがいします。