[[20090208103047]] 『コードを検索して表を転記したい』(たかなし) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『コードを検索して表を転記したい』(たかなし)

 こんにちわ
[[20090206112718]][[20090123142335]]でお世話になりましたたかなしと申します。
 また突っかかってしまいましたので教えていただけたらと存じます。
 今回は、表Aのコードを検索し、表Bの所定の場所に転記したいといったものです。
 私の考え方では、表Aのコードを行3から行24までのコードをFindを使って表Bのコードから
 同じコードの行を取得しそこから列を操作して表Aの日付を表Bの生産日と比較し、
 一番古いものに1GH所要時間を上書きさせるといった感じです。

 表A
    A       B    C     D      E     F     G      H      I        J       K       L
 1   
 2   日付    コード 品名  BH数 開始時間    終了時間 休憩  必要人数 所要時間 合計 1BH所要時間
 3 2009/2/3 457220 品名1  5    9:00   〜  12:00    10     3        170     510      34.0
 〜
 24

 表B 1B所要時間 シート      ★訂正
     A     B        C         D          E         F         G          H         I      J      K
 1 コード 品名	 生産日  1B所要時間   生産日   1B所要時間  生産日   1B所要時間  平均値  最大   最小
 2 450050 品名A 2009/2/3    150      2008/12/7    160    2008/11/5     140      150     160    140
 3 857955 品名B						
 〜
 300

 以下のようにマクロを組んでみたのですが、このままだと「Withブロックが必要です」といわれ
 最初のIfからFor iiまでをWith Sheets("BH計算")で囲むと、今度はFindの時に「オブジェクトがありません」
 といわれ行き詰まってしまいました。
 http://home.att.ne.jp/zeta/gen/excel/c04p42.htm
 こちらを参照したりほかにも検索をかけて見たのですが、結局わからなかったため質問させていただきます。

 Sub 所要時間書き込み()
    Dim ID, 行, 列
    Dim 検索行, 検索列, 検索表
    Dim 一覧日付, 新規日付, 一覧時間, 新規時間
    Dim i, ii, iii, x, y, z
    検索表 = Sheets("1B所要時間").Range("A6:A1006")
    x = 10
    For i = 3 To 24
        c = Sheets("BH計算").Cells(i, 1)
        If c = "" Then Exit Sub
                新規日付 = Sheets("BH計算").Cells(i, 1).Value
                新規時間 = Sheets("BH計算").Cells(i, 11).Value
                Sheets("1B所要時間").Range("A6:A1006").Find(What:=新規日付, LookIn:=xlValues).Activate
                    検索行 = ActiveCell.Row
                    検索列 = ActiveCell.Column
                'Find(What:=新規日付, After:=ActiveCell, LookIn:=xlValues, LookAt _
                ':=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
                'False, MatchByte:=False).Activate
                        For ii = 3 To 7 Step 2
                            x = x - 2
                            一覧日付 = Sheets("1B所要時間").Cells(検索行, 検索列 + ii)
                            一覧時間 = Sheets("1B所要時間").Cells(検索行, 検索列 + x)
                                If 一覧日付.Value + 10 < 新規日付 Then
                                    一覧日付 = 新規日付
                                    一覧時間 = 新規時間
                                End If
                        Next ii
    Next i
 End Sub

 よろしくお願いいたします。
 (たかなし)

 全部は検証してませんが、
 >「Withブロックが必要です」といわれ
 は
 >Sheets("1B所要時間").Range("A6:A1006").Find(What:=新規日付, LookIn:=xlValues).Activate
 で検索しているのに見つからないからでしょう。

 新規日付 = Sheets("BH計算").Cells(i, 1).Text  '変更
 新規時間 = Sheets("BH計算").Cells(i, 11).Value
 Sheets("1B所要時間").Range("A6:A1006").Find(What:=CDate(新規日付), LookIn:=xlFormulas).Activate  '変更
 のようにしてみたらどうでしょうか?

 (じゅんじゅん)

 じゅんじゅん様
 Withブロック「の変数」が必要です。のエラーはでなくなりました。
 ありがとうございます。
 検索値も間違っていたことがわかりましたのでいくつか訂正いたしました。

 Sub 所要時間書き込み()
    Dim コード As String, 行, 列, 日付
    Dim 検索行, 検索列, 検索表
    Dim 一覧日付, 新規日付, 一覧時間, 新規時間
    Dim i, ii, iii, x, y, z
    検索表 = Sheets("1B所要時間").Range("A6:A1006")
    x = 10
    For i = 3 To 24
        日付 = Sheets("BH計算").Cells(i, 1)    '変数cから変数日付に変更
        コード = Sheets("BH計算").Cells(i, 2)  '変数コード追加
        If 日付 = "" Then Exit Sub
                新規日付 = Sheets("BH計算").Cells(i, 1).Text
                新規時間 = Sheets("BH計算").Cells(i, 11).Value
                    検索 = Sheets("1B所要時間").Range("A6:A1006").Find(What:=コード, LookIn:=xlValues)     '☆オブジェクトが必要ですといわれる。  コードを検索値に訂正
                    検索行 = 検索.Row
                    検索列 = 検索.Column
                'Find(What:=新規日付, After:=ActiveCell, LookIn:=xlValues, LookAt _
                ':=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
                'False, MatchByte:=False).Activate
                        For ii = 3 To 7 Step 2
                            x = x - 2
                            一覧日付 = Sheets("1B所要時間").Cells(検索行, 検索列 + ii)
                            一覧時間 = Sheets("1B所要時間").Cells(検索行, 検索列 + x)
                                If 一覧日付 = "" Then
                                    一覧日付 = 新規日付
                                    一覧時間 = 新規時間
                                End If
                        Next ii
    Next i
 End Sub

 Findでgoogle検索してオブジェクトについて書かれていることを読んだところ、
 戻り値が〜〜と書いてあったのですがよくわからず今に至ります。
 例に例えて教えていただけるとありがたいです。
 (たかなし)


 慣れないうちはわかりずらいかもしれませんが、オブジェクトの代入は
 Set を使用する必要があります。

 検索 = Sheets("1B所要時間").Range("A6:A1006").Find(What:=コード, LookIn:=xlValues) 
 の部分は
 Set 検索 = Sheets("1B所要時間").Range("A6:A1006").Find(What:=コード, LookIn:=xlValues) 
です。

 また検索値がなかった場合は、それに続く処理がどうさしませんから、

 If 検索 Is Nothing Then
     MsgBox "検索値が見つかりませんでした"
     Exit Sub
 End If
 のように、回避する必要があるように思います。
 (Mook)

 こんにちは。かみちゃん です。

 横から失礼します。
 一部Mookさんとかぶりますが、書きかけていたので、そのままアップします。

 > Findでgoogle検索してオブジェクトについて書かれていることを読んだところ、
 > 戻り値が〜〜と書いてあったのですがよくわからず今に至ります。

 まず、Findメソッドのヘルプの使用例(一部誤っていますが)を見ていただきたいのですが、
 Set c = .Find(〜
 というような記述になっていると思います。

 今回のコードですと、
 Dim 検索 As Range '★
 という宣言を追加していただき、
 Set 検索 = Sheets("1B所要時間").Range("A6:A1006").Find(What:=コード, LookIn:=xlValues)
 としてみてください。

 なお、たかなしさんからの説明では、

 表B 1BH所要時間 シート
     A     B        C
 1 コード 品名	 生産日
 2 450050 品名A 2009/2/3  

 とあり、シート名も違うし、行番号も違うようで、このあたりは、投稿の際の間違い
 ということでしょうか?

 これで、エラーは出ないと思いますが、

 For ii = 3 To 7 Step 2
   x = x - 2
   一覧日付 = Sheets("1B所要時間").Cells(検索行, 検索列 + ii)
   一覧時間 = Sheets("1B所要時間").Cells(検索行, 検索列 + x)
   If 一覧日付 = "" Then
     一覧日付 = 新規日付
     一覧時間 = 新規時間
   End If
 Next ii

 このコードの意味がわかりません。
 変数から変数に入れて、何をしようとしているのでしょうか?

 マクロ実行前のシートレイアウトと、実行後の期待する結果を整理して、説明してみてはいかがでしょうか?

 (かみちゃん)
 2009-02-08 12:20

 ※12:21一部修正しました。

 Mook様
 かみちゃん様

 お返事ありがとうございます。
 少しずつやりたいことと、投稿した内容の整理を行っておりますのですみませんが
 いま少しお待ちいただきたく存じます。

 (たかなし)

 こんにちは。かみちゃん です。

 > 少しずつやりたいことと、投稿した内容の整理を行っております

 たたみかけるようで申し訳ありませんが、

 > 表Aのコードを行3から行24までのコードをFindを使って表Bのコードから同じコードの行を取得し
 > そこから列を操作して表Aの日付を表Bの生産日と比較し、一番古いものに1GH所要時間を上書きさせる

 ということを

 表A
    A       B    C     D      E     F     G      H      I        J       K       L
 1   
 2   日付    コード 品名  BH数 開始時間    終了時間 休憩  必要人数 所要時間 合計 1BH所要時間
 3 2009/2/3 457220 品名1  5    9:00   〜  12:00    10     3        170     510      34.0
 〜
 24

 表B 1BH所要時間 シート
     A     B        C         D          E         F         G          H         I      J      K
 1 コード 品名	 生産日  1B所要時間   生産日   1B所要時間  生産日   1B所要時間  平均値  最大   最小
 2 450050 品名A 2009/2/3    150      2008/12/7    160    2008/11/5     140      150     160    140
 3 857955 品名B						
 〜
 300

 のような感じで再度、
 マクロ実行前のシートレイアウトと、実行後の期待する結果を整理して、説明してみてはいかがでしょうか?

 上記ですと、表AのB3セル「457220」が表BのA列にすでに存在しないので、どういったことがしたいのか
 がよくわかりません。

 (かみちゃん)
 2009-02-08 12:55


 整理してみました。

 【実行前】
 表A BH計算シート
    A       B    C     D      E     F     G      H      I        J       K       L
 1   
 2   日付    コード 品名  BH数 開始時間    終了時間 休憩  必要人数 所要時間 合計 1BH所要時間
 3 2009/2/3 457220 品名1  5    9:00   〜  12:00    10     3        170     510      34.0
 〜      ↑検索値
 24
   

 表B 1BH所要時間 シート
     A     B        C         D          E         F         G          H         I      J      K
 1 コード 品名	 生産日  1B所要時間   生産日   1B所要時間  生産日   1B所要時間  平均値  最大   最小
 2 450050 品名A 2009/2/3    150      2008/12/7    160    2008/11/5     140      150     160    140
 3 857955 品名B	
 4 457220 品名1 2009/1/5    50       2008/12/1     45    2008/12/25      20     38      50      20					
 〜
 300
     ↑検索する列

 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 【実行後】

 表A BH計算シート
    A       B    C     D      E     F     G      H      I        J       K       L
 1   
 2   日付    コード 品名  BH数 開始時間    終了時間 休憩  必要人数 所要時間 合計 1BH所要時間
 3                                                                                                    ←データは削除
 〜
 24

 表B 1B所要時間 シート    ★訂正しました。14:00
     A     B        C         D          E         F         G          H         I      J      K
 1 コード 品名	 生産日  1B所要時間   生産日   1B所要時間  生産日   1B所要時間  平均値  最大   最小
 2 450050 品名A 2009/2/3    150      2008/12/7    160    2008/11/5     140      150     160    140
 3 857955 品名B	
 4 457220 品名1 2009/1/5    50     『2009/02/3』  『32』 2008/12/25    20       28       50    20					
 〜
 300
                                        ↑一番古いデータに上書き

 Sub 所要時間書き込み()
    Dim コード As String, 行, 列, 日付
    Dim 検索行, 検索列, 検索表
    Dim 一覧日付, 新規日付, 一覧時間, 新規時間,検索 As Range    '●修正
    Dim i, ii, iii, x, y, z
    検索表 = Sheets("1B所要時間").Range("A1:A1006")             '●訂正
    For i = 3 To 24
        日付 = Sheets("BH計算").Cells(i, 1)    
        コード = Sheets("BH計算").Cells(i, 2)  
        If 日付 = "" Then Exit Sub
                新規日付 = Sheets("BH計算").Cells(i, 1).Text
                新規時間 = Sheets("BH計算").Cells(i, 11).Value
                    set 検索 = Sheets("1B所要時間").Range("A1:A1006").Find(What:=コード, LookIn:=xlValues)     '●修正及び訂正
                    検索行 = 検索.Row
                    検索列 = 検索.Column
                               '一番古い日付を検出                      |全面的に削除           
                               '一番古い日付の「生産日」に表Aの「日付」を上書き        |やりたいことのみ書き込み
                               '一番古い日付の「1B所要時間」に表Aの「1BH所要時間」を上書き    |

    Next i
 End Sub

 一番最後の処理もわからないことに先ほど気がつきました…
 目先の失敗に目を取られてまったく見えていませんでした。
 表Bですが、空欄があるところもあります。
 なので、生産日を入力してあるセル3つのうちどれかが空欄であった場合、そこに書き込み
 空欄がなかった場合一番古いデータに上書きという処理を行いたかったのです。
 (たかなし)

 こんにちは。かみちゃん です。

 > 整理してみました。

 まだわからないので、教えていただけますか?
 実行後のシートですが、

 表B 1BH所要時間 シート
     A     B        C         D          E         F         G          H         I      J      K
 1 コード 品名	 生産日  1B所要時間   生産日   1B所要時間  生産日   1B所要時間  平均値  最大   最小
 2 450050 品名A 2009/2/3    150      2008/12/7    160    2008/11/5     140      150     160    140
 3 857955 品名B	
 4 457220 品名1 2009/1/5    50     『2009/02/3』  『32』 2008/12/25    20       28       50    20

 シート名は、「1BH所要時間」なのですか?
 また、行番号は、1からなのですか?
 コードに記述している「1B所要時間」シートのレイアウトはどうなっているのですか?
 「1B所要時間」のコードのFindする範囲は、
 Set 検索 = Sheets("1B所要時間").Range("A6:A1006").Find(What:=コード
 となっていて、「1B所要時間」シートのA6:A1006となっていて、その内容がわかりません。

 また、上記シートの説明で、E4セルを「2008/12/1」から「2009/02/3」に上書きする考え方と
 F4セルを「45」から「32」に上書きする考え方がわかりません。
 常に、E列とF列の値を変更するのですか?
 その場合、特に、F列の値の決定方法がわかりません。

 (かみちゃん)
 2009-02-08 13:50


 先ほど訂正いたしました。

 >シート名は、「1BH所要時間」なのですか?
 こちらはコードがあっていまして、シート名は「1B所要時間」になります。 
 思い込みから確認ミスをしてしまい申し訳ありませんでした。

 >となっていて、「1B所要時間」シートのA6:A1006となっていて、その内容がわかりません。
 上記の訂正にあわせて、A6:A1006をA2:A1006に訂正いたします。

 >また、上記シートの説明で、E4セルを「2008/12/1」から「2009/02/3」に上書きする考え方と
 >F4セルを「45」から「32」に上書きする考え方がわかりません。
 こちらはC E G列の生産日を比較して、一番古い生産日に上書きとなります。
 従って、CEGに合わせDFH列にも上書きいたします。

 説明が下手で申し訳ございません。
 (たかなし)

 こんにちは。かみちゃん です。

 >> 上記シートの説明で、E4セルを「2008/12/1」から「2009/02/3」に上書きする考え方と
 >> F4セルを「45」から「32」に上書きする考え方がわかりません。
 >> 常に、E列とF列の値を変更するのですか?
 >> その場合、特に、F列の値の決定方法がわかりません。
 >
 > こちらはC E G列の生産日を比較して、一番古い生産日に上書きとなります。

 少しわかってきました。ご質問に対する私の読解力が不足していたようです。

 実行前のシート

 表B 1BH所要時間 シート
     A     B        C         D          E         F         G          H         I      J      K
 1 コード 品名	 生産日  1B所要時間   生産日   1B所要時間  生産日   1B所要時間  平均値  最大   最小
 2 450050 品名A 2009/2/3    150      2008/12/7    160    2008/11/5     140      150     160    140
 3 857955 品名B	
 4 457220 品名1 2009/1/5    50       2008/12/1     45    2008/12/25      20     38      50      20	

 とあった場合、4行目のC4、E4、G4の中から、一番古い日付を検索し、それがE4セルだから、
 E4セルに、表AのA3セルの値を上書きするわけですね。

 > '一番古い日付の「1B所要時間」に表Aの「1BH所要時間」を上書き

 ただ、コード「457220」の1BH所要時間は、表AのL3セルの「34.0」だと思うのですが、それがなぜ
 マクロ実行後の表BのF4セルが「32」になるのかがわかりません。
 そこの部分の計算方法を教えてください。

 (かみちゃん)
 2009-02-08 14:19


 こんにちは。かみちゃん です。

 追加質問です。

 > 4行目のC4、E4、G4の中から、一番古い日付を検索し、それがE4セルだから、
 > E4セルに、表AのA3セルの値を上書きするわけですね。

 一番古い日付が2つ以上あれば、どうするのですか?両方とも上書きですか?
 それとも、一番左のセルだけ、上書きですか?

 あと、一番古い日付を探す範囲は、C列、E列、G列の3列からだけでいいのですか?

 (かみちゃん)
 2009-02-08 14:22


 かみちゃん様
 こちら側の説明不足とほかのところでの記載ミスの整合があわないから伝わらないだけで、
 かみちゃん様にはなんら不足はございません。
 何度も何度も申し訳ありません。

 >ただ、コード「457220」の1BH所要時間は、表AのL3セルの「34.0」だと思うのですが、それがなぜ
 こちらも記載ミスでございます。
 34.0を32と思い込んで書き込んでしまいましたので、正しくは実行後の値も34になります。
 重ね重ね申し訳ありません。

 >一番古い日付が2つ以上あれば、どうするのですか?両方とも上書きですか?
 >それとも、一番左のセルだけ、上書きですか?
 同じ日付がかぶることはございません。
 こちらも最初に説明させていただくべきでございました。

 >あと、一番古い日付を探す範囲は、C列、E列、G列の3列からだけでいいのですか?
 最新の作業3回の平均と最大最小を一覧に書き写すことを目的としています。
 平均と最大最小はそれぞれD F H列を参照したAVERAGE MAX MIN関数を使用していますので
 書き変えるセル(列)は全部でCDEFGHとなります。

 度重なる失態ご容赦ください。

 (たかなし)


 こんにちは。かみちゃん です。

 >> あと、一番古い日付を探す範囲は、C列、E列、G列の3列からだけでいいのですか?
 >
 > 最新の作業3回の平均と最大最小を一覧に書き写すことを目的としています。
 > 平均と最大最小はそれぞれD F H列を参照したAVERAGE MAX MIN関数を使用していますので
 > 書き変えるセル(列)は全部でCDEFGHとなります。

 おおむね以下のような感じに修正すればいいのではないでしょうか?
 できるだけ、たかなしさんのコードを残すようにしてみました。
 ただ、変数名に全角文字を使うことは、私は、好みませんので、申し添えておきます。

 Sub 所要時間書き込み2()
 '  Dim コード As String, 行, 列, 日付
 '  Dim 検索行, 検索列, 検索表
 '  Dim 一覧日付, 新規日付, 一覧時間, 新規時間, 検索 As Range
 '  Dim i, ii, iii, x, y, z

   Dim コード As String
   Dim i As Long
   Dim 検索 As Range
   Dim 一番古い日付 As Range
   Dim WS1 As Worksheet
   Dim WS2 As Worksheet

   Set WS1 = Worksheets("BH計算")
   Set WS2 = Worksheets("1B所要時間")
   ReDim v(1 To 3)

 '  検索表 = Sheets("1B所要時間").Range("A6:A1006")
   For i = 3 To 24
     コード = WS1.Cells(i, 2).Value
     If コード <> "" Then
       Set 検索 = WS2.Range("A2:A1006").Find(What:=コード, LookIn:=xlValues)

       '一番古い日付を検出
       v(1) = CLng(検索.Offset(, 2).Value) '★変数「検索」のセルから2列右、つまりC列
       v(2) = CLng(検索.Offset(, 4).Value) '★変数「検索」のセルから4列右、つまりE列
       v(3) = CLng(検索.Offset(, 6).Value) '★変数「検索」のセルから6列右、つまりG列
       Set 一番古い日付 = 検索.Cells(1, 1 + Application.Match(Application.Small(v, 1), v, 0) * 2)
       '一番古い日付の「生産日」に表Aの「日付」を上書き
       一番古い日付.Value = WS1.Cells(i, "A").Value
       '一番古い日付の「1B所要時間」に表Aの「1BH所要時間」を上書き
       一番古い日付.Offset(, 1).Value = WS1.Cells(i, "L").Value
     End If
   Next i
   MsgBox "終了しました"
 End Sub

 (かみちゃん)
 2009-02-08 15:21


 かみちゃん様
 誰が見てもわかるようにと全角にしてしまいました。
 申し訳ありません。

 先程のマクロを起動させてみたところ、
     v(1) = CLng(検索.Offset(, 2).Value) '★変数「検索」のセルから2列右、つまりC列
 こちらで「型が一致しません」というエラーがでてしまいました。
 変数「検索」で一致しなかったと見て、コードの宣言をStringからIntgerにしたところ、
    If コード <> "" Then
 こちらで「オーバーフロー」してしまいました。
 宣言をTextにしたところ
     If コード <> "" Then
 で「型が一致しません」とでてしまいました。
 そこで、何も宣言しないでマクロを実行したところ、最初の
   v(1) = CLng(検索.Offset(, 2).Value) '★変数「検索」のセルから2列右、つまりC列
 で同じく「型が一致しませんでした」のエラーがでました。
 次に、 
    v(1) = CLng(検索.Offset(, 2).Value) '★変数「検索」のセルから2列右、つまりC列
 の日付のValueをTextに直しましたが改善されませんでした。

 セルの表示設定は標準になっています。

 これだけの情報で原因わかりますでしょうか。
 よろしくお願い申し上げます。
 (たかなし)

 こんにちは。かみちゃん です。

 > こちらで「型が一致しません」というエラーがでてしまいました。

 提示されたシートレイアウト(以下)を実行前のサンプルデータとして動作確認していますが、
 特に問題はないようですので、こちらでは原因がわかりません。
 ただし、「1B所要時間」シートのC列、E列、G列の日付が入るべきところに、文字列やエラー値に
 なっているセル(各列の1行目は項目名のため除く)があるのではないでしょうか?

 空白になっているセルで、半角スペースや長さ0の文字列(数式等で""となるような場合)になっている
 ものがあれば、Delキーで「値のクリア」をしてみてください。

 なお、表BのC列、E列、F列が、何かのデータを転記して作っているのであれば、日付のデータとして、
 認識できないセルがあるのかもしれません。

 表A BH計算シート
    A       B    C     D      E     F     G      H      I        J       K       L
 1   
 2   日付    コード 品名  BH数 開始時間    終了時間 休憩  必要人数 所要時間 合計 1BH所要時間
 3 2009/2/3 457220 品名1  5    9:00   〜  12:00    10     3        170     510      34.0
 〜      ↑検索値
 24

 表B 1B所要時間 シート
     A     B        C         D          E         F         G          H         I      J      K
 1 コード 品名	 生産日  1B所要時間   生産日   1B所要時間  生産日   1B所要時間  平均値  最大   最小
 2 450050 品名A 2009/2/3    150      2008/12/7    160    2008/11/5     140      150     160    140
 3 857955 品名B	
 4 457220 品名1 2009/1/5    50       2008/12/1     45    2008/12/25      20     38      50      20					
 〜
 300

 (かみちゃん)
 2009-02-08 16:05

 かみちゃん様
 サーバーがバックアップ作業に入ってしまい、しばらく試せそうにありません。
 申し訳ありませんが、後ほど結果を報告いたしたいと思います。
 今日はお付き合いいただきありがとうございました。
 (たかなし)

 Dictionary Ver です。
       (弥太郎)
 '''''''''''''''''''''''''''''
 Option Explicit
 Sub 所要時間書き込みVer2()
    Dim dic As Object, i As Long, tbl, ary
    Set dic = CreateObject("scripting.dictionary")
    With Sheets("BH計算")
        tbl = .Range("a3:l24").Value
        For i = 1 To UBound(tbl, 1)
            If tbl(i, 1) <> "" Then
                dic(tbl(i, 2)) = Array(tbl(i, 1), tbl(i, 12))
            End If
        Next i
    End With
    With Sheets("1B所要時間")
        tbl = .Range("a2").Resize(.Range("a" & Rows.Count).End(xlUp).Row - 1, 11)
        For i = 1 To UBound(tbl, 1)
            If dic.exists(tbl(i, 1)) Then
                ary = Array("", "", tbl(i, 3) * 1, "", tbl(i, 5) * 1, "", tbl(i, 7) * 1)
                .Cells(i + 1, Application.Match(WorksheetFunction.Min(ary), ary, 0)) _
                        .Resize(, 2) = dic(tbl(i, 1))
            End If
        Next i
    End With
    'Sheets("BH計算").Range("a3:l24").ClearContents
 End Sub


 こんにちは。かみちゃん です。

 > こちらで「型が一致しません」というエラーがでてしまいました。

 弥太郎さんの書き込みを見て、少しヒントを得ました。

 私が提示したコードの
      v(1) = CLng(検索.Offset(, 2).Value) '★変数「検索」のセルから2列右、つまりC列
      v(2) = CLng(検索.Offset(, 4).Value) '★変数「検索」のセルから4列右、つまりE列
      v(3) = CLng(検索.Offset(, 6).Value) '★変数「検索」のセルから6列右、つまりG列
 の部分を以下のようにしてみると、うまく動作するかもしれません。

      v(1) = 検索.Offset(, 2).Value '★変数「検索」のセルから2列右、つまりC列
      v(2) = 検索.Offset(, 4).Value '★変数「検索」のセルから4列右、つまりE列
      v(3) = 検索.Offset(, 6).Value '★変数「検索」のセルから6列右、つまりG列
      If Not IsDate(v(1)) Then
        v(1) = 0
      Else
        v(1) = CLng(CDate(v(1)))
      End If
      If Not IsDate(v(2)) Then
        v(2) = 0
      Else
        v(2) = CLng(CDate(v(2)))
      End If
      If Not IsDate(v(3)) Then
        v(3) = 0
      Else
        v(3) = CLng(CDate(v(3)))
      End If

 変数「検索」の行のC列、E列、G列の値をチェックするようにしています。

 (かみちゃん)
 2009-02-08 19:10


 おはようございます。
 先日は返信できず申し訳ありませんでした。

 かみちゃん様
 ありがとうございます。
 無事に動きました、が日付が入力されるべきセルに、所要時間がはいってしまいます。
 例えばF列の日付が一番古い場合、E列の所要時間項目にA表の
 日付が入力されてしまい、F列の生産日には表Aの1BH所要時間が入力されてしまいました。

 弥太郎様
 別Verありがとうございます。
 こちらもちゃんと起動したのですが、上と同じ例になってしましました。

 風邪をこじらせて姉妹要領を得ない受け答えになってしまいますが、宜しくお願いいたします。
 (たかなし)

 仰有ってる意味がわかりまへん。
 >例えばF列の日付が一番古い場合
 よくご自分のレイアウトをご覧下さい。
 F列は1B所要時間であって、日付が記入されとるわけがないでせう?

 このマクロは例えばE列が一番古い日付としたらE列に表AのA列の日付を、F列に表Aの
 のL列、つまり1BH所要時間が上書きされるようになっとります。
 これのどこがアカンのんでっか?
         (弥太郎)

 こんにちは。かみちゃん です。

 > 無事に動きました、が日付が入力されるべきセルに、所要時間がはいってしまいます。
 > 例えばF列の日付が一番古い場合、E列の所要時間項目にA表の
 > 日付が入力されてしまい、F列の生産日には表Aの1BH所要時間が入力されてしまいました。

 いつから、そのようなフォーマットになったのでしょうか?

 表B 1B所要時間 シート    ★訂正しました。14:00
     A     B        C         D          E         F         G          H         I      J      K
 1 コード 品名	 生産日  1B所要時間   生産日   1B所要時間  生産日   1B所要時間  平均値  最大   最小

 この説明によると、E列は「生産日」で、F列が「1B所要時間」ではないのですか?
 E列とF列が逆になつていませんか?

 もし、レイアウトを変えたならば、コードも修正しないといけませんのですが。
 弥太郎さん同様、意味がわかりません。

 (かみちゃん)
 2009-02-09 11:22


 かみちゃん様 弥太郎様
 大変申し訳ありません。
 本家の表のC列が非表示になっていたためずれてしまったようでございます。
 C列を削除し、もう一度試しましたら正常に実行されました。
 ご迷惑をおかけしました。

 今回はミスの連続で大変お手間を取らせてしまい申し訳ありませんでした。
 また体調を理由に自分で考えることを放棄してしまった感があり不快感を与えてしまったら
 申し訳ありません。

 お忙しいところありがとうございました。
 余裕が出来ましたらdicの使い方とReDim v(1 To 3)の使い方を学ぼうと思います。

 (たかなし)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.