Excel VBA質問箱 IV

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

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


26485 / 76738 ←次へ | 前へ→

【55584】Re:実行範囲の指定方法について
発言  kanabun  - 08/5/12(月) 11:57 -

引用なし
パスワード
   >  Loop While Not c Is Nothing And c.Address <> firstAddress
この HELPの使用例がまずい 理由を 簡単な事例で説明させていただきます。


Sub 検索でヒットしたセルを書き換えないばあい()
 Dim c As Range
 Dim 範囲 As Range
 Dim firstAddress As String
 
 Set 範囲 = Range("A1:O10")
 Set c = 範囲.Find(What:="担当者", _
    LookIn:=xlFormulas, LookAt:=xlPart)
 If Not c Is Nothing Then
   firstAddress = c.Address
   Do
     c.Interior.Color = vbYellow
     Set c = 範囲.FindNext(c)
   Loop Until c.Address = firstAddress
 End If
End Sub

Sub 検索でヒットしたセルを書き換えるばあい()
 Dim c As Range
 Dim 範囲 As Range
 
 Set 範囲 = Range("A1:O10")
 Set c = 範囲.Find("担当者", , xlFormulas, xlPart)
 If Not c Is Nothing Then
   Do
     c.Value = "発注者"
     Set c = 範囲.FindNext(c)
   Loop Until c Is Nothing
 End If
End Sub
★ここでヘルプの使用例のように
FindNext Loopの終了条件を
>  Loop While Not c Is Nothing And c.Address <> firstAddress
と書くとなぜまずいかをちょっと解説しときますと、
範囲内の 「担当者」を含むセルが、すべて「発注者」に置き換えられた
とき、
>  Set c = 範囲.FindNext(c)
c は Nothing が戻ります。

このとき
>  Loop While Not c Is Nothing And c.Address <> firstAddress
という文は 前半のLoop脱出条件 While Not c Is Nothing だけで
必要かつ十分であるにもかかわらず、Basic(VB6まで)は
2番目の条件 And c.Address <> firstAddress
をかならず評価します。
その結果、Nothing(どこにもない)もののアドレスを取得しようとして
致命的エラーとなります。

cなどでは
> Loop While Not c Is Nothing
で「False」と判定されたら、AND 以降はもう実行しないから
この手のエラーにはなりませんが。

さて、ヒットしたセルを書き換えるばあいでも、
>   Loop Until c Is Nothing
でなく、
>   Loop Until c.Address = firstAddress
をつかわなければならないケースもあります。
たとえば、検索文字列に 検索文字列を含んで文字連結したり(置換)するばあい
です。

Sub 検索でヒットしたセルを書き換えるばあい2()
 Dim c As Range
 Dim 範囲 As Range
 Dim firstAddress As String
 
 Set 範囲 = Range("A1:O10")
 Set c = 範囲.Find("りんご", , xlFormulas, xlPart)
 If Not c Is Nothing Then
   firstAddress = c.Address
   Do
     c.Value = Replace(c.Value, "りんご", "りんご(apple)")
     Set c = 範囲.FindNext(c)
   Loop Until c.Address = firstAddress
 End If
End Sub

★上の例は 単にまえの2つのsampleとの比較のためのsampleで
  実際は Replaceメソッドを使用して一括置換しちゃいますが。

0 hits

【55571】実行範囲の指定方法について marumaru 08/5/11(日) 20:07 質問
【55572】Re:実行範囲の指定方法について りん 08/5/11(日) 20:18 回答
【55575】Re:実行範囲の指定方法について kanabun 08/5/11(日) 21:22 発言
【55579】Re:実行範囲の指定方法について marumaru 08/5/12(月) 1:39 お礼
【55581】Re:実行範囲の指定方法について VBWASURETA 08/5/12(月) 10:01 発言
【55582】Re:実行範囲の指定方法について kanabun 08/5/12(月) 11:00 発言
【55583】Re:実行範囲の指定方法について VBWASURETA 08/5/12(月) 11:32 発言
【55584】Re:実行範囲の指定方法について kanabun 08/5/12(月) 11:57 発言
【55585】Re:実行範囲の指定方法について VBWASURETA 08/5/12(月) 12:22 発言
【55586】Re:実行範囲の指定方法について kanabun 08/5/12(月) 12:36 発言
【55588】Re:実行範囲の指定方法について VBWASURETA 08/5/12(月) 13:54 発言
【55589】Re:実行範囲の指定方法について VBWASURETA 08/5/12(月) 14:08 発言
【55590】Re:実行範囲の指定方法について kanabun 08/5/12(月) 14:17 質問
【55612】Re:実行範囲の指定方法について ichinose 08/5/13(火) 22:20 発言
【55613】Re:実行範囲の指定方法について kanabun 08/5/13(火) 22:42 発言
【55614】Re:実行範囲の指定方法について n 08/5/14(水) 1:19 発言
【55615】Re:実行範囲の指定方法について ひげくま 08/5/14(水) 8:12 発言
【55617】Re:実行範囲の指定方法について kanabun 08/5/14(水) 9:05 発言
【55632】Re:ご迷惑をかけました。 VBWASURETA 08/5/14(水) 12:15 発言

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