Excel (VBA)

Excel VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(Windows 7 Professional : Excel 2003)
マクロ作動途中で、エラーが出ます
投稿日時: 18/01/23 21:44:31
投稿者: ticoticoboy

こんにちは、自己流でマクロを勉強しており、まだ、途半ばですが、壁に突き当たり
こちらへたどり着きました、ご指導よろしくお願いします
私なりに、切り貼りしながらやっていますが、修正ポイントが理解できず
悩んでおります、よろしくお願いします。
 
やりたいこと、
AAシートの値から、BBシートの”物品番号列”を検索し
ヒットしたら、同列の”システム番号”にて、さらに、CCシートの”システム番号列”を検索し
ヒットしたら、同列のセルへ、”連絡情報”を転記する
ヒットしない場合は、ZZシートへ転記したいです。
 
*変数宣言は、多いですが、最終目標までに必要ですので、そのまま表示します。
*なお、お礼の返信が遅れることがります(急な、出張等あるため)、事前連絡です。
 
Sub seruharitsuke()
Dim AlastRow As Long
Dim BlastRow As Long
Dim Foundcell As Range
Dim Foundcell As Range
Dim c As Range
Dim c2 As Range
Dim myuvalue As Variant
Dim myuvalue2 As Variant
Dim myuvalue3 As Variant
Dim myuvalue4 As Variant
Dim mydvalue As Variant
Dim mydvalue2 As Variant
Dim mydvalue3 As Variant
Dim mydvalue4 As Variant
Dim mytvalue As Variant
Dim mytvalue2 As Variant
Dim mytvalue3 As Variant
Dim mytvalue4 As Variant
 
Worksheets("ZZシート").Columns("A").ClearContents 'ZZシートの値を削除
Worksheets("ZZシート").Columns("B").ClearContents
Worksheets("ZZシート").Columns("C").ClearContents
 
Worksheets("ZZシート").Range("A1").Value = "物品番号" '項目名セット
Worksheets("ZZシート").Range("B1").Value = "連絡情報"
Worksheets("ZZシート").Range("C1").Value = "システム番号"
 
Worksheets("AAシート").Select
AlastRow = Worksheets("AAシート").Cells(Rows, Count, 5).End(xlUp).Row
 
BlastRow = 1
 
   For Each c In Worksheets("AAシート").Range("E2:E" & AlastRow) 'AAシートの値を検索
     
    Set Foundcell = Nothing
     
       If BlastRow > 1 Then
      
          Set Foundcell = Worksheets("BBシート").Range("M2:M" & BlastRow).Find(c.Value, LookIn:=xlValues, lookat:=xlWhole) 'BBシートの値を検索
         
       End If
      
      
           If Foundcell Is Nothing Then 'BBシートに存在しないときは、ZZシートへ転記
      
             Blastorw = BlastRow + 1
        
             Worksheets("ZZシート").Select
             Worksheets("ZZシート").Cells(BlastRow, 1).End(xlUp).Row = c.Value
        
           ElseIf Not Foundcell Is Nothing Then 'BBシートに存在するときは、CCにて検索
      
             Blastorw = BlastRow + 1
        
             Worksheets("AAシート").Select
             myuvalue = Worksheets("AAシート").Cells(c.Row, 2).Value
             myuvalue2 = Worksheets("AAシート").Cells(c.Row, 6).Value
        
             Worksheets("BBシート").Select
             mydvalue3 = Worksheets("BBシート").Cells(Foundcell.Row, 2).Value
             mydvalue4 = Worksheets("BBシート").Cells(Foundcell.Row, 1).Value
             Worksheets("BBシート").Cells(Foundcell.Row, 14).Value = "*"
        
             Worksheets("CCシート").Select
             clastrow = Worksheets("CCシート").Cells(Rowscount, 2).End(xlUp).Row
        
                For Each c2 In Worksheets("ZZシート").Range("B2:B" & clastrow) 'CCシートに存在するときは、セルへ転記・・・・・・・・ここで、エラーが発生します(エラー番号:424?(自信がないです)
        
                    If mydvalue3 = c2 Then
           
                    Worksheets("CCシート").Select
                    Worksheets("CCシート").Cells(c2.Row, 13).Value = myuvalue2.Value
        
                    End If
                Next c2
            End If
      Next c
 
End Sub
 
 
 
 

回答
投稿日時: 18/01/23 21:57:12
投稿者: 隠居じーさん

こんばんわ ^^
 
AlastRow = Worksheets("AAシート").Cells(Rows, Count, 5).End(xlUp).Row
clastrow = Worksheets("CCシート").Cells(Rowscount, 2).End(xlUp).Row
 

 
AlastRow = Worksheets("AAシート").Cells(Rows.Count, 5).End(xlUp).Row
clastrow = Worksheets("CCシート").Cells(Rows.count, 2).End(xlUp).Row
 
ここでのミス入力でなければ。
 
気が付いた点だけですが。。。
 
 
 

投稿日時: 18/01/23 22:14:34
投稿者: ticoticoboy

隠居じーさん さんの引用:
こんばんわ ^^
 
AlastRow = Worksheets("AAシート").Cells(Rows, Count, 5).End(xlUp).Row
clastrow = Worksheets("CCシート").Cells(Rowscount, 2).End(xlUp).Row
 

 
AlastRow = Worksheets("AAシート").Cells(Rows.Count, 5).End(xlUp).Row
clastrow = Worksheets("CCシート").Cells(Rows.count, 2).End(xlUp).Row
 
ここでのミス入力でなければ。
 
気が付いた点だけですが。。。
 
隠居じーさん、こんばんは、明日確認してみます
ありがとうございました、まずはお礼まで

回答
投稿日時: 18/01/23 22:29:55
投稿者: WinArrow
投稿者のウェブサイトに移動

掲示のコードは、実際のコードですか?
 
コンパイルエラーが出るはずですが・・・
 
間違っているところ
 
> Blastorw = BlastRow + 1

             Blastrow = BlastRow + 1
2ヵ所あります。
 
ステップ実行して、変数の「値」、「流れ」を確認してみてください。
 

回答
投稿日時: 18/01/23 22:35:46
投稿者: WinArrow
投稿者のウェブサイトに移動

> Worksheets("ZZシート").Cells(BlastRow, 1).End(xlUp).Row = c.Value
↑のコードは?
何をしたいのかな?

回答
投稿日時: 18/01/23 22:52:55
投稿者: WinArrow
投稿者のウェブサイトに移動

エラーの箇所
> For Each c2 In Worksheets("ZZシート").Range("B2:B" & clastrow) 'CCシートに存在するときは、セルへ転記・・・・・・・・ここで、エラーが発生します(エラー番号:424?(自信がないです)
 
本当に
>Worksheets("ZZシート").
シート名は正しいですか?

回答
投稿日時: 18/01/23 22:55:28
投稿者: WinArrow
投稿者のウェブサイトに移動

もう一つ
 > Worksheets("CCシート").Select
 > Worksheets("CCシート").Cells(c2.Row, 13).Value = myuvalue2.Value
 
ここのシート名も正しいのでしょうか?

回答
投稿日時: 18/01/23 23:28:16
投稿者: simple

コンパイルエラーが多く出るようなコードを示して、
他人をデバッガ代わりに使うのは遠慮願いたい。
質問以前じゃないですか?
こんなことは自分でやるべきです。

回答
投稿日時: 18/01/24 01:01:47
投稿者: WinArrow
投稿者のウェブサイトに移動

よくある間違い
Worksheets(〇):Cells(Rows.Count, 1).End(xlUp).Row

Worksheets(〇):Cells(Worksheets(〇).Rows.Count, 1).End(xlUp).Row
 
の違いをキチンと理解しましょう。

回答
投稿日時: 18/01/24 07:28:01
投稿者: 隠居じーさん

既に WinArrow さん simple さん から
適切なアドバイスがなされていますが。
Option Explicit
の指定をお勧めいたします。
 
 二重宣言。
Dim Foundcell As Range
 
宣言無し。
 For Each c2 In Worksheets("ZZシート").Range("B2:B" & clastrow) 部分の
clastrow
 
で。。。。。
デバッグ...頑張って下さい。
 
^^
 
でわ
 

回答
投稿日時: 18/01/24 08:14:18
投稿者: WinArrow
投稿者のウェブサイトに移動

再掲
 
スマホで、入力していたので、入力ミスが・・・・
 
訂正します。
 
よくある間違い
Worksheets(〇).Cells(Rows.Count, 1).End(xlUp).Row
 ↓
 Worksheets(〇).Cells(Worksheets(〇).Rows.Count, 1).End(xlUp).Row
   
の違いをキチンと理解しましょう。
 
前者の Rows.Count
は、アクティブシートを参照するとは周知のことですが、
 
Worksheets(〇).Cells(Activesheet.Rows.Count, 1).End(xlUp).Row
と書いたことと同じになります。
 
でも、違和感がありますよね?
取得した「値」が同じかどうかではなく、
データの所在地=アドレスとしても問題と思います。
 
 

回答
投稿日時: 18/01/24 08:51:21
投稿者: mattuwan44

よくわかんないけど、
こんなことがしたいとか?
表計算ソフトなんだから、数式を入れれば解決するんじゃないのかな?
 
Sub test()
    Dim Rng As Range
     
    With Worksheets("ZZシート").Range("A:C")
        .ClearContents
        Worksheets("AAシート").Range("M:M").Copy .Columns(1)
        Set Rng = .Cells(1).CurrentRegion
    End With
     
    With Rng.Resize(, 3)
        .Columns("B").Formula = "=MATCH(A1,BBシート!M:M,0)"""
        .Columns("C").Formula = "=MATCH(B1,CCシート!M:M,0)"""
        .Value = .Value
        .Range("B1").Value = "連絡情報"
        .Range("C1").Value = "システム番号"
    End With
End Sub
 
あぁ、エラー値のこと忘れてる^^;
まぁ、修正はやりたいことが解ってからで。。。

回答
投稿日時: 18/01/24 09:43:42
投稿者: 細雪

ticoticoboy さんの引用:

             clastrow = Worksheets("CCシート").Cells(Rowscount, 2).End(xlUp).Row
        
                For Each c2 In Worksheets("ZZシート").Range("B2:B" & clastrow) 'CCシートに存在するときは、セルへ転記・・・・・・・・ここで、エラーが発生します(エラー番号:424?(自信がないです)

 
エラーのコードが分かっているなら、ヘルプなりその他Webなりで自力で調べてみないと(笑)。
ちなみに「424」は
https://msdn.microsoft.com/ja-jp/vba/language-reference-vba/articles/object-required-error-424
このくらいはモノの数秒で検索できますよね。
理解できるかどうかは別な話ですけどね。
 
で、そのエラーが出るタイミングで、変数「clastrow」にはどんな値が入ってます?
思い通りの値を代入できていますか?
変数を次式「Worksheets("ZZシート").Range("B2:B" & clastrow)」に渡して、
例えば
  Worksheets("ZZシート").Range("B2:B" & clastrow).select
とした場合、狙った範囲を選択してくれていますか?
 
その辺りを切り分けるために「ステップ実行」「ウォッチ式」「イミディエイト」などを使って
いわゆるデバッグ作業をしてやる、というところまで自力でやってナンボです。
そこを他人任せにしていたら「事故流」の先には進めないですよ。
 
 
 
回答者側にはサンプルに出来るデータも何も無いので、提示されたコードから想像するしかないんです。
踏まえ、おそらくですが無駄な動きが多いように見えます。
フローチャートなどを書いてみて、考え方を整理してやった方が良いのでは?

回答
投稿日時: 18/01/24 13:54:09
投稿者: もこな2

遅ればせながら盛り上がってるようなので私も参加・・・
 
既にいろいろ皆さんがご指摘されてるところはその通りとして、私が気になるところ・・
(1) いちいちselectしなくていいい
(2) (1)とかぶるけど、Activesheetに依存する記述になってるところがちらほら
(3) と、思ってると何度も同じシートに対する操作が記述してあって見づらい
(4) 2行目から最終列までを対象にFindメソッド実行してるけど、理由はなんだろう?
  (1行目は項目だから外してるだけであれば、別に行全体でも支障はないとおもう。)
(5) Variant型の変数を経由してValueのコピーしてるけど直接参照で事足りそう
(6)「ElseIf Not Foundcell Is Nothin」って「Else」でよくない?
(7)「myuvalue」取得だけしてなにもしてない。「myuvalue3」「myuvalue4」使ってすらいない。
  (ご自身で「変数宣言は、多いですが、最終目標までに必要ですので」って言ってるわりには、
   プロシージャレベルで宣言してるから、プロシージャ内に最終目標があるのでなければ、
   意味が無いのでは?)
(8)結局なにやりたいのかよくわからないのでやりたいことを具体的に説明してほしい。。
 
なんとなく
@「AA」のM列2行目〜最終行までの値をキーにして、順番に「BB」のM列を検索
A「BB」のM列になければ、「ZZ」にキーを出力、あれば、「BB」のM列の該当行にフラグ付けた上で、
「CC」のM列から「BB」のB列該当行の値に一致する箇所を探して、N列の同じ行へ出力
ってことがやりたいんでしょうかとおもって、整理を試みたけど、こんな感じに。。。。

Sub TEST()
'Dim AlastRow As Long
Dim BlastRow As Long
Dim ClastRow As Long '追加
Dim Foundcell As Range
'Dim Foundcell As Range
Dim c As Range, c2 As Range
Dim shA As Worksheet, shB As Worksheet, shZ As Worksheet '追加
    Set shA = ThisWorkbook.Worksheets("AAシート")
    Set shB = ThisWorkbook.Worksheets("BBシート")
    Set shZ = ThisWorkbook.Worksheets("ZZシート")

 '==主処理
    '「ZZシート」の操作
    With ThisWorkbook.Worksheets("ZZシート")
        'A〜C列をクリア
        .Range(.Columns("A"), .Columns("C")).ClearContents
        '項目名セット
        .Range("A1").Value = "物品番号"
        .Range("B1").Value = "連絡情報"
        .Range("C1").Value = "システム番号"
    End With

    'BlastRow = 1←何がやりたいのかわからない(変数名から想像して単純に「BB」シートの最終列を取得したいのでは?)
    BlastRow = shB.Cells(shB.Rows, Count, "M").End(xlUp).Row

    '(AAシートの)E列2行目から最終行までの値それぞれが「BB」のM列2行目から最終行までにあるか評価
    For Each c In shA.Range(shA.Range("E2"), shA.Cells(shA.Rows.Count, "E").End(xlUp))

        'Set Foundcell = Nothing ←何がやりたいのかわからない
        'If BlastRow > 1 Then ←何がやりたいのかわからない' (「BB」シートM列に何も入ってないのを危惧してる?)
        Set Foundcell = shB.Range(shB.Range("M2"), .shB.Cells(BlastRow, "M")).Find _
            (c.Value, LookIn:=xlValues, lookat:=xlWhole) 'Range「c」の値が、BBシートのM列にあるか評価

        If Foundcell Is Nothing Then
            'BBシートM列に(Range「C」の値が存在しないときは、ZZシート(のA列最終行+1)へ当該を転記
            shZ.Cells(shZ.Rows, Count, "A").End(xlUp).Offset(1, 0).Value = c.Value
            '▼▼▼よくわからないのでコメントアウト▼▼▼
             'Blastorw = BlastRow + 1
             'Worksheets("ZZシート").Select
             'Worksheets("ZZシート").Cells(BlastRow, 1).End(xlUp).Row = c.Value
             '=▲▲▲よくわからないのでコメントアウト▲▲▲
        Else
            'BBシートM列に(Range「C」の値が存在するときは、N列にフラグ立てて、
            'CCシート(のB列)を検索してRange「C」の値があるか評価
            shB.Cells(Foundcell.Row, 14).Value = "*"
            With Worksheets("CCシート")
                Set c2 = .Column("B").Find _
                    (c.Value, LookIn:=xlValues, lookat:=xlWhole)

                '「CC」に検索値があれば、N列該当行に「AA」から値をコピー
                If c2 Is Not Nothing Then _
                    .Cells(c2.Row, "N").Value = shA.Cells(c.Row, 2).Value
            End With
        End If
    Next c


'▼▼▼よくわからないのでコメントアウト▼▼▼
'           ElseIf Not Foundcell Is Nothing Then 'BBシートに存在するときは、CCにて検索
'
'             Blastorw = BlastRow + 1
'
'             Worksheets("AAシート").Select
'             myuvalue = Worksheets("AAシート").Cells(c.Row, 2).Value
'             myuvalue2 = Worksheets("AAシート").Cells(c.Row, 6).Value
'
'             Worksheets("BBシート").Select
'             mydvalue3 = Worksheets("BBシート").Cells(Foundcell.Row, 2).Value
'             mydvalue4 = Worksheets("BBシート").Cells(Foundcell.Row, 1).Value
'             Worksheets("BBシート").Cells(Foundcell.Row, 14).Value = "*"
'
'             Worksheets("CCシート").Select
'             ClastRow = Worksheets("CCシート").Cells(Rowscount, 2).End(xlUp).Row
'
'                For Each c2 In Worksheets("ZZシート").Range("B2:B" & ClastRow) 'CCシートに存在するときは、セルへ転記・・・・・・・・ここで、エラーが発生します(エラー番号:424?(自信がないです)
'
'                    If mydvalue3 = c2 Then
'
'                    Worksheets("CCシート").Select
'                    Worksheets("CCシート").Cells(c2.Row, 13).Value = myuvalue2.Value
'
'                    End If
'                Next c2
'            End If
'      Next c
'▲▲▲よくわからないのでコメントアウト▲▲▲
End Sub
対象となるシートがあっちにいったりこっちに行ったりするので解読困難ですね。
(特に、後半のエラー箇所でZZシートを対象に何をやりたいのかよくわかりません。。。)
 
ということで、私も細雪さんの意見に1票で、まずはコードで悩むより、全体でどんなことをしたいのか整理するのが先決なのではとおもいます。

投稿日時: 18/01/24 19:42:25
投稿者: ticoticoboy

WinArrow さんの引用:
掲示のコードは、実際のコードですか?
 
コンパイルエラーが出るはずですが・・・
 
間違っているところ
 
> Blastorw = BlastRow + 1

             Blastrow = BlastRow + 1
2ヵ所あります。
 
ステップ実行して、変数の「値」、「流れ」を確認してみてください。
 
WinArrowさん、こんばんは、ご指摘ありがとうございます。
>掲示のコードは、実際のコードですか?
実は、業務パソコンからは、こちらを見ることはできませんので
コードをプリントアウトし、自宅のパソコンから、質問しています。
 
ご指摘の部分は、BlastRow = BlastRow + 1 になっていました
 
> Worksheets("ZZシート").Cells(BlastRow, 1).End(xlUp).Row = c.Value
↑のコードは?
何をしたいのかな?
 
検索後、ヒットしなかった場合に、”ZZシート”へ転記したいです。
 
 

投稿日時: 18/01/24 19:45:26
投稿者: ticoticoboy

WinArrow さんの引用:
もう一つ
 > Worksheets("CCシート").Select
 > Worksheets("CCシート").Cells(c2.Row, 13).Value = myuvalue2.Value
 
ここのシート名も正しいのでしょうか?
WinArrowさんへ
 
シート名は、合っています。

投稿日時: 18/01/24 19:50:26
投稿者: ticoticoboy

simple さんの引用:
コンパイルエラーが多く出るようなコードを示して、
他人をデバッガ代わりに使うのは遠慮願いたい。
質問以前じゃないですか?
こんなことは自分でやるべきです。
simpleさんへ、返信、および、ご指摘ありがとうございます。
勉強不足と理解しました、すいませんでした
再度勉強いたします。

投稿日時: 18/01/24 19:56:48
投稿者: ticoticoboy

隠居じーさん さんの引用:
既に WinArrow さん simple さん から
適切なアドバイスがなされていますが。
Option Explicit
の指定をお勧めいたします。
 
 二重宣言。
Dim Foundcell As Range
 
宣言無し。
 For Each c2 In Worksheets("ZZシート").Range("B2:B" & clastrow) 部分の
clastrow
 
で。。。。。
デバッグ...頑張って下さい。
 
^^
 
でわ
 
隠居じーさんへ、再度のご指摘ありがとうございます。
>Option Explicit
>の指定をお勧めいたします。
 
> 二重宣言。
>Dim Foundcell As Range
 
>宣言無し。
> For Each c2 In Worksheets("ZZシート").Range("B2:B" & clastrow) 部分の
>clastrow
 
上記3項目の修正を行います。ありがとうございました。
 
>で。。。。。
>デバッグ...頑張って下さい。
 
こう言っていただき、頑張る気力が出てきます。
 

投稿日時: 18/01/24 20:01:00
投稿者: ticoticoboy

WinArrow さんの引用:
よくある間違い
Worksheets(〇):Cells(Rows.Count, 1).End(xlUp).Row

Worksheets(〇):Cells(Worksheets(〇).Rows.Count, 1).End(xlUp).Row
 
の違いをキチンと理解しましょう。
WinArrowさんへ、勉強課題ありがとうございます、
一歩、いや、1行づつ、理解していくようにします。

回答
投稿日時: 18/01/24 20:06:07
投稿者: WinArrow
投稿者のウェブサイトに移動

>シート名は、合っています。
 
存在するシートという点では、あっています。
 
要は、「ccシート」は、複写元シートですよね?
なぜ、複写元シートのセルに値を代入しているんですか?
複写先シートは「ZZシート」のはず・・・

投稿日時: 18/01/24 20:09:11
投稿者: ticoticoboy

WinArrow さんの引用:
再掲
 
スマホで、入力していたので、入力ミスが・・・・
 
訂正します。
 
よくある間違い
Worksheets(〇).Cells(Rows.Count, 1).End(xlUp).Row
 ↓
 Worksheets(〇).Cells(Worksheets(〇).Rows.Count, 1).End(xlUp).Row
   
の違いをキチンと理解しましょう。
 
前者の Rows.Count
は、アクティブシートを参照するとは周知のことですが、
 
Worksheets(〇).Cells(Activesheet.Rows.Count, 1).End(xlUp).Row
と書いたことと同じになります。
 
でも、違和感がありますよね?
取得した「値」が同じかどうかではなく、
データの所在地=アドレスとしても問題と思います。
 
 
WinArrowさんへ、
>でも、違和感がありますよね?
>取得した「値」が同じかどうかではなく、
>データの所在地=アドレスとしても問題と思います。
 
こちらの掲示板にたどり着く前に見つけたコードを、真似してみました
ご指摘ありがとうございます。
 
 
 
 
 
 
 

回答
投稿日時: 18/01/24 20:12:53
投稿者: WinArrow
投稿者のウェブサイトに移動

それから
>myuvalue2.Value
これは、コンパイルエラーになると思うが・・・・
コンパイルエラーになるようなコードでは、
アドバイスは難しい・・・・
 
頑張って・・・っていうのは、アドバイスではないから・・・・
 
頑張った結果を見せてほしいですね・・

投稿日時: 18/01/24 20:24:27
投稿者: ticoticoboy

細雪 さんの引用:
ticoticoboy さんの引用:

             clastrow = Worksheets("CCシート").Cells(Rowscount, 2).End(xlUp).Row
        
                For Each c2 In Worksheets("ZZシート").Range("B2:B" & clastrow) 'CCシートに存在するときは、セルへ転記・・・・・・・・ここで、エラーが発生します(エラー番号:424?(自信がないです)
細雪さん、返信、ご指摘ありがとうございます。
 
>その辺りを切り分けるために「ステップ実行」「ウォッチ式」「イミディエイト」などを使って
>いわゆるデバッグ作業をしてやる、というところまで自力でやってナンボです。
>そこを他人任せにしていたら「事故流」の先には進めないですよ。
 
はい、F8キーを連打して、エラーが出たらヘルプの、繰り返しを行いました。
今回、424エラーが出て、悩んでいるという状態です。
エラー内容の理解・対応方法を再度勉強します。
 
>回答者側にはサンプルに出来るデータも何も無いので、提示されたコードから想像するしかないんです。>
>踏まえ、おそらくですが無駄な動きが多いように見えます。
>フローチャートなどを書いてみて、考え方を整理してやった方が良いのでは?
 
フローチャートの正式版はありませんが、自分なりに、手書きしたものがありますので、公開したいと思います、ありがとうございました。

投稿日時: 18/01/24 20:43:51
投稿者: ticoticoboy

もこな2 さんの引用:
遅ればせながら盛り上がってるようなので私も参加・・・
 
既にいろいろ皆さんがご指摘されてるところはその通りとして、私が気になるところ・・
(1) いちいちselectしなくていいい
(2) (1)とかぶるけど、Activesheetに依存する記述になってるところがちらほら
(3) と、思ってると何度も同じシートに対する操作が記述してあって見づらい
(4) 2行目から最終列までを対象にFindメソッド実行してるけど、理由はなんだろう?
  (1行目は項目だから外してるだけであれば、別に行全体でも支障はないとおもう。)
(5) Variant型の変数を経由してValueのコピーしてるけど直接参照で事足りそう
(6)「ElseIf Not Foundcell Is Nothin」って「Else」でよくない?
(7)「myuvalue」取得だけしてなにもしてない。「myuvalue3」「myuvalue4」使ってすらいない。
  (ご自身で「変数宣言は、多いですが、最終目標までに必要ですので」って言ってるわりには、
   プロシージャレベルで宣言してるから、プロシージャ内に最終目標があるのでなければ、
   意味が無いのでは?)
(8)結局なにやりたいのかよくわからないのでやりたいことを具体的に説明してほしい。。
 
なんとなく
@「AA」のM列2行目〜最終行までの値をキーにして、順番に「BB」のM列を検索
A「BB」のM列になければ、「ZZ」にキーを出力、あれば、「BB」のM列の該当行にフラグ付けた上で、
「CC」のM列から「BB」のB列該当行の値に一致する箇所を探して、N列の同じ行へ出力
ってことがやりたいんでしょうかとおもって、整理を試みたけど、こんな感じに。。。。
 
 
 
[/code]対象となるシートがあっちにいったりこっちに行ったりするので解読困難ですね。
(特に、後半のエラー箇所でZZシートを対象に何をやりたいのかよくわかりません。。。)
 
ということで、私も細雪さんの意見に1票で、まずはコードで悩むより、全体でどんなことをしたいのか整理するのが先決なのではとおもいます。
もこな2さんへ、返信、ご指摘ありがとうございます。
 
サンプルコード参考にさせていただきます、1行づつ理解しながら、プログラム修正につなげていきたいです。8項目の指摘と、および、自分のプログラムの違いを意識しながら、やってみます。
ありがとうございました。
 
 

回答
投稿日時: 18/01/24 21:03:33
投稿者: WinArrow
投稿者のウェブサイトに移動

引用:
> Worksheets("ZZシート").Cells(BlastRow, 1).End(xlUp).Row = c.Value
 ↑のコードは?
 何をしたいのかな?
  
検索後、ヒットしなかった場合に、”ZZシート”へ転記したいです。

 
折角ご返事いただいたのですが、
こちらの意図が伝わっていないですね・・・
 
キチンと書きます。
 
>Worksheets("ZZシート").Cells(BlastRow, 1).End(xlUp).Row
この「Row」は、参照プロパテイで、変更できません。
コンパイルエラーになるはずです。
 
意図するコードに書き直しましょう。
 

回答
投稿日時: 18/01/25 20:07:33
投稿者: もこな2

すみません。わかりづらい書き方だったかもしれません。
 
まず、掲示したのはサンプルコードではありません。
(1)〜(7)までが気になったので整理を試みたんですが、(8)のとおり、結局なにをやりたいのか
よくわからなかったんで挫折したんです・・・
 
とりあえず、注釈等を読みながら、ループの1巡目+αを考えると
(1)Range型変数「c」に「AA」シートの「M2」セルをセットする。
(2)Findメソッドで「BB」シートの「M列」を対象に、Range型変数「c」と同じ値のセルがないか
   検索する。
(3)−1【(2)で見つからなかった(BBシートに無い)場合】
 「ZZ」シートの「A列,最終行+1」に「c」の値を出力する
(3)−2【(2)で見つかった(BBシートにある)場合】
 ア)「BB」シートで見つかった行のN列に「c」の値を出力する
 イ)Findメソッドで「CC」シートの「B列」を対象に、「c」と同じ値のセルがないか検索する。
  @【イ)で見つからなかった場合】
   なにもしない
  A【イ)で見つかった場合】
   「BB」シートの「M列、「CC」で見つかった行」セルに「*」と出力
   「BB」シートの「(「BB」で見つかった行、B列)」セルと「CC」シートの同じセル番地の
       値を比較して一致した場合、「CC」シートの(「CCシート」で見つかった行,M列)セルに
      「AA」シートの「「BB」シートで見つかった行,F列」の値を出力
(4)Range型変数「c」に「AA」シートの「M3」セルをセットする。
※(2)〜(3)を繰り返し

 
こうなるのかなぁとおもったわけですが、、実際のコードに注目するとイ)あたりから、
 ・Findメソッド実行してるわけではないし、
 ・唐突に、プロシージャ内で使ってない(取得した値を参照したり、出力したりしてない)変数に
  「AA」シートや「BB」シートの値を格納してるし、
 ・「ZZ」シートを対象範囲にしたループ回し始めるし、
という感じで、何が何だかわからないないから整理できないとおもって投げました。
 
で、それをふまえて、まずは全体の整理をしてから(質問者さんがやりたいことを把握してから)のほうがアドバイスしやすいかなとおもって、コメントをさせて頂きました。
 
まぁ、整理できたところで、私がわかるかどうか解らないんですけど。。。

回答
投稿日時: 18/01/25 23:39:08
投稿者: simple

> 実は、業務パソコンからは、こちらを見ることはできませんので
> コードをプリントアウトし、自宅のパソコンから、質問しています。

ご苦労様です。
それはそれとして、あなたの自宅のPCにはExcelが入っていないのですか?
質問するなら、いったんVBEに打ち込んで、コンパイルチェックくらいしたうえで、
それをそのままコピーペイストしてください。
 
あなたのタイプミスをいちいち検証させられる回答者が可哀想です。
 
少なくとも、コンパイルエラーが出ないようなコードを提示するのは、
質問者の最低の礼儀です。
 
色々な助言がありましたが、私はひとつのことをお尋ねしたい。
 
> Option Explicit
> の指定をお勧めいたします。
との貴重な指摘がありました。
あなたは、このことの意義をどう理解していますか?
 
Option Explicit
を書かなければ、どんなデメリットがあるかご存じですか?
書くことによって、どんな事態が避けられるかご存じですか?
 
また、モジュールを作成したときに、
Option Explicit
が自動的に書き込まれるVBEのオプション設定のことをご存じですか?

回答
投稿日時: 18/01/26 12:03:44
投稿者: もこな2

simpleさんのコメントを拝見して、私もコードのアドバイスとは別のところになりますが、2点ほど追加コメントです。
 
(1)
  自宅のパソコンにエクセルが入ってなくてVBE(エディター)使えない&テストもできないって
 状況なのかなとおもいました。
  で、プリントアウトしたのを持ち帰って、手打ちで再現してから投稿してるのかなぁと・・・
  それはそれで大変だと思うので、プリントアウトじゃなくてメールにコピペして自宅のPCに送って
  それを、コピペして投稿したらいかがでしょうか。
 
(2)
  「Option Explicit」への反応をみると、エクセルVBAを扱うようになってからそんなに時間が経って
 いないんじゃないかなぁとおもいました。
  誰もが最初に通る道だと思いますが、変数の宣言を強制するようにしておいたほうが絶対いいです。
 (というか、変数の宣言は強制されているとおもって回答してしまいます。(私だけかもですが))
 simpleさんが指摘されてますが、もし知らなかったら↓このへんで、調べてみてください。
  http://officetanaka.net/excel/vba/variable/index.htm
   ※1、2あたりを読めばよいかとおもいます。
 変数の宣言を強制するメリットは↓あたりが分かりやすいとおもいます。
  http://officetanaka.net/excel/vba/beginner/06.htm
 
いや、どちらも知ってるし、やってるってことでしたらお目汚し失礼しました。

回答
投稿日時: 18/01/27 21:10:36
投稿者: baoo

皆さんの指摘ももっともなんですが、
私も指摘されてないことを。
 
よくDim i As Longと変数宣言することがありますが、
このiってのはFor i=0 To 100等のように
いろんなループで使いまわされる時に使用される特に意味のないカウンタなわけです。
あるいはDim cl As Rangeなどとする場合、
Set cl=Columns(5).Find("hoge", LookAt:=xlWhole)等、
いろんなところに使いまわすけどこれ自体はとりたてて名前を意識する必要のない
変数なわけです。
 
でもね、変数の中には名前から意味が分かるべきものってのがあるんです。
Dim i As Longは恐らく他の方も分かってくれるでしょう。
他言語などでも使われますし。
Dim cl As Rangeも多少、俺様ルールですが分かってくれると思います。
けれども、そういうもの以外は変数名を決めるのに時間をかけるべきです。
 
Dim myuvalue As Variant
これはいただけません。
もしかしたらこの変数も上記iやclのようなものかもしれません。
しかし、そういう変数が10個以上も並ぶということはちょっと考えられません。
 
それから、Variant変数ってのは敢えて使うことで絶大な効果を得る場合もありますが、
仕方のない場合以外は使うべきではないと考えます。
その変数がどういう型であるべきかを考えないとバグの温床になりますし、
そのコードが理解されにくいものになります。
 
'ZZシートの値を削除
こんなコメントは必要ありません。
コメントが無くてもコードを見れば一瞬でわかる。
必要なのは何故それをするのか、何のためにそれをするのかです。
コードを見れば、おそらく初期化やリセットの為でしょう。
無くても良いかもしれないけど敢えて書くなら
'初期化処理
とすべきでしょう。
 
 
 

回答
投稿日時: 18/01/28 00:04:00
投稿者: simple

コードの中身を拝見しました。
もう少し頑張らないといけないですね。
 
1. まずコードにする前に、日本語で正確にやりたいことを書いてみることを薦めます。
2. もしくは、自分の書いたコードにコメントをつけてみることです。
   たとえば、BlastRowという変数がありますが、
   それは何をするための変数ですか?日本語で説明してみましょう。
   説明ができないとしたら、ご自分の論理が曖昧だからです。
   よく考えましょう。
3. また、全体を一挙にせずに、部分から取組むことです。
  まずは、物品番号を検索して、マッチしなかったらどうする、というところから始めてみては?
 
適当にコードを組み合わせれば結果が得られるというものではないです。
特に、Web上のコードを中身を理解せずに、組み合わせて凌いできた経験が長くなると、
自分が理解していることとそうでないことの区分けがつかなくなってしまうリスクがあります。
それから抜けるためには、自分の頭で考えるしかありません。
逆に、そこをしっかり取り組めば、効果は大きく、視野がぐっと開けてくるはずです。
テキストでしっかり読み確認しながら、ご自分の論理を鍛えてみてください。

トピックに返信