Excel VBA質問箱 IV

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

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


8327 / 13646 ツリー ←次へ | 前へ→

【33561】FIND ゼロイオン 06/1/15(日) 17:43 質問[未読]
【33562】Re:FIND かみちゃん 06/1/15(日) 17:50 回答[未読]
【33567】Re:FIND BB 06/1/15(日) 19:43 発言[未読]
【33624】Re:FIND ゼロイオン 06/1/16(月) 23:50 お礼[未読]
【33867】Re:FIND ゼロイオン 06/1/23(月) 5:16 質問[未読]
【33868】Re:FIND プルート 06/1/23(月) 6:13 発言[未読]
【33869】Re:FIND プルート 06/1/23(月) 6:37 発言[未読]
【33870】Re:FIND ゼロイオン 06/1/23(月) 7:09 質問[未読]
【33873】Re:FIND プルート 06/1/23(月) 7:34 発言[未読]
【33874】Re:FIND プルート 06/1/23(月) 7:51 発言[未読]
【33875】Re:FIND ゼロイオン 06/1/23(月) 8:39 質問[未読]
【33876】Re:FIND プルート 06/1/23(月) 9:11 発言[未読]
【33877】Re:FIND ゼロイオン 06/1/23(月) 9:18 発言[未読]
【33878】Re:FIND プルート 06/1/23(月) 9:24 発言[未読]
【33886】Re:FIND 記録マクロに毛が3本 06/1/23(月) 11:13 発言[未読]
【33933】Re:FIND ゼロイオン 06/1/24(火) 0:30 質問[未読]
【33934】Re:FIND プルート 06/1/24(火) 1:22 発言[未読]
【33937】Re:FIND ゼロイオン 06/1/24(火) 2:21 発言[未読]
【33935】Re:FIND かみちゃん 06/1/24(火) 1:50 発言[未読]
【33938】Re:FIND ゼロイオン 06/1/24(火) 5:36 お礼[未読]
【33939】Re:FIND かみちゃん 06/1/24(火) 6:30 発言[未読]
【34016】Re:FIND ゼロイオン 06/1/25(水) 5:03 発言[未読]
【34018】Re:FIND かみちゃん 06/1/25(水) 7:38 発言[未読]
【34019】Re:FIND メカ大好き! 06/1/25(水) 7:53 発言[未読]

【33561】FIND
質問  ゼロイオン  - 06/1/15(日) 17:43 -

引用なし
パスワード
   Worksheets(1).Cells.Find("hoge", , xlValues, , , xlPrevious).Rowで
セルの中に指定文字がないとエラーがでてしまいますが、
なくてもエラーを出さない方法はないものなのでしょうか?

【33562】Re:FIND
回答  かみちゃん  - 06/1/15(日) 17:50 -

引用なし
パスワード
   こんにちは。かみちゃん です。

> Worksheets(1).Cells.Find("hoge", , xlValues, , , xlPrevious).Rowで
>セルの中に指定文字がないとエラーがでてしまいますが、
>なくてもエラーを出さない方法はないものなのでしょうか?

Findメソッドのヘルプに使用例とともに載っているので確認していただきたいのですが、
以下のように複数行にわけて記述します。

Sub Macro1()
 Dim c As Range
 
 Set c = Worksheets(1).Cells.Find("hoge", , xlValues, , , xlPrevious)
 If Not c Is Nothing Then
  MsgBox "hogeは" & c.Row & "行目に見つかりました"
 Else
  MsgBox "hogeは見つかりませんでした。"
 End If
 Set c = Nothing
End Sub

【33567】Re:FIND
発言  BB  - 06/1/15(日) 19:43 -

引用なし
パスワード
   ▼ゼロイオン さん:
> Worksheets(1).Cells.Find("hoge", , xlValues, , , xlPrevious).Rowで
>セルの中に指定文字がないとエラーがでてしまいますが、
>なくてもエラーを出さない方法はないものなのでしょうか?

エラーを出さない方法は、かみちゃんさんが書かれています。
他の方法として、on errorステートメントがあります。
on error resume next
Worksheets(1).Cells.Find("hoge", , xlValues, , , xlPrevious).Row
on error goto 0

エラーが出ないという考えとは少し違うかもしれませんが。

【33624】Re:FIND
お礼  ゼロイオン  - 06/1/16(月) 23:50 -

引用なし
パスワード
   参考になるいます!
ありがとうございました!

【33867】Re:FIND
質問  ゼロイオン  - 06/1/23(月) 5:16 -

引用なし
パスワード
   for x = 1 to シート数
on error resume next
行 = Worksheets(1).Cells.Find("シート名", , xlValues, , , xlPrevious).Row
on error goto 0

Workbooks("ブック.xls").Worksheets(2).Cells(行, 256).End(xlToLeft).Offset(, 1).Value = 時間 '時間
Workbooks("ブック.xls").Worksheets(2).Cells(行, 256).End(xlToLeft).Offset(, 1).Value = 野菜値段 * 魚値段 '金額
Workbooks("ブック.xls").Worksheets(2).Cells(行, 256).End(xlToLeft).Offset(, 1).Value = 持ち金 - 購入金額 'おつり
 
next x

あらたに問題が発生しました。
on errorをやったあとに下のコードを実行しています。
しかし、このコードforで繰り返しているのですが
これを実行すると行に入る値がエラーの場合、回避できるところまでいいのですが、
エラーになる前に割り出した行の値が残っているので
on error goto 0
から下のコードを実行して、同じ行の後ろに割り出してしまうので
間違った結果になってしまいます。

そこでエラーが出た場合、on error goto 0から下のコードを
ぶっ飛ばして次のforのstepにいくにはどうしたいいのでしょうか?
ちなにみ、要点以外他の部分は割愛させてもらってます

【33868】Re:FIND
発言  プルート  - 06/1/23(月) 6:13 -

引用なし
パスワード
   ▼ゼロイオン さん:
>for x = 1 to シート数
>on error resume next
>行 = Worksheets(1).Cells.Find("シート名", , xlValues, , , xlPrevious).Row
>on error goto 0
>
>Workbooks("ブック.xls").Worksheets(2).Cells(行, 256).End(xlToLeft).Offset(, 1).Value = 時間 '時間
>Workbooks("ブック.xls").Worksheets(2).Cells(行, 256).End(xlToLeft).Offset(, 1).Value = 野菜値段 * 魚値段 '金額
>Workbooks("ブック.xls").Worksheets(2).Cells(行, 256).End(xlToLeft).Offset(, 1).Value = 持ち金 - 購入金額 'おつり
> 
>next x
>
>あらたに問題が発生しました。
>on errorをやったあとに下のコードを実行しています。
>しかし、このコードforで繰り返しているのですが
>これを実行すると行に入る値がエラーの場合、回避できるところまでいいのですが、
>エラーになる前に割り出した行の値が残っているので
>on error goto 0
>から下のコードを実行して、同じ行の後ろに割り出してしまうので
>間違った結果になってしまいます。
>
>そこでエラーが出た場合、on error goto 0から下のコードを
>ぶっ飛ばして次のforのstepにいくにはどうしたいいのでしょうか?
>ちなにみ、要点以外他の部分は割愛させてもらってます

On Error Resume Next と
On Error Goto 0
の意味を理解して使われていますか?

On Error Resume Nextは、エラーが発生しても無視して次の行に行っちゃいなさいって意味。
On Error Goto 0は、On Error Resume Nextで無視したことを解除しなさい。って意味。

だから、エラーが発生しても無視して次の行にいきたいのなら、On Error Goto 0を生かしておけばいいわけですよね。
On Error Resume Nextを消すか、Next xの前に書けばいいと思いますが。

【33869】Re:FIND
発言  プルート  - 06/1/23(月) 6:37 -

引用なし
パスワード
   ▼プルート さん:
>▼ゼロイオン さん:
>>for x = 1 to シート数
>>on error resume next
>>行 = Worksheets(1).Cells.Find("シート名", , xlValues, , , xlPrevious).Row
>>on error goto 0
>>
>>Workbooks("ブック.xls").Worksheets(2).Cells(行, 256).End(xlToLeft).Offset(, 1).Value = 時間 '時間
>>Workbooks("ブック.xls").Worksheets(2).Cells(行, 256).End(xlToLeft).Offset(, 1).Value = 野菜値段 * 魚値段 '金額
>>Workbooks("ブック.xls").Worksheets(2).Cells(行, 256).End(xlToLeft).Offset(, 1).Value = 持ち金 - 購入金額 'おつり
>> 
>>next x
>>
>>あらたに問題が発生しました。
>>on errorをやったあとに下のコードを実行しています。
>>しかし、このコードforで繰り返しているのですが
>>これを実行すると行に入る値がエラーの場合、回避できるところまでいいのですが、
>>エラーになる前に割り出した行の値が残っているので
>>on error goto 0
>>から下のコードを実行して、同じ行の後ろに割り出してしまうので
>>間違った結果になってしまいます。
>>
>>そこでエラーが出た場合、on error goto 0から下のコードを
>>ぶっ飛ばして次のforのstepにいくにはどうしたいいのでしょうか?
>>ちなにみ、要点以外他の部分は割愛させてもらってます
>
>On Error Resume Next と
>On Error Goto 0
>の意味を理解して使われていますか?
>
>On Error Resume Nextは、エラーが発生しても無視して次の行に行っちゃいなさいって意味。
>On Error Goto 0は、On Error Resume Nextで無視したことを解除しなさい。って意味。
>
>だから、エラーが発生しても無視して次の行にいきたいのなら、On Error Goto 0を生かしておけばいいわけですよね。
On Error Resume Nextを生かしておけばいいわけでした・・・ゴメンなさい

>On Error Resume Nextを消すか、Next xの前に書けばいいと思いますが。

【33870】Re:FIND
質問  ゼロイオン  - 06/1/23(月) 7:09 -

引用なし
パスワード
   いわれたとおり、
for x = 1 to シート数
on error resume next
行 = Worksheets(1).Cells.Find("シート名", , xlValues, , , xlPrevious).Row


Workbooks("ブック.xls").Worksheets(2).Cells(行, 256).End(xlToLeft).Offset(, 1).Value = 時間 '時間
Workbooks("ブック.xls").Worksheets(2).Cells(行, 256).End(xlToLeft).Offset(, 1).Value = 野菜値段 * 魚値段 '金額
Workbooks("ブック.xls").Worksheets(2).Cells(行, 256).End(xlToLeft).Offset(, 1).Value = 持ち金 - 購入金額 'おつり
 
next x

か、

for x = 1 to シート数
行 = Worksheets(1).Cells.Find("シート名", , xlValues, , , xlPrevious).Row


Workbooks("ブック.xls").Worksheets(2).Cells(行, 256).End(xlToLeft).Offset(, 1).Value = 時間 '時間
Workbooks("ブック.xls").Worksheets(2).Cells(行, 256).End(xlToLeft).Offset(, 1).Value = 野菜値段 * 魚値段 '金額
Workbooks("ブック.xls").Worksheets(2).Cells(行, 256).End(xlToLeft).Offset(, 1).Value = 持ち金 - 購入金額 'おつり

on error resume next
 
next x

としてみましたが、結果は変わりませんでした、私の理解がまちがっているのでしょうか?
どなたかコードで教えてもらえるとありがたいです。

【33873】Re:FIND
発言  プルート  - 06/1/23(月) 7:34 -

引用なし
パスワード
   ▼ゼロイオン さん:
>いわれたとおり、
>for x = 1 to シート数
>on error resume next
>行 = Worksheets(1).Cells.Find("シート名", , xlValues, , , xlPrevious).Row
>
>
>Workbooks("ブック.xls").Worksheets(2).Cells(行, 256).End(xlToLeft).Offset(, 1).Value = 時間 '時間
>Workbooks("ブック.xls").Worksheets(2).Cells(行, 256).End(xlToLeft).Offset(, 1).Value = 野菜値段 * 魚値段 '金額
>Workbooks("ブック.xls").Worksheets(2).Cells(行, 256).End(xlToLeft).Offset(, 1).Value = 持ち金 - 購入金額 'おつり
> 
>next x

on error resume nextの使い方はこれでいいと思うんですが。
findで一致が見つからなかったら、行って変数にはなにもいれないってこと?
で、Worksheets(2).Cells(行, 256).End(xlToLeft).Offset(, 1)には何も計算した結果を入れないって事?

その場合は、かみちゃんさんが教えてくれた方法がいいんじゃないですか?

【33874】Re:FIND
発言  プルート  - 06/1/23(月) 7:51 -

引用なし
パスワード
   ▼ゼロイオン さん:
本当にごめんなさいね。
私がゼロイオンさんの書いたことをしっかり読んでなかったんですね。

for x = 1 to シート数
set c=Worksheets(1).Cells.Find("シート名", , xlValues, , , xlPrevious)
if not c is nothing then
  行=c.row
  Workbooks("ブック.xls").Worksheets(2).Cells(行, 256).End(xlToLeft).Offset(, 1).Value = 時間 '時間
  Workbooks("ブック.xls").Worksheets(2).Cells(行, 256).End(xlToLeft).Offset(, 1).Value = 野菜値段 * 魚値段 '金額
  Workbooks("ブック.xls").Worksheets(2).Cells(行, 256).End(xlToLeft).Offset(, 1).Value = 持ち金 - 購入金額 'おつり
end if
next x

【33875】Re:FIND
質問  ゼロイオン  - 06/1/23(月) 8:39 -

引用なし
パスワード
   かみちゃんさんの↑の方法だとエラーがでてしまうんすよね。
いきなり。
 ちなみに行はrangeではなく値を取得して入れるだけなんで、
rangeではないとおもうのですが??

【33876】Re:FIND
発言  プルート  - 06/1/23(月) 9:11 -

引用なし
パスワード
   ▼ゼロイオン さん:
>かみちゃんさんの↑の方法だとエラーがでてしまうんすよね。
>いきなり。
> ちなみに行はrangeではなく値を取得して入れるだけなんで、
>rangeではないとおもうのですが??

エラーでちゃいます?
どこで引っかかります?
なんてメッセージが出ます?

【33877】Re:FIND
発言  ゼロイオン  - 06/1/23(月) 9:18 -

引用なし
パスワード
   ▼プルート さん:
型があいません、みたいなメッセージですね
if set c = nothing then
のところですね

【33878】Re:FIND
発言  プルート  - 06/1/23(月) 9:24 -

引用なし
パスワード
   ▼ゼロイオン さん:
>▼プルート さん:
>型があいません、みたいなメッセージですね
>if set c = nothing then
>のところですね

かみちゃんさんのコードにも、わたしのコードにも
if set c=nothing then
なんてのは書いてませんけど。

【33886】Re:FIND
発言  記録マクロに毛が3本  - 06/1/23(月) 11:13 -

引用なし
パスワード
   横から失礼します

goto 0 以下の処理をしないでnext xに行くなら処理をif文で括ってしまっては?

例えば
>>for x = 1 to シート数
>>on error resume next
>>行 = Worksheets(1).Cells.Find("シート名", , xlValues, , , lPrevious).Row
'ここでエラーナンバーを取り出して
atai = Err.Number
>>on error goto 0
>>
if atai = 0 then
>>Workbooks("ブック.xls").Worksheets(2).Cells(行, 256).End(xlToLeft).Offset(, 1).Value = 時間 '時間
>>Workbooks("ブック.xls").Worksheets(2).Cells(行, 256).End(xlToLeft).Offset(, 1).Value = 野菜値段 * 魚値段 '金額
>>Workbooks("ブック.xls").Worksheets(2).Cells(行, 256).End(xlToLeft).Offset(, 1).Value = 持ち金 - 購入金額 'おつり
end if
>> 
>>next x

又は
>>for x = 1 to シート数
>>on error resume next
>>行 = Worksheets(1).Cells.Find("シート名", , xlValues, , , lPrevious).Row
>>
if Err.Number = 0 then
>>Workbooks("ブック.xls").Worksheets(2).Cells(行, 256).End(xlToLeft).Offset(, 1).Value = 時間 '時間
>>Workbooks("ブック.xls").Worksheets(2).Cells(行, 256).End(xlToLeft).Offset(, 1).Value = 野菜値段 * 魚値段 '金額
>>Workbooks("ブック.xls").Worksheets(2).Cells(行, 256).End(xlToLeft).Offset(, 1).Value = 持ち金 - 購入金額 'おつり
end if
>>on error goto 0
>> 
>>next x

はずしていたらごめんなさい

【33933】Re:FIND
質問  ゼロイオン  - 06/1/24(火) 0:30 -

引用なし
パスワード
   ▼記録マクロに毛が3本 さんの方法で少し解決しましたが、
なぜか失敗している箇所が少しですが見つかりました。
何が原因なのでしょう?
前回よりは少しよくなっています。

【33934】Re:FIND
発言  プルート  - 06/1/24(火) 1:22 -

引用なし
パスワード
   ▼ゼロイオン さん:
>▼記録マクロに毛が3本 さんの方法で少し解決しましたが、
>なぜか失敗している箇所が少しですが見つかりました。
>何が原因なのでしょう?
>前回よりは少しよくなっています。

かみちゃんさん、BBさん、記録マクロに毛が3本さん、私と複数の人がFINDの使い方を書いてますよね。
誰かの方法を参考にして、ゼロイオンさんなりのコードを書いているんですよね?
誰かの方法を丸写ししてるんじゃなくて、ゼロイオンさんなりのコードを書いてるんですよね?

自分なりに書き換えたコードがこちらでは分からないため、原因は何かなんて分かるはずもないですよね?
全部コードをここにのせちゃえばいいんじゃないですか?

それより、このスレの主旨はFINDの使い方だったんじゃないんですか?

【33935】Re:FIND
発言  かみちゃん  - 06/1/24(火) 1:50 -

引用なし
パスワード
   こんにちは。かみちゃん です。

今日、ひさしぶりこのスレッドを見ました。

>なぜか失敗している箇所が少しですが見つかりました。
>何が原因なのでしょう?

[#33562][#33874]で提示しているコードを再度ご確認ください。
記述の仕方が違うと思います。違う記述をされて動かない、エラーが出ると言われましても、責任持てません。

どうしても、On Error 〜 を使いたいのならば、
行という変数を先頭で初期化しておけばいいと思います。
つまり、以下のような感じにします。
For x = 1 To シート数
 行 = 0 '行番号は、1〜65536であるため0は初期値(ありえない)
 On Error Resume Next
 行 = Worksheets(1).Cells.Find("シート名", , xlValues, , , xlPrevious).Row
 On Error GoTo 0

 If 行 > 0 Then '行 = Worksheets(1).Cells.Find〜に成功した場合
  Workbooks("ブック.xls").Worksheets(2).Cells(行, 256).End(xlToLeft).Offset(, 1).Value = 時間 '時間
  Workbooks("ブック.xls").Worksheets(2).Cells(行, 256).End(xlToLeft).Offset(, 1).Value = 野菜値段 * 魚値段 '金額
  Workbooks("ブック.xls").Worksheets(2).Cells(行, 256).End(xlToLeft).Offset(, 1).Value = 持ち金 - 購入金額 'おつり
 End If
Next x

なお、ゼロイオンさんがご提示のコードですが、何をしているのか、今ひとつわかりません。
というのは、
・変数xでシート数を繰り返しているが、コード中で使われていない。
 繰り返し処理をしているコード中のコードが同じなので無意味な処理と思う。
・Findメソッドで「シート名」という文字列を検索しようとしている
・Workbooks("ブック.xls").〜のコードが3行あるが、これは、右方向に3列書き込むことなのか?
 であれば、
 Workbooks("ブック.xls").Worksheets(2).Cells(行, 256).End(xlToLeft).Offset(, 1).Resize(, 3).Value = _
  Array(時間, 野菜値段 * 魚値段, 持ち金 - 購入金額) '時間
 という書き方で1行にまとめることができる
・その他
  投稿時に半角カタカナは使わない。できれば、ファイル名にも使わないほうがいいかと思う。
  変数名についても、日本語等全角文字は使わないほうがいいかと思う。
  コードを提示するときは、VBEで記述したコードをコピー貼り付けすると誤字がなくなる。
  (少なくとも、インデントや、for ではなく For と見やすくなる。)

ゼロイオンさんのご提示のコードが失礼ながら不完全なため、動作確認はしていませんのであらかじめご了承ください。

提示されたコードを参考にがんばってコードを自分で書いてみるというのは、とてもいいことなのですが、エラーが出る場合は、エラーメッセージとエラー箇所を正確に提示していただければいいかと思います。
「型があいません、みたいなメッセージ」ではなく、「型が一致しません」というように。
そうすれば、早く解決する糸口になります。
ぜひ御一考ください。

【33937】Re:FIND
発言  ゼロイオン  - 06/1/24(火) 2:21 -

引用なし
パスワード
   >>それより、このスレの主旨はFINDの使い方だったんじゃないんですか?

ブルートさん、それでは質問を分かりやすく努めるために
紛らわしいので
新しいスレッドを立て独立させます。
やりたいことを明確にしたいと思います。
できたら一からコードを発案してもらえるとありがたいです。

http://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=33936;id=excel

【33938】Re:FIND
お礼  ゼロイオン  - 06/1/24(火) 5:36 -

引用なし
パスワード
   ▼かみちゃん さん:
のおっしゃるとおりです。
以後、かみちゃんさんの助言を思い出し気をつけたいと思います。
それで結果なのですが、
みなさんの教えてもらった方法をいろいろ駆使してみて
発想を少し逆転することで思った動作になりました。
答えてくださった方々、心配かけましたが
みごと成功しました。
ありがとうございました。真に勝手ながら失礼させてもらいます。
でわ。

【33939】Re:FIND
発言  かみちゃん  - 06/1/24(火) 6:30 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>それで結果なのですが、
>みなさんの教えてもらった方法をいろいろ駆使してみて
>発想を少し逆転することで思った動作になりました。

結果はどのようになさったのか、差し支えなければ、書いていただけると、
同じ悩みでこのスレッドを見ている方、将来、同じような悩みを抱えて過去ログを
検索したらこのスレッドを見つけた方、そして、今回このスレッドにかかわった方
の役に立つかもしれませんので、助かります。

【34016】Re:FIND
発言  ゼロイオン  - 06/1/25(水) 5:03 -

引用なし
パスワード
   ちょっと第三者には分かりづらいとおもいますが、簡単にいうと
他のブックにあるシート名を基準に情報を取り出していたのを、
情報が必要なセルを基点にして他のブックの情報を拾ってくる
と感じにしたら、私のこの状況では成功しました。
いっていることがわかりずらいともいますが、イメージ的にはこんな
感じです。

【34018】Re:FIND
発言  かみちゃん  - 06/1/25(水) 7:38 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>いっていることがわかりずらいともいますが、イメージ的にはこんな
>感じです。

やぱりわかりづらいですね。
私や、ブルートさんが提示した内容でうまくできたのかできていないのか、
BBさんが提示した内容でできたのかできなかったのか、
結果的にどのようにして解決されたのか、ここのスレッドに携わってきた方、ここ
のスレッドを参考にしようとされている方にとっては、疑問が残る内容ですね。
私個人的には、少々、消化不良の感が否めませんが、そこは、ゼロイオンさんが
解決方法を提示していただけないならば、致し方ないことでして・・・

う〜ん、考えものですね。
私がアドバイスしたことがちょっと、ご理解いただけていないようで悲しいです。

【34019】Re:FIND
発言  メカ大好き!  - 06/1/25(水) 7:53 -

引用なし
パスワード
   ▼ゼロイオン さん:

横から済みません。
言葉での説明ではなく、『式を載せて欲しい』…という事だと思いますよ。
全てではなくても、『参考にして完成させた部分』…だけでも…。
それは、こういうサイトで質問をする時の、一種の礼儀だと思うのですよ。
(企業にとって、まずい点が式に入っているなら、そこは替えるなり、
削るなりしても、良いと思います。要は核心部分の解決法ですから…)

『質問をして、自分側で問題を解決できたら、それで OK !』
…では、『質問者のためだけの掲示板』…になってしまうと思います。

こういう質問箱は、『みんなで知識の蓄積を増やして行くための掲示板』
…という意味合いが強いのだと思います。

(私は、ほとんどいつも質問ばかりなのに、偉そうな事言って済みません)

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