Page 422 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 通常モードに戻る ┃ INDEX ┃ ≪前へ │ 次へ≫ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ▼FindでNothingがかえってくるのは? こうき 02/12/2(月) 14:03 ┣Re:FindでNothingがかえってくるのは? kein 02/12/2(月) 14:35 ┃ ┗Re:FindでNothingがかえってくるのは? こうき 02/12/2(月) 15:41 ┗Re:FindでNothingがかえってくるのは? Taka-mk2 02/12/3(火) 10:45 ┗Re:FindでNothingがかえってくるのは? こうき 02/12/3(火) 17:58 ─────────────────────────────────────── ■題名 : FindでNothingがかえってくるのは? ■名前 : こうき ■日付 : 02/12/2(月) 14:03 -------------------------------------------------------------------------
以下のようなコードを作ったのですが、 実行するとset ran=nothingになってしまいます。 同じ日付はあるのですが、形式の問題なのでしょうか? いまいちFindについてよく分かっていないので、 助言をお願いします。 Dim i As Integer Dim a, o_dir As String Dim ran As Range i = 2 Do While Len(Cells(i, 1)) <> 0 Workbooks("DATA.xls").Activate a = Cells(i, 1) '日付("yyyymmdd"形式のテキスト) d = DateSerial(Left(a, 4), Mid(a, 5, 2), Right(a, 2)) opdir = Cells(1, 12) '開くフォルダ opfn = Cells(i, 11) '開くファイル Range(Cells(i, 7), Cells(i, 8)).Copy Workbooks.Open FileName:=opdir + opfn Workbooks(opfn).Activate Columns(1).Select '同じ日付を検索(形式はyyyy/mm/dd) Set ran = Selection.Find(what:=d,lookIn:=xlValues, _ LookAt:=xlPart,LookAt:=xlPart,MatchByte:=False) '同じ日付を見つけたら、同じ行にデータを貼り付ける。 iy = iy + 1 Loop |
▼こうき さん: >以下のようなコードを作ったのですが、 >実行するとset ran=nothingになってしまいます。 >同じ日付はあるのですが、形式の問題なのでしょうか? >いまいちFindについてよく分かっていないので、 >助言をお願いします。 > >Dim i As Integer >Dim a, o_dir As String >Dim ran As Range > > i = 2 > Do While Len(Cells(i, 1)) <> 0 > > Workbooks("DATA.xls").Activate > a = Cells(i, 1) '日付("yyyymmdd"形式のテキスト) > d = DateSerial(Left(a, 4), Mid(a, 5, 2), Right(a, 2)) > opdir = Cells(1, 12) '開くフォルダ > opfn = Cells(i, 11) '開くファイル > > Range(Cells(i, 7), Cells(i, 8)).Copy > > Workbooks.Open FileName:=opdir + opfn > Workbooks(opfn).Activate > > Columns(1).Select '同じ日付を検索(形式はyyyy/mm/dd) > Set ran = Selection.Find(what:=d,lookIn:=xlValues, _ > LookAt:=xlPart,LookAt:=xlPart,MatchByte:=False) > > '同じ日付を見つけたら、同じ行にデータを貼り付ける。 > iy = iy + 1 > Loop このコードで最も問題なのは"ブックを開いたときのシートが処理対象になって しまう"ということです。ブックから指定して参照するときは、必ずシートも 含めてセル範囲を特定しないと、思わぬトラブルを招きます。 たぶん、こんな感じにすると良いでしょう。(シート名は全てSheet1と仮定) Dim MyR As Range Dim MyD As Long Dim MyF As String, a As String Dim x As Variant Const MyFol As String = "C:\My Documents\" 'Cells(1, 12)のフォルダー名は↑のように定数で宣言しておく With ThisWorkbook.Sheets("Sheet1") Set MyR = .Range("A2", .Range("A2").End(xlDown)) End With Application.ScreenUpdating = False For Each C In MyR a = C.Text MyD = CLng(DateSerial(Left(a, 4), Mid(a, 5, 2), Right(a, 2))) MyF = MyFol & C.Offset(, 10).Value C.Offset(, 6).Resize(, 2).Copy Workbooks.Open MyF With ActiveWorkbook x = Application.Match(MyD, .Sheets("Sheet1").Columns(1), 0) If Not IsError(x) Then .Sheets("Sheet1").Cells(x, 7).PasteSpecial xlPasteValues End If Application.CutCopyMode = False .Close True End With Next Set MyR = Nothing Application.ScreenUpdating = True |
▼kein さん: こんにちは。 先ほどの例を参考にして以下のように書いたのですが、 同じ日付でも(x =02/11/29, d =02/11/29)エラーが出てしまいます。 原因が全くわからないのですが、どうしてでしょう? Dim y As Integer Dim a As String Const o_dir As String = "C:DATA\" iy = 2 Do While Len(Cells(iy, 1)) <> 0 Workbooks("FCV.xls").Activate a = Cells(iy, 1) d = DateSerial(Left(a, 4), Mid(a, 5, 2), Right(a, 2)) o_f = Cells(iy, 11) '格納ファイル名 Range(Cells(iy, 7), Cells(iy, 8)).Copy Workbooks.Open FileName:=o_dir + o_f With ActiveSheet Set ran = .Range(.Cells(1, 1), .Cells(1, 1).End(xlDown)) End With For Each x In ran With ActiveSheet '同じ日付を検索 x = Application.Match(d, Columns(1), 0) If Not IsError(x) Then If iy < 15 Or iy = 20 Then ran.Offset(0, 7).Select Else ran.Offset(-1, 7).Select End If Selection.PasteSpecial Paste:=xlValues Workbooks("FCV.xls").Activate Range(Cells(iy, 9), Cells(iy, 10)).Copy Workbooks(o_f).Activate Selection.Offset(0, -2).Select Selection.PasteSpecial Paste:=xlValues End If End With Next x ActiveWorkbook.Save ActiveWorkbook.Close |
▼こうき さん: こんにちはぁ。 快晴の東京です。 横レスを失礼致します。 > a = Cells(i, 1) '日付("yyyymmdd"形式のテキスト) > d = DateSerial(Left(a, 4), Mid(a, 5, 2), Right(a, 2)) > Columns(1).Select '同じ日付を検索(形式はyyyy/mm/dd) > Set ran = Selection.Find(what:=d,lookIn:=xlValues, _ > LookAt:=xlPart,LookAt:=xlPart,MatchByte:=False) ざっとみたところ、シリアル値で検索しているようですね。 ここが問題なのだと思います。 検索対象のシート側がシリアル値で表示されているのなら、Findでヒットしますが、 表示形式がyyyy/mm/ddなのですよね? それであるならば、dをDate型で宣言して d = CDate(Left(a, 4) & "/" & Mid(a, 5, 2) & "/" & Right(a, 2)) とすると、Findでひっかかるようになると思います。 自分のところではそれでひっかかりました(2000)。 いじょ、ご参考になれば。 よろしくです。 |
▼Taka-mk2 さん: こんにちは。 >快晴の東京です。 ほんとにいい陽気で。(年寄りくさいですね) >ざっとみたところ、シリアル値で検索しているようですね。 >ここが問題なのだと思います。 >検索対象のシート側がシリアル値で表示されているのなら、Findでヒットしますが、 >表示形式がyyyy/mm/ddなのですよね? >それであるならば、dをDate型で宣言して > >d = CDate(Left(a, 4) & "/" & Mid(a, 5, 2) & "/" & Right(a, 2)) > >とすると、Findでひっかかるようになると思います。 >自分のところではそれでひっかかりました(2000)。 確かに検索できました。 ありがとうございます。 |