Excel VBA質問箱 IV

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

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


2302 / 13644 ツリー ←次へ | 前へ→

【68855】Do〜Loopについて レッズ命 11/4/23(土) 14:50 質問[未読]
【68856】Re:Do〜Loopについて かみちゃん 11/4/23(土) 14:58 発言[未読]
【68857】Re:Do〜Loopについて レッズ命 11/4/23(土) 15:07 発言[未読]
【68858】Re:Do〜Loopについて かみちゃん 11/4/23(土) 15:24 発言[未読]
【68859】Re:Do〜Loopについて レッズ命 11/4/23(土) 15:35 発言[未読]
【68860】Re:Do〜Loopについて かみちゃん 11/4/23(土) 15:42 発言[未読]
【68861】Re:Do〜Loopについて レッズ命 11/4/23(土) 15:59 発言[未読]
【68862】Re:Do〜Loopについて かみちゃん 11/4/23(土) 16:15 発言[未読]
【68863】Re:Do〜Loopについて レッズ命 11/4/23(土) 16:33 発言[未読]
【68864】Re:Do〜Loopについて かみちゃん 11/4/23(土) 16:41 発言[未読]
【68865】Re:Do〜Loopについて レッズ命 11/4/23(土) 16:49 お礼[未読]
【68866】Re:Do〜Loopについて かみちゃん 11/4/23(土) 16:54 発言[未読]
【68867】Re:Do〜Loopについて レッズ命 11/4/23(土) 16:58 発言[未読]
【68868】Re:Do〜Loopについて かみちゃん 11/4/23(土) 17:08 発言[未読]
【68869】Re:Do〜Loopについて レッズ命 11/4/23(土) 17:28 お礼[未読]
【68870】Re:Do〜Loopについて かみちゃん 11/4/23(土) 17:34 発言[未読]
【68871】Re:Do〜Loopについて レッズ命 11/4/23(土) 17:57 お礼[未読]

【68855】Do〜Loopについて
質問  レッズ命  - 11/4/23(土) 14:50 -

引用なし
パスワード
   いつもお世話になっております。

以下のVBAを作ったのですが、
『Loop While Not c2 Is Nothing And c2.Address <> firstAddress』で
(オブジェクト変数または With ブロック変数が設定されていません。)の
エラーメッセージが出てしまいます。

userformの処理をすると
このメッセージがでて、なにもせず閉じると、思う通りになってくれます。
どこがいけないのでしょうか?
教えてください。

2007 vistaを使用しています。


Dim c() As Object

Set c2 = Sheets("カウンター数一覧").Columns("A").Find(what:="新規", lookat:=xlWhole)
 If Not c2 Is Nothing Then
  firstAddress = c2.Address
  Do
  Range(c2.Address).Select
  UserForm1.Show
  Set c2 = Sheets("カウンター数一覧").Columns("A").FindNext(c2)
  Loop While Not c2 Is Nothing And c2.Address <> firstAddress
 Else
  MsgBox "新規のお客様はいません。"
 End If

ユーザーフォーム上にはこちらを

Private Sub CommandButton1_Click()

Dim c() As Object

Set c3 = Sheets("カウンター数一覧").Columns("A") _
     .Find(what:="○", after:=ActiveCell, SearchDirection:=xlPrevious)
Set c4 = Sheets("会社一覧").Columns("A") _
     .Find(what:=c3.Offset(0, 1).Value, lookat:=xlWhole)

Sheets("会社一覧").Range(c4.row + 1 & ":" & c4.row + 1).Insert
Sheets("会社一覧").Cells(c4.row + 1, 1).Value = TextBox1.Value
Sheets("会社一覧").Cells(c4.row + 1, 2).Value = TextBox2.Value
Sheets("会社一覧").Cells(c4.row + 1, 3).Value = TextBox3.Value
Sheets("会社一覧").Cells(c4.row + 1, 4).Value = TextBox4.Value

Sheets("カウンター数一覧").Select

Unload Me

End Sub

【68856】Re:Do〜Loopについて
発言  かみちゃん  - 11/4/23(土) 14:58 -

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

>以下のVBAを作ったのですが、
>『Loop While Not c2 Is Nothing And c2.Address <> firstAddress』で
>(オブジェクト変数または With ブロック変数が設定されていません。)の
>エラーメッセージが出てしまいます。

  Set c2 = Sheets("カウンター数一覧").Columns("A").FindNext(c2)
  Loop While Not c2 Is Nothing And c2.Address <> firstAddress

の部分を

  Set c2 = Sheets("カウンター数一覧").Columns("A").FindNext(c2)
  If c2 Is Nothing Then Exit Do  
  Loop Until c2.Address = firstAddress 

とするといかがでしょうか?

ヘルプの使用例を参考にされたのかと思いますが、
知っている人は知っている、有名な話のようで、ヘルプの使用例が誤っています。

なお、他の掲示板の過去ログで申し訳ありませんが、以下などが参考になりますでしょうか?
http://park7.wakwak.com/~efc21/cgi-bin/exqalounge.cgi?print+200805/08050102.txt

【68857】Re:Do〜Loopについて
発言  レッズ命  - 11/4/23(土) 15:07 -

引用なし
パスワード
   ▼かみちゃん さん:

ご回答ありがとうございます。


>
>  Set c2 = Sheets("カウンター数一覧").Columns("A").FindNext(c2)
>  If c2 Is Nothing Then Exit Do  
>  Loop Until c2.Address = firstAddress 
>

と変えてみたのですが、
エラーは出なくなりましたが、
次の検索にいってくれなくなりました・・・。
どうしたらいいのでしょうか?

【68858】Re:Do〜Loopについて
発言  かみちゃん E-MAIL  - 11/4/23(土) 15:24 -

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

>エラーは出なくなりましたが、
>次の検索にいってくれなくなりました・・・。

以下のようなデータですと、以下のようなコードで問題なく動いています。

  A  B  C
1 区分
2 新規
3 ××
4 新規
5

Sub Sample()
 Dim c2 As Range
 Dim firstAddress As String
 
 Set c2 = Sheets("カウンター数一覧").Columns("A").Find(what:="新規", lookat:=xlWhole)
 If Not c2 Is Nothing Then
  firstAddress = c2.Address
  Do
   Range(c2.Address).Select
   UserForm1.Show
'   Set c2 = Sheets("カウンター数一覧").Columns("A").FindNext(c2)
'  Loop While Not c2 Is Nothing And c2.Address <> firstAddress
   Set c2 = Sheets("カウンター数一覧").Columns("A").FindNext(c2)
   If c2 Is Nothing Then Exit Do
  Loop Until c2.Address = firstAddress
 Else
  MsgBox "新規のお客様はいません。"
 End If
End Sub

どこか、違うところがあるのではないでしょうか?

【68859】Re:Do〜Loopについて
発言  レッズ命  - 11/4/23(土) 15:35 -

引用なし
パスワード
   ▼かみちゃん さん:

コピーしてやったので、間違いはないと思うのですが、
検索が止まっているのか、次のユーザーフォームが現れてくれません。

ユーザーフォームを実行するうえで、
検索を中止するものが入ってるのでしょうか?

【68860】Re:Do〜Loopについて
発言  かみちゃん E-MAIL  - 11/4/23(土) 15:42 -

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

>ユーザーフォームを実行するうえで、
>検索を中止するものが入ってるのでしょうか?

UserForm1 が表示されないならば、

  Do
   MsgBox c2.Address '★
   Range(c2.Address).Select

★の行を追加して、正しく検索されているか試してみてください。

一つ目しか検索されないならば、
「カウンター数一覧」シートのA列が「新規」となっているものが他にないのではないでしょうか?

実際のシートを見れば、たぶんわかると思います。

【68861】Re:Do〜Loopについて
発言  レッズ命  - 11/4/23(土) 15:59 -

引用なし
パスワード
   ▼かみちゃん さん:

2度目は何も表示されませんでした。

でもユーザーフォームを何も実行せずに閉じると
次の検索が出てくるということは、次の検索もあるということですよね!?

なぜ実行すると出てこなくなるのでしょうか?

【68862】Re:Do〜Loopについて
発言  かみちゃん  - 11/4/23(土) 16:15 -

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

>でもユーザーフォームを何も実行せずに閉じると
>次の検索が出てくるということは、次の検索もあるということですよね!?

これの意味がわかりません。

UserForm側でどのような操作をしているのでしょうか?

【68863】Re:Do〜Loopについて
発言  レッズ命  - 11/4/23(土) 16:33 -

引用なし
パスワード
   ▼かみちゃん さん:

説明が足りず、すみません。

このように入っています。
CommandButton2(キャンセル)を押すと、
次の検索がされ、ユーザーフォームが表示されます。
CommandButton1(実行)を押すと、
次の検索がされず、とまってしまいます。
という意味です。

Private Sub CommandButton2_Click()

unload me

end sub


Private Sub CommandButton1_Click()

Dim c() As Object

Set c3 = Sheets("カウンター数一覧").Columns("A") _
     .Find(what:="○", after:=ActiveCell, SearchDirection:=xlPrevious)
Set c4 = Sheets("会社一覧").Columns("A") _
     .Find(what:=c3.Offset(0, 1).Value, lookat:=xlWhole)

Sheets("会社一覧").Range(c4.row + 1 & ":" & c4.row + 1).Insert
Sheets("会社一覧").Cells(c4.row + 1, 1).Value = TextBox1.Value
Sheets("会社一覧").Cells(c4.row + 1, 2).Value = TextBox2.Value
Sheets("会社一覧").Cells(c4.row + 1, 3).Value = TextBox3.Value
Sheets("会社一覧").Cells(c4.row + 1, 4).Value = TextBox4.Value

Unload Me

End Sub

【68864】Re:Do〜Loopについて
発言  かみちゃん  - 11/4/23(土) 16:41 -

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

>CommandButton1(実行)を押すと、
>次の検索がされず、とまってしまいます。

ちょっと確認したいのですが、
「カウンター数一覧」シートのA列で「新規」となっているセルが見つかれば、
UserForm1が表示され、
その後にCommandButton1をクリックすると、
「カウンター数一覧」シートのA列で「○」となっているセルを検索していますが、
そういうことでいいのですか?

Set c3 = Sheets("カウンター数一覧").Columns("A") _
     .Find(what:="○", after:=ActiveCell,

これのコードが何をしようとしているのかがわかりません。
変数c3 は、どこにも使われていないようですし。

【68865】Re:Do〜Loopについて
お礼  レッズ命  - 11/4/23(土) 16:49 -

引用なし
パスワード
   ▼かみちゃん さん:

c3はc4の検索に使っています。

どうもうまくいかないので、

Call マクロ名

もう一度実行させることにしました。

いろいろお時間かけてしまって、すみませんでした。

【68866】Re:Do〜Loopについて
発言  かみちゃん  - 11/4/23(土) 16:54 -

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

>c3はc4の検索に使っています。

なるほど、失礼しました。

では、再度聞きます。

「カウンター数一覧」シートのA列で「新規」となっているセルが見つかれば、
UserForm1が表示され、
その後にCommandButton1をクリックすると、
「カウンター数一覧」シートのA列で「○」となっているセルを検索していますが、
そういうことでいいのですか?

つまり、検索対象文字列が変わっているのではないかと思います。


>どうもうまくいかないので、
>
>Call マクロ名
>
>もう一度実行させることにしました。

それでできるのでしょうか?

【68867】Re:Do〜Loopについて
発言  レッズ命  - 11/4/23(土) 16:58 -

引用なし
パスワード
   ▼かみちゃん さん:

変わっています。

でもc2とc3で違っているので、
違うと判定してくれないのですか?

callをすると
とりあえずできるようになりました。

【68868】Re:Do〜Loopについて
発言  かみちゃん  - 11/4/23(土) 17:08 -

引用なし
パスワード
   ▼レッズ命 さん:
>▼かみちゃん さん:
>
>変わっています。

だから、だと思います。

シートイメージが、まったくわからないので、何がしたいのかがわからないのですが、
Find の対象文字列が変わるのであれば、FindNext で検索する文字列も変わると
思います。

ちなみに、
 Sheets("会社一覧").Cells(c4.Row + 1, 4).Value = TextBox4.Value
 
 Set c3 = Sheets("カウンター数一覧").Columns("A").Find(what:="新規", lookat:=xlWhole) '★
 
 Unload Me

というように★の行を追加するといかがですか?
こちらではなんとなく、うまく検索しているようですが。。。

>でもc2とc3で違っているので、
>違うと判定してくれないのですか?

関係ありません。
あくまで、Find の対象文字列が変わっているという点かと思います。

> callをすると
> とりあえずできるようになりました

どのようにしたのでしょうか?

【68869】Re:Do〜Loopについて
お礼  レッズ命  - 11/4/23(土) 17:28 -

引用なし
パスワード
   ▼かみちゃん さん:

FindNextに関しての知識が足りなかったようです。
すみませんでした。

検索して、ないものを新規とするマクロをつくってるので、
callで、もう一度検索させて、新規でなくさせている感じです。

いろんなところを検索しているので、
全体図を説明するのが難しかったので、
いろいろご迷惑おかけしました。

本当にありがとうございました。

【68870】Re:Do〜Loopについて
発言  かみちゃん  - 11/4/23(土) 17:34 -

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

>FindNextに関しての知識が足りなかったようです。
>
>検索して、ないものを新規とするマクロをつくってるので、
>callで、もう一度検索させて、新規でなくさせている感じです。

それで、★の行を追加してみてできたのでしょうか?
Call で処理することにしたから、もういいということでしょうか?

【68871】Re:Do〜Loopについて
お礼  レッズ命  - 11/4/23(土) 17:57 -

引用なし
パスワード
   ▼かみちゃん さん:
>
>それで、★の行を追加してみてできたのでしょうか?
>Call で処理することにしたから、もういいということでしょうか?

試してみました。

やりたいことがすべてできております!
ほんとうにありがとうございました。

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