ループ内のMatchで値がないと止まってしまいます。
On Error Resume Nextで回避すると次のデータに前のデータが入力されてしまいます。
Dim TATE2 '「データ」シートの縦
Dim MaxRow
Dim 氏名
Dim 科目
Dim MaxCol
Dim myCol As Variant
MaxRow = Worksheets(シート2).Range("A6").End(xlDown).Row
MaxCol = Worksheets(シート2).Range("E3").End(xlToRight).Column
For 縦 = 6 To MaxRow '「データ」シートの縦
氏名 = Worksheets(シート2).Cells(縦, 4).Value
myRow = WorksheetFunction.Match(氏名, Worksheets(シート1).Range("D1:D200"), 0)
For 横 = 5 To 200
If Worksheets(シート2).Cells(5, 横).Value = "" Then
Else
科目 = Worksheets(シート2).Cells(5, 横).Value
myCol = WorksheetFunction.Match(科目, Worksheets(シート1).Range("E2:IZ2"), 0)
Worksheets(シート2).Cells(縦, 横).Value = Worksheets(シート1).Cells(myRow, myCol + 4).Value
End If
Next 横
Next 縦
A 回答 (7件)
- 最新から表示
- 回答順に表示
No.7
- 回答日時:
こんばんは。
On Error Resume Next を用いた方法は、Microsoft としては正統派の使い方です。
なまじ、ワークシート関数を使うと、その使いこなしは、あまりちゃんと出ていないので、いろんな回答が生まれてしまうのですが、その元凶は、マイクロソフト側がExcel 2000 VBAが仕様を変えたからなのです。
myRow = WorksheetFunction.Match(氏名, Worksheets(シート1).Range("D1:D200"), 0)
ここでは、そのままでは、残念ながら使えませんね。WorksheetFunction.Matchでは、VBA全体にエラーが走るので、On Error Resume Next を使うなら、
myRow ="" '←Variant 型に限る
myRow = WorksheetFunction.Match(氏名, Worksheets(シート1).Range("D1:D200"), 0)
If IsNumeric(myRow) then
・
・
・
myCol ="" '←Variant 型に限る
myCol = WorksheetFunction.Match(科目, Worksheets(シート1).Range("E2:IZ2"), 0)
If IsNumeric(myCol) Then
として、エラー値の時飛び越えたものをクリアしてあげないといけませんね。
余談ですが、
WorksheetFunction.Match とすることで、VBAにはワークシートの関数が組み込まれますが、エラーは、VBA全体に掛かってきてしまいます。
On Error Resume Next は、そのエラーを飛び越えて次のステップに行くようになりますが、その時の戻り値は、更新されていません。
昔から、VBAを使ってきた人は、Excel 97 スタイルで、Application.Match と使います。そうすると、ワークシートで扱うのと同様に、エラー値と数値が戻り値で得られますから、IsNumeric(戻り値)だけで済むようになります。スピードもかなり速いはずです。この際、戻り値の変数は、必ず、Variant 型にするのがコツです。
No.5
- 回答日時:
こんばんは!
>ループ内のMatchで値がないと止まってしまいます。
MATCH関数で返ってくるのは数値です。
対象がない場合はエラーになりますので、エラーでない場合のみ次へ進むようにしてみてはどうでしょうか?
未検証ですが・・・
>Worksheets(シート2).Cells(縦, 横).Value = Worksheets(シート1).Cells(myRow, myCol + 4).Value
の1行を
If IsNumeric(myCol) Then
Worksheets(シート2).Cells(縦, 横).Value = Worksheets(シート1).Cells(myRow, myCol + 4).Value
End If
といった感じで・・・m(_ _)m
No.4
- 回答日時:
No.3訂正です
× :MYMATCHERROR
○ MYMATCHERROR:
No.3
- 回答日時:
ちょっと不格好ですが別関数を作成してみてはどうでしょうか
呼び出し側
myRow = myMatch(氏名,"D1:D200")
あるいは
myCol = myMatch(科目,"E2:IZ2")
別関数
Function myMatch(ByVal word As String, ByVal area As String) As Long
On Error GoTo MYMATCHERROR
myMatch = WorksheetFunction.Match(word, Worksheets(シート1).Range(area), 0)
Exit Function
:MYMATCHERROR
myMatch = 0
Exit Function
End Function
で、以下の部分はif文で囲みます。
Worksheets(シート2).Cells(縦, 横).Value = Worksheets(シート1).Cells(myRow, myCol + 4).Value
If myRow = 0 Or myCol = 0 Then
Else
Worksheets(シート2).Cells(縦, 横).Value = Worksheets(シート1).Cells(myRow, myCol + 4).Value
End If
No.1
- 回答日時:
こんにちは
>ループ内のMatchで値がないと止まってしまいます。
ワークシート関数のMatchはそういう仕様になっています。
>On Error Resume Nextで回避すると次のデータに前のデータが入力されてしまいます。
ん??
それって、On Error Resume Nextって1行を入れただけってことでしょうか?
であれば、「前のデータが入力されてしまいます」は十分に起こり得る結果です。
通常、エラー処理を行うような場合は、エラーが発生する可能性のある処理の直後(あるいはエラー時の分岐)で、『ラーの有無やその内容を調べて、それに応じて処理を行う』ようにするのが一般的です。
これに該当する処理がないのであれば、見かけ上は、「エラーが発生してもエラー表示はせず、そのままの状態から処理を継続する」ということになります。
「質問者様が思っていることを忖度して、うまく処理してくれる」ことを期待していらっしゃるならそのようなことはまったくありません。
というか、ご自分でそのようなコードをきちんと記述しておく必要があります。
エラー発生の有無を調べるには、Errオブジェクトをチェックするようにしてください。
https://docs.microsoft.com/en-us/office/vba/lang …
もしも、「エラー処理なんてよくわからん」というのであれば、ワークシート関数のMatchを利用する代わりに、VBAの場合はRange.Findメソッドを使用すればほぼ同様の機能ながらエラーが発生することはなくなります。
https://docs.microsoft.com/en-us/office/vba/api/ …
とは言え、該当するものが見つからない場合には戻り値がNothingとなりますので、結果をチェックし、それに応じた処理を行うということに関しては変わりはないでしょう。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) なぜExit Subがあるのかわかりません 4 2023/02/19 12:34
- Visual Basic(VBA) VBAコードが作動せず、どこに問題があるのか教えて下さい。 3 2023/06/13 13:20
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたい 6 2023/01/23 12:00
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) 他のシートからコピーする下記マクロで貼付け位置をWorksheets(1).Range("A3")の 8 2023/01/30 18:48
- Excel(エクセル) VBAについて 3 2022/06/19 18:19
- Visual Basic(VBA) VBA処理追加 こちらでご教示頂いたのですが回答完了させてしまいましたのでこちらからまた質問させてく 2 2022/10/27 09:57
- Excel(エクセル) VBAの指示の内容 昨日こちらでご教示頂いたのですが初心者な為、一つ一つの指示が何をやっているのかわ 2 2022/10/25 18:08
- Visual Basic(VBA) VBAが止まります。 1 2022/09/02 14:51
- Visual Basic(VBA) 【VBA】特定のワードが入っている行全体を塗りつぶしたい 4 2022/04/20 15:22
このQ&Aを見た人はこんなQ&Aも見ています
-
「環境が人を育てる」って本当?環境によって人格や生き方は本当に変わるのか
環境が人生に与える影響は実際どれほどのものなのか、専門家の田宮由美さんに伺った。
-
Application.Matchで特定行の検索
Visual Basic(VBA)
-
複数の条件に合う行番号を取得するには
その他(Microsoft Office)
-
VBAのコマンドボタンの文字列の改行方法は?
Visual Basic(VBA)
-
-
4
VBAでの Replace関数で、ワイルドカードは使えないのでしょうか?
Visual Basic(VBA)
-
5
i=cells(Rows.Count, 1)とi=cells(Rows.Count, 2)の違い
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ショップの方と意見の食い違い...
-
原付 レッツシート開け方
-
エクセルで複数のシートをフォ...
-
リアシート無しで運転してたら...
-
括弧があるとHYPERLINKで飛べな...
-
シートベルトの固定解除
-
Excel VBA シート名変更時、重...
-
粘土板に付かないようにするには
-
建築模型、カーブの作り方
-
ポップコーンの捨て方
-
エクセルVBA 4行飛ばしで転記す...
-
芝生が根付かず苔ばかり生えて...
-
失敗したスライムの捨て方につ...
-
NCロードスター シート交換
-
バイクのシートを取り替えても...
-
台車の下に敷くシートについて
-
【マイカーロールスロイス化計...
-
車のシートがへたってきました...
-
水の染み込んだバイクのシート...
-
ドライブレコーダーのSDカード...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで複数のシートをフォ...
-
括弧があるとHYPERLINKで飛べな...
-
建築模型、カーブの作り方
-
原付 レッツシート開け方
-
エクセルVBA 4行飛ばしで転記す...
-
Excel複数シートから日付と文字...
-
Excel VBA シート名変更時、重...
-
フォルツァ バッテリーを外して...
-
水の染み込んだバイクのシート...
-
BRIDEのシート張り替えってでき...
-
車のシートでおもらし
-
ノートe12ガソリン
-
リアシート無しで運転してたら...
-
ポップコーンの捨て方
-
車のシートがへたってきました...
-
シートベルトの固定解除
-
バイクのシートを取り替えても...
-
台車の下に敷くシートについて
-
マグネットシートって・・・
-
IHクッキングヒーターの操作パ...
おすすめ情報