VBAを使用したテキストボックスの日付と文字列の処理

このQ&Aのポイント
  • VBAを使用して、テキストボックスに入力された日付データを基に、条件に該当する行を別のシートにコピーする処理を行いたいです。
  • テキストボックスの日付データはyyyy/m形式で半角入力されることを想定しており、全角入力された場合はエラー表示させる方法も知りたいです。
  • 商品シートの日付データには日付以外にも文字列データが存在し、これも抽出の対象にしたいです。また、結果シートには商品シートの3行目のヘッダー情報を先頭に置き、該当行を順次コピーしていきたいです。
回答を見る
  • ベストアンサー

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

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

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

  • ベストアンサー
回答No.1

ヒントのみですが IsDate関数でセルの値が日付かどうかチェックする。 日付なら、日付の場合の処理をおこなう。 日付でないなら そのセルが空欄かをチェック。空欄の場合の処理。 そのセルが未定かをチェック。未定の場合の処理。

関連するQ&A

  • if文について

    Excel 2007 VBAを使用しています。 ↓のクリックイベントを実行するとif文のところで不具合があります。 商品シートのC列には、状況が保存されています。 該当した年月、"受取済み"、"注文中"以外の行データをリストさせます。 商品シートのJ列、W列には、該当した年月、"受取済み"、"注文中"以外の行データが存在するのですが、まったく検出してくれません。 対処方法を教えてくれませんか? ------------------------------------------- Option Explicit Private Sub CB1_Click() '変数を定義 Dim i As Long Dim maxRow As Long Dim inSheet As Worksheet Dim outSheet As Worksheet '入出力先のシートをオブジェクト変数へ格納 Set inSheet = Worksheets("商品") Set outSheet = Worksheets("結果") 'テキストボックスの内容を判定 If (Me.TextBox21.Value = "") Or (Not IsDate(Me.TextBox21.Value)) Then MsgBox "日付が入力されていません" Exit Sub End If '最終行番号を取得 maxRow = Me.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 'J列が日付であれば処理 If IsDate(inSheet.Cells(i, "J").Value) Then '--------機能しない箇所(開始) If Year(inSheet.Cells(i, "J").Value) <= Year(Me.TextBox21.Value) And _ Month(inSheet.Cells(i, "J").Value) <= Month(Me.TextBox21.Value) And _ CStr(inSheet.Cells(i, "W").Value) <> "受取済み" And CStr(inSheet.Cells(i, "W").Value) <> "注文中" Then '--------機能しない箇所(終了) inSheet.Rows(i).Copy outSheet.Rows(cnt + 2) End If End If Next i End Sub

  • Excel VBA; 複数のループ処理

    ↓のようなコードがあります。 Dim i As Long, MaxRow1 As Long, MaxRow2 As Long MaxRow1 = Worksheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row MaxRow2 = Worksheets("Sheet2").Cells(Rows.Count, 1).End(xlUp).Row For i = 1 To MaxRow1 Worksheets("Sheet1").Cells(i, 1).Value = i . Next i For i = 1 To MaxRow2 Worksheets("Sheet2").Cells(i, 1).Value = i . Next i これらを最大行の多いシートに合わせて、パフォーマンスを良くしたいと思います。 同様の処理をシート1、シート2で実施しているので纏めて記述したいです。 シート1、シート2に対する処理をサブルーチンにする方法しかありませんか? どなたかお願いします。 If MaxRow1 >= MaxRow2 Then For i = 1 To MaxRow1 Else For i = 1 To MaxRow2 End If Worksheets("Sheet1").Cells(i, 1).Value = i Worksheets("Sheet2").Cells(i, 1).Value = i . Next i

  • Excel VBAで文字列の部分一致の文字列を表示

    以前、こちらで頭5文字までの一致で文字列を表示するVBAを教えて頂きました。今回はFINDなどの部分一致での文字列を表示することをしたいのですが、ご教示いただけますと幸いです。 下記はSheet1のA3に文字を5文字以内いれるとSheet2のC列からピックアップしてSheet1のA列に文字列を表示する及びSheet2のB列のデータをSheet1のC列に表示させるVBAです。 Sub Test2() Dim Ws1 As Worksheet, Ws2 As Worksheet Dim SData As String, i As Long, VRet As Variant Dim c As Range, LastRow As Long Set Ws1 = Sheets("Sheet1") Set Ws2 = Sheets("Sheet2") SData = CStr(Ws1.Range("A3").Value) If SData = "" Then Exit Sub i = 5 LastRow = Ws1.Cells(Rows.Count, "A").End(xlUp).Row If LastRow < i Then LastRow = i End If Ws1.Range(Ws1.Cells(i, "A"), Ws1.Cells(LastRow, "C")).ClearContents With Ws2 For Each c In .Range(.Cells(1, "C"), .Cells(Rows.Count, "C").End(xlUp)) VRet = InStr(1, CStr(c.Value), SData, vbTextCompare) If VRet = 1 And Len(c.Value) >= 10 Then Ws1.Cells(i, "A").Resize(1, 2).Value = c.Resize(1, 2).Value 'とりあえずSheet2のB列のデータ(C列のデータに同期したデータ)をSheet1のC列に Ws1.Cells(i, "C").Value = .Cells(c.Row, "B").Value i = i + 1 End If Next End With End Sub 宜しくお願い致します。

  • VBA 別のシートから文字列参照して全て表示

    ExcelのVBAでSheet1のA3に5文字の文字列(大文字、小文字を区別しない)を入力してSheet2のC列にあるA3の文字列から始まるデータ(10文字以上)をすべてを参照してSheet2のD列を含めSheet1のA5,B5から下にすべて表示させる。 宜しくお願い致します。 Sub macro1() Dim V2 As Variant V1 = Sheets("sheet1").Cell("A3").Value '文字列を取得 V2 = Application.InStr(Sheets("sheet2").Range("C:C"), V1) '検索するテーブルでC列の文字列を探す 'みつけたら、その行、無かったら、エラーのコードが変数に入る If IsError(V2) Then 'テーブルに無かったらなにもしない Else str0 = Worksheets("Sheet2").Cells(V2, 7).Value str1 = Worksheets("Sheet2").Cells(V2, 8).Value str2 = Worksheets("Sheet2").Cells(V2, 9).Value Worksheets("sheet1").Cells(i, 2).Value = str0 Worksheets("sheet1").Cells(i, 3).Value = str1 Worksheets("sheet1").Cells(i, 4).Value = str2 End If End Sub

  • Excel VBA でテキストボックスの値をセルA列から検索

    いつもお世話になります。 Private Sub CommandButton3_Click() Dim 行 As String Dim 列 As String Dim 最終行 As String Dim 検索行 As String Dim メッセージ As Integer Dim 一致 As Range Dim myNO As Variant Dim i As Long Sheets(3).Select 最終行 = Range("A2").End(xlDown).Offset(1).Select 行 = ActiveCell.Row 列 = ActiveCell.Column myNO = TextBox2.Value 検索行 = Range("A2").End(xlDown).Select ※・・・Set 一致 = Range("A2:検索検").Findwhat:=TextBox2,lookat:=xlWhole) If 一致 Is Nothing Then MsgBox "データがありません。新規コード入力します。" Cells(行, 列 + 0) = UserForm1.TextBox2.Value Cells(行, 列 + 1) = UserForm1.ComboBox7.Value Else i = Cells(行 - 1, "A") Cells(i, 列 + 0) = UserForm1.TextBox2.Value Cells(i, 列 + 1) = UserForm1.ComboBox7.Value End If End Sub 「エラー1004'Range'メソッドは失敗しました'Global'オブジェクト」とでます。※印が黄色になっています。 ユーザーフォーム1のテキストボックスの値をシート3のA列から検索して、一致すれば、A列の一致セルに上書き入力して、一致が無い場合はA列の空白セルに追加入力したいのです。よろしくお願い致します。

  • 二つのマクロで一気に処理したい

    以下のようなことができるのかお伺い致します。よろしくお願い致します。  やりたいこと   ※ 前提として、sheet1にすでにA列に通し番号で奇数の数字が入っている。    1.sheet1からsheet2へコピペーストする。しかし、A列からO列のすべてにデータがあった場合のみコピー貼り付けさせたい。     (前提で示したように、A列に通し番号で奇数の数字が入っていて、A列のみ数字があり、以外が空欄の行があるため)    2.下記のコピー貼り付けのコードと重複削除のコードを合体させて、一つの処理で動かしたい。 Sub コピー貼り付けつけ()  'コピー貼り付けつけのコード Dim lastRow As Long 'Sheet1のA3から最終行までをコピー With Sheets("sheet1") .Range("A3:O" & .Cells(Rows.Count, "A").End(xlUp).Row).Copy End With 'Sheet2のA列の最終行の次の行に貼付け Sheets("sheet2").Cells(Rows.Count, "A").End(xlUp).Offset(1).PasteSpecial Application.CutCopyMode = False End Sub Sub 重複データを一括削除する() ' Macro1 Macro Dim i As Long, lastRow As Long, myRng As Range LastRow = Cells(Rows.Count, "A").End(xlUp).Row For i = 1 To lastRow - 1 If WorksheetFunction.CountIf(Range(Cells(i + 1, "O"), Cells(lastRow, "O")), Cells(i, "O")) > 0 Then If myRng Is Nothing Then Set myRng = Cells(i, "O") Else Set myRng = Union(myRng, Cells(i, "O")) End If End If Next i If Not myRng Is Nothing Then myRng.EntireRow.Delete End If End Sub

  • VBA メッセージボックス表示後の処理について

    ExcelのVBAで質問があります。 たとえばA列に同じ情報が入力されているシート1とシート2がある状態で、 シート2のA列の情報を変更(または追加や削除)をするとします。 シート2にコピペなどでデータを貼り付けた際、既存情報を変更した 場合は、シート1とシート2の値を比較して"既存情報は変更できません"の メッセージボックスを表示させています。 その後の処理で、シート1とシート2の値を比較して、異なっている値については 元に戻したいのですが、新規追加(シート1がブランクのセルに対してシート2に値が入っている) の場合は値を残したままにしたいです。 For i = 1 to EndRow If worksheets("シート1").cells(i,1).value<>worksheets("シート2").cells(i,1).value and worksheets("シート1").cells(i,1).value <> "" and worksheets("シート2").value <> "" then msgbox "既存情報は変更できません" vbOKOnly この後のコードをどう記述したらよいでしょうか。 (またはIf文の条件指定を修正した方がよろしいでしょうか) ご存知の方がいらっしゃいましたらご教示お願いいたします。

  • テキストボックス2列の値をシート1AB列に入力

    実行2クリックで2列のテキストボックス1~7の値をsheet1のA列、テキストボックス11~17の値をB列に入力したいのですが下記の方法にどうコード追加していいのかわかりません。どなたかコードが解る方よろしくお願いします。 Private Sub 実行2_Click() For i = 1 To 1000 If Sheet1.Cells(i, 1.Value = vbNullString Then: Exit For Next For Each o In UserForm1.Controls Dim c As MSForms.Control Set c = o If c.Name Like "TextBox*" Then Dim t As MSForms.TextBox Set t = c If t <> vbNullString Then Sheet1.Cells(i, 1.Value = t i = i + 1 t = vbNullString End If End If Next End Sub

  • 下記のマクロはC列5行目から文字の

    下記のマクロはC列5行目から文字の入っている最後の行までの範囲で セル内に蜜柑や林檎、苺の文字が入っていたら同一行のA列にも蜜、林、苺 の文字を入れるというマクロなのですが・・・ たとえばC列12行目が 『蜜柑林檎苺』 となっていた場合、A列に入る言葉は『苺』となり『蜜』『林』という言葉が 消えてしまいます。 そこでこのマクロを少し改造して、 C列が『蜜柑林檎苺』や『蜜柑苺』となっている場合 A列に入る言葉は『蜜林苺』ないし『蜜苺』という風に積み重ねていくように改造はできないでしょうか? ↓この部分を改造すればできるようになりますか? Cells(i, 2).Offset(0, -1).Value = "蜜" Sub 蜜柑林檎苺() Dim i As Long With ActiveSheet For i = 5 To .Cells(Rows.count, "C").End(xlUp).Row If InStr(.Cells(i, "C"), "蜜柑") > 0 Then MsgBox i & "行目アウト!" Cells(i, 2).Offset(0, -1).Value = "蜜" End If If InStr(.Cells(i, "C"), "林檎") > 0 Then MsgBox i & "行目アウト!" Cells(i, 2).Offset(0, -1).Value = "林" End If If InStr(.Cells(i, "C"), "苺") > 0 Then MsgBox i & "行目アウト!" Cells(i, 2).Offset(0, -1).Value = "苺" End If Next i End With End Sub

  • 比較演算子 <> について

    Excel 2007 VBAを使用しています。 ↓のコードを実行するとif文のところで不具合があります。 商品シートのC列には、状況が保存されています。 "受取済み"、"注文中"以外の行データをリストさせます。 商品シートのC列には、"受取済み"、"注文中"以外の行データが存在するのですが、まったく検出してくれません。 セルの書式は標準になっています。 対処方法を教えてくれませんか? Dim i As Long Dim inSheet As Worksheet Set inSheet = Worksheets("商品") For i = 1 To 10 If CStr(inSheet.Cells(i, "C").Value) <> "受取済み" And _ CStr(inSheet.Cells(i, "C").Value) <> "注文中" then . . End if Next i

専門家に質問してみよう