Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


768 / 13645 ツリー ←次へ | 前へ→

【78433】Match関数の使い方 tomi 16/9/22(木) 12:00 質問[未読]
【78434】Re:Match関数の使い方 γ 16/9/22(木) 14:28 発言[未読]
【78435】Re:Match関数の使い方 tomi 16/9/22(木) 15:15 お礼[未読]
【78436】Re:Match関数の使い方 γ 16/9/22(木) 21:09 発言[未読]
【78437】Re:Match関数の使い方 tomi 16/9/23(金) 10:41 お礼[未読]
【78438】Re:Match関数の使い方 γ 16/9/23(金) 10:52 発言[未読]

【78433】Match関数の使い方
質問  tomi  - 16/9/22(木) 12:00 -

引用なし
パスワード
   よろしくお願いします
For i=1 to BB  
 PL = Workbooks("原料配合表.xlsb").Sheets(i).Range("A1000").End(xlUp).Row
 On Error Resume Next
 AA = Application.WorksheetFunction.Match(ZRK, Workbooks("配合.xlsb").Sheets(i).Range(Cells(3, 6), Cells(PL, 6)), 0)
Next
 Range(Cells(3, 6), Cells(PL, 6))のところに計算式に
 =+A48&" "&B48&" "&C48&" "&D48がはいっているためデータが読み出しが
 できません。計算式がなく入力したものは検出できます。
 上記のMatchのプログラムのどのようになおしたらよいか教えてください。

【78434】Re:Match関数の使い方
発言  γ  - 16/9/22(木) 14:28 -

引用なし
パスワード
   セル内の計算式がどうこうというのは、こちらでは不明です。
説明が足りませんので。
それよりもまず、セル範囲を正確に書くことが先決です。
シートを特定しないセル範囲は、アクティブシートのそれとみなされてしまいます。
どう書くか、例えば、以下。

Sub test()
  Dim ws As Worksheet
  '他の変数の宣言は記載省略しました。きちんと宣言すべきです。
  
  For i = 1 To BB
    Set ws = Workbooks("原料配合表.xlsb").Sheets(i)
    PL = ws.Range("A1000").End(xlUp).Row
    On Error Resume Next
    AA = Application.WorksheetFunction.Match(ZRK, ws.Range(ws.Cells(3, 6), ws.Cells(PL, 6)), 0)
  Next
End Sub

【78435】Re:Match関数の使い方
お礼  tomi  - 16/9/22(木) 15:15 -

引用なし
パスワード
   ▼γ さん:
>セル内の計算式がどうこうというのは、こちらでは不明です。
>説明が足りませんので。
>それよりもまず、セル範囲を正確に書くことが先決です。
>シートを特定しないセル範囲は、アクティブシートのそれとみなされてしまいます。
>どう書くか、例えば、以下。
>
>Sub test()
>  Dim ws As Worksheet
>  '他の変数の宣言は記載省略しました。きちんと宣言すべきです。
>  
>  For i = 1 To BB
>    Set ws = Workbooks("原料配合表.xlsb").Sheets(i)
>    PL = ws.Range("A1000").End(xlUp).Row
>    On Error Resume Next
>    AA = Application.WorksheetFunction.Match(ZRK, ws.Range(ws.Cells(3, 6), ws.Cells(PL, 6)), 0)
>  Next
>End Sub
ありがとうございました。どのブックのシートをはっきりさせてやってみます。

【78436】Re:Match関数の使い方
発言  γ  - 16/9/22(木) 21:09 -

引用なし
パスワード
   追加で少しコメントしておきます。

On Error Resume Next
としているのでエラーが隠蔽されますが、このケースでは少なくとも2種類のエラーがありえます。
(1)マッチするものがないことによるエラー
(2)セル範囲の指定に不備があって発生するエラー

両方を区別せずに、見逃してしまうOn Error Resume Nextの使用は、
できるだけ避けたほうが良いと思います。
(実際、この場合は、エラーにならないので、(2)に気づかなかったのでしょう)

---------------
まず(2)については、
  Sheet1がアクティブであるときに、
      Sheet2.Range(Cells(1,1),Cells(5,1))
  などと書くことによるエラー。(今回のケースはこれです。)
      Sheet2.Range(Sheet1.Cells(1,1),Sheet1.Cells(5,1))
  と書いているのと同じですから、Excel君が混乱を来すのです。
こうしたものはむしろエラーになるべきなんです。

---------------
次に(1)ですが、
AA = Application.WorksheetFunction.Match(ZRK, ws.Range(ws.Cells(3, 6), ws.Cells(PL, 6)), 0)
ではなく、
AA = Application.Match(ZRK, ws.Range(ws.Cells(3, 6), ws.Cells(PL, 6)), 0)
とすることで、エラーで止まるのを避けることができます。

該当が無い場合には、エラーを示す情報がAAに返りますから、
If IsError(AA) Then などとして、マッチの有無を判定することができます。

詳しくは、例えば、
ht tps://www.moug.net/tech/exvba/0100035.html
をごらんください。

【78437】Re:Match関数の使い方
お礼  tomi  - 16/9/23(金) 10:41 -

引用なし
パスワード
   ▼γ さん:
>追加で少しコメントしておきます。
>
>On Error Resume Next
>としているのでエラーが隠蔽されますが、このケースでは少なくとも2種類のエラーがありえます。
>(1)マッチするものがないことによるエラー
>(2)セル範囲の指定に不備があって発生するエラー
>
>両方を区別せずに、見逃してしまうOn Error Resume Nextの使用は、
>できるだけ避けたほうが良いと思います。
>(実際、この場合は、エラーにならないので、(2)に気づかなかったのでしょう)
>
>---------------
>まず(2)については、
>  Sheet1がアクティブであるときに、
>      Sheet2.Range(Cells(1,1),Cells(5,1))
>  などと書くことによるエラー。(今回のケースはこれです。)
>      Sheet2.Range(Sheet1.Cells(1,1),Sheet1.Cells(5,1))
>  と書いているのと同じですから、Excel君が混乱を来すのです。
>こうしたものはむしろエラーになるべきなんです。
>
>---------------
>次に(1)ですが、
>AA = Application.WorksheetFunction.Match(ZRK, ws.Range(ws.Cells(3, 6), ws.Cells(PL, 6)), 0)
>ではなく、
>AA = Application.Match(ZRK, ws.Range(ws.Cells(3, 6), ws.Cells(PL, 6)), 0)
>とすることで、エラーで止まるのを避けることができます。
>
>該当が無い場合には、エラーを示す情報がAAに返りますから、
>If IsError(AA) Then などとして、マッチの有無を判定することができます。
>
>詳しくは、例えば、
>ht tps://www.moug.net/tech/exvba/0100035.html
>をごらんください。
ありがとうございました。確かにエラー回避はプログラム進行の為必要との
単純な考えでやってしまいました。どこにエラーがあるかわかれば非常に良いことです。もう一度じっくり勉強してみます。

【78438】Re:Match関数の使い方
発言  γ  - 16/9/23(金) 10:52 -

引用なし
パスワード
   ところで、
> Range(Cells(3, 6), Cells(PL, 6))のところに計算式に
> =+A48&" "&B48&" "&C48&" "&D48がはいっているためデータが読み出しが
> できません。計算式がなく入力したものは検出できます。
の原因は判明したのですか?
式の結果に対してマッチするかどうかです、式があるかは無関係です。

急かす意図はないのですが、気にはなりました。
まあ、マイペースでゆっくり取り組んでください。

なお、むやみに全文引用せずに必要な範囲で引用するのが普通です。
気をつけた方がよろしいかと思いました。
それではこれで。

768 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free