
ループ内の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)
-
VBA Match関数の限界
Excel(エクセル)
-
worksheetFunctionクラスのVlookupプロパティを取得できません エラーへの対応
Visual Basic(VBA)
-
-
4
matchプロパティを取得できません…と出ます。
PowerPoint(パワーポイント)
-
5
VBAで配列の計算
Excel(エクセル)
-
6
excel match で日付が見つからない
PowerPoint(パワーポイント)
-
7
複数の条件に合う行番号を取得するには
その他(Microsoft Office)
-
8
エクセルVBA Unionはなぜ遅い?
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
括弧があるとHYPERLINKで飛べな...
-
エクセルで複数のシートをフォ...
-
フォルツァ バッテリーを外して...
-
Vba Array関数について教えてく...
-
取れなくなった熱伝導シートの...
-
【マクロ】シートの変数へ入れ...
-
建築模型、カーブの作り方
-
Excel複数シートから日付と文字...
-
IHクッキングヒーターの操作パ...
-
台車の下に敷くシートについて
-
トランポの改造
-
Excel VBA シート名変更時、重...
-
vfr400r(NC30)のバッテリー交換
-
Excelで、別シートの表のステー...
-
Google スプレッドシート:FILT...
-
粘土板に付かないようにするには
-
電車のシートって何でこんな暑...
-
ジプトーン二重張りのビスの長...
-
車のシートがへたってきました...
-
リトルカブにダブルシートをつ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで複数のシートをフォ...
-
括弧があるとHYPERLINKで飛べな...
-
飛行機の座席について 3列シー...
-
2024年式タフトに乗っています...
-
フォルツァ バッテリーを外して...
-
Excel複数シートから日付と文字...
-
IHクッキングヒーターの操作パ...
-
ポケットにミシンでワッペンを...
-
エクセルVBA 4行飛ばしで転記す...
-
シートベルトの固定解除
-
原付 レッツシート開け方
-
BRIDEのシート張り替えってでき...
-
【マクロ】シートの変数へ入れ...
-
水の染み込んだバイクのシート...
-
ポップコーンの捨て方
-
マジェスティ(4HC)のシート下...
-
車のシートがへたってきました...
-
カッティングシートの上からア...
-
建築模型、カーブの作り方
-
Excel VBA シート名変更時、重...
おすすめ情報