エクセルVBAでFINDで年月のみを取得したいのですが

このQ&Aのポイント
  • エクセルVBAを使用して、FIND関数を使って年月のみを取得する方法を知りたいです。
  • 注文表には日付、顧客コード、品目コード、価格が入力されています。日付は古い順にならんでおり、同じ日付の行も複数あります。
  • 現在はdo loopを使用して年月のみを取り出していますが、より簡単な方法がないか検討しています。
回答を見る
  • ベストアンサー

エクセルVBAでFINDで年月のみを取得したいのですが。

環境はWIN98、エクセル2000です。 注文表を日付、顧客コード、品目コード、価格の順で入力しています。 A列に2001/2/18のように日付を入れています。日付は古い方から順にならんでいます。また、同じ日付の行もたくさんあります。 例えば、2001年2月の注文だけをシート2に書き出すために、現在はdo loopを使用し、日付から年月のみを取り出し、該当年月の最初の行と、月が変わった行を探し、この範囲を範囲指定してコピーでシート2に写しています。 FINDを使えばもっと簡単に指定月の最初の行と、最後の行を簡単に見つけられるのでは、と思い、いろいろ試してみましたが、いい方法が見つかりません。 FINDNEXTでは、最初に2001/2/1とすると次の日付(2001/2/2)が検索され、2001/3月が検索できません。 簡単に探したい月の最初に日付行と最後の日付行を検索する方法はありませんでしょうか。 ご存じの方、よろしくお願いします。

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

  • ベストアンサー
  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.2

問題を、昇順に並んだ日付から指定した年月のデータを抽出して別シートに書き出す。と理解しましたので下記のコードを書いてみました。 <条件>質問から、「日付、顧客コード、品目コード、価格」がA1からD1に入力されていて、データは2行目から連続に入力。またセル「F2」に抽出する年月日を「yyyy/m/d」で入力(日は月末までの任意)としています。 <要点>2月を検索する時に、翌月の3月1日を検索することにすると、まだ2月の時はデータがありませんし、休日とかで注文が無い場合も想定されると思い、指定した2月を1ヶ月間調べるようにしています。 Findを行った後、見つかったらFindNextを行って重複データを探しています。Sheet2は書き出すときにクリアしています。 コードを書きながら思ったことですが、このような処理はデータベースソフト(Accessとか)を使ったほうが便利かな・・・と。データがどんどん増えていく場合はExcelは不向きかもしれませんし・・・? 質問の意を汲んでいればと思います。がんばってください。 下記コードを標準モジュールを追加して、貼り付けてください。シート1からマクロKensakuを実行します。コードを登録すると先頭空白が消えるので、段下げをしてもらえば見やすくなると思います。 Option Explicit Public Sub Kensaku() Dim wk1, wk2 As Worksheet 'ワークシート Dim schRg As String '検索範囲 Dim iYY, iMM As Integer '検索値(年、月) Dim sDate As Date '検索値(年月日) Dim tDate As String '検索値(テキスト) Dim c '検索結果セル Dim fstFind As String '最初に検索したセル Dim Xpot1, Xpot2 As String 'セル座標(左上と右下) Dim d As Integer '日付カウンタ '設定 Set wk1 = Worksheets("Sheet1") Set wk2 = Worksheets("Sheet2") wk1.Activate: Range("A1").Select iYY = Year(wk1.Range("F2")) 'セルF2に年月日を入力!! iMM = Month(wk1.Range("F2")) '検索範囲 schRg = "A1:A" & ActiveSheet.UsedRange.Rows.Count '============================== 'F2に入力した年月を1ヶ月間検索 '============================== With wk1.Range(schRg) For d = 1 To Day(DateSerial(iYY, iMM + 1, 1) - 1) sDate = DateSerial(iYY, iMM, d) tDate = Application.Text(sDate, wk1.Range("A2").NumberFormat) '検索実施 Set c = .Find(tDate) '見つかった! If Not c Is Nothing Then fstFind = c.Address: Xpot2 = c.Offset(0, 3).Address '最初の検索アドレス If Xpot1 = "" Then Xpot1 = fstFind '重複日を調べる Do Set c = .FindNext(c) If c.Address <> fstFind Then Xpot2 = c.Offset(0, 3).Address End If Loop While Not c Is Nothing And c.Address <> fstFind End If Next End With '===================== '検索結果をシート2にコピー '===================== If Xpot1 <> "" Then 'シート2をクリア wk2.Select: Cells.Select: Selection.ClearContents 'コピー wk2.Range("A1") = wk1.Range("A1") '表題 wk2.Range("B1") = wk1.Range("B1") wk2.Range("C1") = wk1.Range("C1") wk2.Range("D1") = wk1.Range("D1") wk1.Select: Range(Xpot1 & ":" & Xpot2).Select Selection.Copy '貼り付け wk2.Select: Range("A2").Select: ActiveSheet.Paste Range("A1").Select '復帰 wk1.Select: Range("F2").Select Else MsgBox "該当データがありません" End If End Sub

taneyan
質問者

お礼

ありがとうございました。 FINDNEXTをこのように使うと良いんですね。 早速組み込んでみます。 質問では、簡単に書きましたが、商品コード、区域など入力項目は20項目程度あります。 このデータはオンライン入力データを加工して、サーバーに保存され、必要な部署が自由に利用できるようになっています。 おっしゃるようにアクセスを利用する方が良いとは思いますが、当社の規定表計算ソフトはエクセルで、エクセルは全端末にインストールされており、どこでも利用出ます。 それと、アクセスは利用する部署で別途購入が必要になりますのと、使える人がいません。エクセルは集合研修も行い、ほとんどの人が使えます。 データ件数も月間4万件程度ですので、何とかエクセルで間に合わせてます。 ご助言ありがとうございました。

その他の回答 (1)

  • kbonb
  • ベストアンサー率51% (254/492)
回答No.1

こんにちは  以下のページがご参考になるのでは? [XL2000]Find メソッドで日付と時刻形式のデータを検索できない http://www.microsoft.com/JAPAN/support/kb/articles/J055/6/07.htm

参考URL:
http://www.microsoft.com/JAPAN/support/kb/articles/J055/6/07.htm
taneyan
質問者

補足

ありがとうございました。 でも、ちょっと違うんです。 日付(2001/2/1のようにきろくされています)はFINDで検索できますが、この日付の内2001/2の最初の行及び2001/2/28の最後の行又は2001/3/1の最初の行を検索し、当該行の値を知りたいのです。 注文を受けたものを順に記録しますので、同じ日付はたくさんあります。 よろしくお願いします。

関連するQ&A

  • エクセルVBAのFINDの質問です。

    エクセルVBAのFINDの質問です。 シート1    A    B    C     D 1 コード1 コード2 コード3 名 称 2  4    1     1 3  4    2     2 4  4    3     1 シート2    A    B 1 コード1 名 称 2  1   名称1 3  2   名称2 やりたいことは、シート1のD列に、シート1のコード3をもとにシート2から名称を取得したいのです。 下記に記したプログラムだと最初のFINDNEXTは動くのですが、 2回目でエラーになってしまい、次を読んでくれません。 どなたか、ご教授頂けますでしょうか。 シート1の検索条件はコード1の"4"です。 シート1のコード1は重複キーで、一レコードずつ読んで行き、各レコード毎にシート2を読みたい のです。 Dim シート1 As Worksheet Dim シート2 As Worksheet Dim obj As Object Dim Lin As Integer Dim mykey As Integer Dim obj1 As Object Dim Lin1 As Integer Dim mykey1 As Integer Dim st_Lin As Integer Set シート1 = ThisWorkbook.Worksheets("シート1") Lin = シート1.Cells(シート1.Rows.Count, 1).End(xlUp).Row mykey = "4" Set obj = シート1.Range("A1", "A" & Lin).Cells.Find(What:=mykey, _ LookIn:=xlValues, _ lookat:=xlWhole, _ SearchOrder:=xlByColumns) If obj Is Nothing Then   MsgBox ("異常です")   Exit Sub Else   st_Lin = obj.Row   Do Until obj.Row <> st_Lin    Set obj = シート1.Range("A1", "A" & Lin).FindNext(obj)    If obj Is Nothing Then     Exit Do    Else     Set シート2 = ThisWorkbook.Worksheets("シート2")       With シート2          Lin1 = .Cells(シート2.Rows.Count, 1).End(xlUp).Row          mykey1 = シート1.Cells(obj.Row, 3).Value          Set obj1 = .Range("A1", "A" & Lin1).Cells.Find          (What:=mykey1,LookIn:=xlValues,lookat:=xlWhole,SearchOrder:=xlByColumns)          If obj1 Is Nothing Then           MsgBox ("名称取得できませんでした")           Exit Sub          Else            シート1.Cells(obj.Row, 4).Value = .Cells(obj1.Row, 2).Value          End If       End With    End If   Loop End If

  • エクセルVBAのFindの不具合

    入力シートの4~2000行にデータをフォームを使って入力し、そのフォームを閉じる際に集計シートで集計する家計簿を作ってます。集計シートでは、食費・交際費などのコードがB5:B22に入っており、それぞれの合計をC5:C22に表示させたいのです。SUMIFを使えば楽なのですが、勉強のために極力VBAで処理させます。 フォームを閉じた際のソース(抜粋)は以下の通りです。 -------------------------------- Private Sub CommandButton2_Click() Dim i As Integer Dim コード As Integer Dim 金額 As Long Dim 集計行 As Integer Dim コード範囲 As Range Unload Me Set コード範囲 = Worksheets("集計").Range("b5, b22") For i = 4 To 2000 コード = Cells(i, 3).Value 金額 = Cells(i, 5).Value 集計行 = コード範囲.Find(コード).Row Next i End Sub -------------------------------- For~Nextの中はもっと処理を追加しなければならないのですが、とりあえず現段階で、   実行時エラー91(オブジェクト変数またはWithブロックが設定されていません) が   集計行 = コード範囲.Find(コード).Row の行で発生します。行番号だけを取得しようとしているので、Findの行だけを整数型変数に代入したいのですが・・・ 間違っている点をお教え下さい。 ご面倒でなければ、 Application.WorksheetFunctionに置き換える方法も教えていただければ幸いです。 よろしくお願いします。

  • Excel VBA Sheet2で指定した条件でSheet1の行削除

    Sheetが2つあるExcelブックがあります。 Sheet2で検索条件(列とキーワード)を指定し、 この条件でSheet1を検索、 Sheet1で検索にヒットした行を行削除したいと考えています。 汎用性を高める為、Sheet2で指定する検索条件は可変とし、 検索対象とする列とキーワードは任意のものを必ず指定(""は無し)。 列&キーワードをひとつの検索条件として、 Sheet2の2行目~最終行までLoopしたいのです。 InStrを使用するなど、部分的には分かるのですが、 2つの条件を同時に変えながらLoopさせる方法が 色々試してみましたが、どうしても分かりません。 VBAに詳しい方、同様の処理をしたことがある方、 どうか助けてください!宜しく御願い致します。 [Sheet1] ・・・ 元データ     A   B   C ---------------------------- 1   あ ---------------------------- 2   い   該当 ---------------------------- 3   う       閉鎖 ---------------------------- 4   え   該当 ---------------------------- 5   お ---------------------------- [Sheet2] ・・・ 行削除する範囲とキーワードを指定。     A   B ---------------------------- 1   列   キーワード ---------------------------- 2   A   あ ---------------------------- 3   B   該当 ---------------------------- 4   C   閉鎖 ---------------------------- [求めている結果] 1, 2, 3, 4行目が削除される

  • VBA Findの使い方

    以下のコードは、最初の見つかったXYZに対しては、正しく処理されますが、 その後はうまくいきません。 なぜ、なのでしょうか? また、どうすれば見つかったすべてのXYZに対して処理ができるのでしょうか? (B列からxyzを検索し、その隣のセルに99を入力する) Sheets("Sheet1").Select Do While (True) Columns("B:B").Select Set mySelect = Selection.Find(What:="XYZ") If mySelect Is Nothing Then Exit Do mySelect.Offset(, 1).Value = 99 Loop End Sub

  • エクセル2007 VBA シート1に入力されている項目をシート2の中で

    エクセル2007 VBA シート1に入力されている項目をシート2の中で検索し、新規シートにコピーする方法についてです。 例) シート1 A        B  C 取引先名 品目C 数量 A      1-1 25 B      あ12  5 C      T-8 10 :       :    : シート2 A       B    C      D    E 得意先C 取引先名 製品名  品目C  数量 001    (株)B    ケーブル あ12  10 002    (株)A    箱     1-1  20 002    (株)A    箱     1-1   7 002    (株)A    箱     1-1   5 :       :     :      :     : 上記の状態で、シート1の項目をシート2から検索します。 ・取引先名は一部分でも一致するあいまい検索で、品目Cは完全一致で検索したいです。 ・シート2には検索項目のデータが複数あるのですが、結果が一致する行を選択し新規シートにコピーペーストしたいです。 出来れば下記の処理も実行したいです。 *シート1の数量を、シート2の1行目から順に検索したデータから計算して、シート1の数量に満たした分だけをコピーペーストしたいです。  シート1の数量に満たさない場合も取り敢えずシート2にある分のデータをコピーペーストして、処理が終わったら不足している項目データに印をつける。  取引先Aの場合→数量が20個と7個の行をコピーペーストする感じです。 グーグルで調べたのですが、調べ方が悪いのか最初から躓いてしまいました。 今回はコードを記入していなくてすみません。 サンプルコードありで教えていただけるととても助かります。よろしくお願いします。

  • EXCEL VBAのFind について

    VBAで、特定の文字が入っているセル位置(結合セル)を取得したく、 シートのコード記述で --- Private Sub Worksheet_Change(ByVal Target As Range) Dim w_CelObj As Object Set w_CelObj = ActiveSheet.Cells.Find(What:="あああ", LookAt:=xlWhole, MatchByte:=False) MsgBox w_CelObj.Row MsgBox Cells.Find(What:="いいい").Row End Sub ----- と記述し、"aa"も"bb"もどちらの方法でも取得できました。 ですが、これを別のEXCELブック(既にシートがたくさんあり、コードもびっしり記述してあります)で同様のことを行おうとするとエラーになってしまいます。 ※新しいシートを作成し、そのシートにコードをコピーして試しました。 セルの結合を解除すると正常に取得できるのですが、結合セルだとFindされてきません。 調べてみましたが、「Cells.Find」ときちんとセル全体を指定していれば大丈夫のようで、同様の事例を検索できませんでした。 他に何を調べればよいでしょうか? ご協力よろしくお願いします。

  • エクセルの条件付き書式について

    国内向け製品の品目コードをシート1に、海外向け製品の品目コードをシート2にそれぞれ記述しておき、シート3に任意の品目コードを記述したとき、当該品目コードが国内向け製品ならば赤い文字に、海外向け製品ならば青い文字に表示したと思います。 シート1とシート2の品目コードに名前設定をして、条件付き書式で『数式が , =セルポイント=名前』にしてみたのですが、上手くいきません。シート1、シート2とも第一行目に登録した品目コードをシート3に記述すると思い通りの動きをしてくれるのですが、2行目以降の品目コードだと色が変わってくれません。 根本的にやり方が間違っているのでしょうか?

  • VBAを使った、Excelでのシート間データ抽出

    はじめまして。みなさまどうか教えてください。 Sheet1にはA列に250行程、コードが存在します。 Sheet2にはA列(コード)からI列まで、そして1000行程データが存在します。 Sheet1にあるコードは重複はなく、Sheet2のコード内に必ず同じコードがあります。 Sheet2にも重複コードはありません。 そこでSheet1のコードを使い、Sheet2を検索し、同一コードのデータ(A列からI列の行すべて)を全て(250件分)、Sheet1のコード記載順(A1、A2、A3・・・・)で、Sheet3に抽出したいのです。 どうか、よろしくお願いします。

  • エクセルデータにランク付けしたい

    データ一覧には、品目コード(数百あり)、所属名(50程度あり)、数量が入っていますがそれぞれの品目コード毎に数量の多い所属順にランク付けしたいのですが、RANK関数を使うと品目コード毎に範囲指定が必要になりますよね? また、品目コード、数量(降順)でソートをかけて順位を付けても、品目コード毎に1~の順位は付けられません。これってエクセルでは無理ですか。困っています教えてください。

  • エクセルVBAでFindを使った検索について

    エクセル2003でVBAを勉強し始めたものです。 findを用いた検索についてご教授をお願いしたく、ご質問させていただきます。 まず、 <シート1> A列:受付No. B列:氏名 C列:物件名 <シート2> A~F列:省略 G~O列:物件名 とあります。 シート1上にコマンドボタンがあり、クリックするとシート1への入力用フォームが開きます。 さらに、そのフォーム内のテキストボックスに物件名を入力するのですが、テキストボックス内でダブルクリックで、物件検索用のフォームが開きます。 物件検索用フォーム内のテキストボックス(Text物件名検索)に文字列を入力し、コマンドボタン(command物件名検索)をクリックすると、フォーム内下部のリストボックス(List物件検索結果)内に、シート2のG~O列を検索した結果が並ぶようになっています。 その候補の中から選択したものが、シート1の物件名の列に並ぶようにしたいのです。 そこで、エクセルファイルを開いたすぐ後は、検索結果が意図通りに表示するのですが、一度他のコード(マクロにてシート1の行削除等)を実行した後、再度物件検索を行うと、検索結果が“なし”(その場合は「見つかりませんでした」とメッセージボックスが開くようにしてあります)となってしまいます。 変数の扱いがわるいのでしょうか?・・・ どうぞご教授のほどよろしくお願いいたします。 以下、検索用フォームのテキストボックス入力後、コマンドボタン(command物件名検索)をクリックしたときの処理コードです。 --------------------------------------- Private Sub command物件名検索_click() Dim bname As String Dim fndrange As Range Dim firstcell As String bname = Text物件名検索.Text Set fndrange = Sheets("TBオーナー").Columns("g:o").Find(bname) If bname = "" Then MsgBox ("キーワードを入力してください") Exit Sub Else If fndrange Is Nothing Then MsgBox ("見つかりませんでした") Text物件名検索.Text = "" Text物件名検索.SetFocus Else If Not fndrange Is Nothing Then firstcell = fndrange.Address Do Set fndrange = Sheets("TBオーナー").Columns("g:o").FindNext(fndrange) List物件検索結果.AddItem fndrange.Value Loop While Not fndrange Is Nothing And fndrange.Address <> firstcell End If End If End If End Sub ----------------------------------------- また、関係あるかわかりませんが、他のコード(シート1から行を削除するマクロ)も掲載させていただきます。 以下、 -------------------------------------- Private Sub Command削除_Click() Dim t As Long Dim DelNo As String Dim delNos As Long Dim s As Range DelNo = InputBox("削除するデータNOを入力してください") delNos = Val(DelNo) Set s = Sheets("TBマスター").Columns("A").Find(delNos, lookat:=xlWhole) If DelNo = "" Then Exit Sub ElseIf s Is Nothing Then MsgBox ("データがありません") Exit Sub Else t = Sheets("TBマスター").Columns("A").Find(delNos, lookat:=xlWhole).Row Rows(t).Delete End If End Sub --------------------------------------------------------- 質問のが悪いかも知れませんが、必要なことがあれば随時追記させてください。 以上、よろしくお願いいたします。

専門家に質問してみよう