Excel VBA質問箱 IV

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

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


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

【71602】エラーのクリア レッズ命 12/3/22(木) 19:07 質問[未読]
【71604】Re:エラーのクリア n 12/3/22(木) 21:40 発言[未読]
【71605】Re:エラーのクリア レッズ命 12/3/22(木) 22:12 発言[未読]
【71609】Re:エラーのクリア n 12/3/23(金) 0:34 発言[未読]
【71610】Re:エラーのクリア レッズ命 12/3/23(金) 1:21 発言[未読]
【71611】Re:エラーのクリア n 12/3/23(金) 1:39 発言[未読]
【71612】Re:エラーのクリア n 12/3/23(金) 2:16 発言[未読]
【71615】Re:エラーのクリア Abebobo 12/3/23(金) 8:37 発言[未読]
【71619】Re:エラーのクリア レッズ命 12/3/23(金) 12:20 発言[未読]
【71622】Re:エラーのクリア Abebobo 12/3/23(金) 14:11 発言[未読]
【71623】Re:エラーのクリア レッズ命 12/3/23(金) 14:14 お礼[未読]
【71626】Re:エラーのクリア レッズ命 12/3/23(金) 14:42 発言[未読]
【71628】Re:エラーのクリア UO3 12/3/23(金) 14:59 発言[未読]
【71629】Re:エラーのクリア UO3 12/3/23(金) 15:06 発言[未読]
【71630】Re:エラーのクリア レッズ命 12/3/23(金) 15:19 発言[未読]
【71632】Re:エラーのクリア UO3 12/3/23(金) 15:24 発言[未読]
【71631】Re:エラーのクリア UO3 12/3/23(金) 15:21 発言[未読]
【71633】Re:エラーのクリア UO3 12/3/23(金) 15:28 発言[未読]
【71634】Re:エラーのクリア UO3 12/3/23(金) 15:49 発言[未読]
【71638】Re:エラーのクリア レッズ命 12/3/23(金) 16:13 発言[未読]
【71639】Re:エラーのクリア UO3 12/3/23(金) 16:42 発言[未読]
【71641】Re:エラーのクリア レッズ命 12/3/23(金) 17:36 発言[未読]
【71643】Re:エラーのクリア n 12/3/23(金) 21:01 発言[未読]
【71644】Re:エラーのクリア レッズ命 12/3/23(金) 23:35 発言[未読]
【71646】Re:エラーのクリア n 12/3/23(金) 23:39 発言[未読]
【71647】Re:エラーのクリア n 12/3/23(金) 23:57 発言[未読]
【71648】Re:エラーのクリア レッズ命 12/3/24(土) 0:10 お礼[未読]
【71640】Re:エラーのクリア UO3 12/3/23(金) 17:00 発言[未読]

【71602】エラーのクリア
質問  レッズ命  - 12/3/22(木) 19:07 -

引用なし
パスワード
   いろいろ調べてみましたが、解決できないので教えてください。

yが存在しないときに、メッセージを表記し、
再試行のときは、行を削除して、UserForm2を再度開きたい。
キャンセルのときは、そのままUserForm2を閉じたいのです。

1.再試行のときは、再度UserForm2が開くのですが、
 CommandButton3を押すと、
『オブジェクト変数またはWithブロック変数が設定されていません』と出ます。

2.キャンセルのときは、すぐに
『オブジェクト変数またはWithブロック変数が設定されていません』と出ます。

このエラーが出ないようにするためにはどうしたらいいのでしょうか?
長いものになりますが、よろしくお願いします。
エクセル2007です

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

Set y = Sheets("カウンター数一覧").Columns("B")
    .Find(what:=ComboBox1.Value, lookat:=xlWhole)
Set z = Sheets("カウンター数一覧").Range("D2:O2") _
    .Find(what:=TextBox6.Value & "月", lookat:=xlWhole _
       , MatchByte:=False)

If Not y Is Nothing Then
y.Select

TextBox7.Value = Format(Sheets("カウンター数一覧") _
         .Cells(y.row, z.Column).Value, "#,##0")

If y.Offset(0, 1).Value = "モノクロ" Then
  TextBox8.Value = Format(Sheets("カウンター数一覧") _
         .Cells(y.row + 2, z.Column).Value, "#,##0")
  TextBox8.BackColor = &H80000005
Else
  TextBox8.BackColor = &H8000000F
End If
Else
msg = MsgBox("『カウンター数一覧』に該当の会社名がありません。"&vbCrLf& _
       "どちらかの処理をしてください。" & vbCrLf & "" & vbCrLf & _
       "  再試行ボタン⇒『会社一覧』から列削除します。"&vbCrLf& _
       "キャンセルボタン⇒2つのシートが一致するよう、" &vbCrLf & _
       "            何かしらの処理をしてください。 " _
       , vbRetryCancel + vbCritical, "シート同士の不一致")
If msg = vbRetry Then
 Sheets("会社一覧").Rows(x.Offset(1, 0).row).Delete Shift:=xlUp
 Unload UserForm2
 UserForm2.Show
Else
 Unload UserForm2
End If
End If

Private Sub CommandButton3_Click()←UserForm2内にあるキャンセルボタン

Application.CutCopyMode = False
Unload Me

End Sub

【71604】Re:エラーのクリア
発言  n  - 12/3/22(木) 21:40 -

引用なし
パスワード
   エラーメッセージの[デバッグ]クリックでどこで止まりますか?
その後[F8]キーでエラー行まで進みますか?

【71605】Re:エラーのクリア
発言  レッズ命  - 12/3/22(木) 22:12 -

引用なし
パスワード
   ▼n さん:
>エラーメッセージの[デバッグ]クリックでどこで止まりますか?
>その後[F8]キーでエラー行まで進みますか?

ボタンを押して、UserFormを開いているので、
すべてUserForm2.Showで黄色くなります。

UserForm2上で実行すると、どこも黄色くなりません。

どうしたら調べられますか?

【71609】Re:エラーのクリア
発言  n  - 12/3/23(金) 0:34 -

引用なし
パスワード
   >すべてUserForm2.Showで黄色くなります。
その時に[F8]キーを押す度に先に進みませんか?

もしくはVBEメニュー[ツール]-[オプション]の[全般]タブ
エラートラップ「クラスモジュールで中断」にチェックを入れて実行してみてください。

【71610】Re:エラーのクリア
発言  レッズ命  - 12/3/23(金) 1:21 -

引用なし
パスワード
   ▼n さん:

>1.再試行のときは、再度UserForm2が開くのですが、
> CommandButton3を押すと、
>『オブジェクト変数またはWithブロック変数が設定されていません』と出ます。
>
>2.キャンセルのときは、すぐに
>『オブジェクト変数またはWithブロック変数が設定されていません』と出ます。
>

If msg = vbRetry Then
 Sheets("会社一覧").Rows(x.Offset(1, 0).row).Delete Shift:=xlUp
 Unload Me
 UserForm2.Show ←1.のときはここで黄色くなりますが、Showだからかな!?
Else
 Unload UserForm2 ←2.のときはここで黄色くなります。
End If            UserForm2=Empty値
End If

これで分かりますか?

【71611】Re:エラーのクリア
発言  n  - 12/3/23(金) 1:39 -

引用なし
パスワード
   Sheets("カウンター数一覧").Select以下のコードは
どこに書いてあるのですか?
UserForm2?
その中のCommandbuttonか何かのクリックイベントですか?

【71612】Re:エラーのクリア
発言  n  - 12/3/23(金) 2:16 -

引用なし
パスワード
   それに

>>すべてUserForm2.Showで黄色くなります。
>その時に[F8]キーを押す度に先に進みませんか?
>
>もしくはVBEメニュー[ツール]-[オプション]の[全般]タブ
>エラートラップ「クラスモジュールで中断」にチェックを入れて実行してみてください。

これはやってみたのでしょうか?

【71615】Re:エラーのクリア
発言  Abebobo E-MAIL  - 12/3/23(金) 8:37 -

引用なし
パスワード
   はずれかも知れませんが、

UserForm_Initialize

の中にエラーがあるとか

【71619】Re:エラーのクリア
発言  レッズ命  - 12/3/23(金) 12:20 -

引用なし
パスワード
   ▼n さん:
▼Abebobo さん:

>もしくはVBEメニュー[ツール]-[オプション]の[全般]タブ
>エラートラップ「クラスモジュールで中断」にチェックを入れて実行してみてください

をやってみたところ、エラー位置が発見できました。

USerForm2_Initialize()の中に入っています。
Initializeでは、閉じられないのでしょうか?

【71622】Re:エラーのクリア
発言  Abebobo  - 12/3/23(金) 14:11 -

引用なし
パスワード
   >Initializeでは、閉じられないのでしょうか?

・・・。

自分で自分を閉じる?

Initializeは、ユーザーフォームが開く直前に起動します。

なので Unload しようと思ってもUserForm2はまだ開いていない。

って、最近私も復習したところです。

【71623】Re:エラーのクリア
お礼  レッズ命  - 12/3/23(金) 14:14 -

引用なし
パスワード
   ▼Abebobo さん:
>>Initializeでは、閉じられないのでしょうか?
>
>・・・。
>
>自分で自分を閉じる?
>
>Initializeは、ユーザーフォームが開く直前に起動します。
>
>なので Unload しようと思ってもUserForm2はまだ開いていない。
>
>って、最近私も復習したところです。

やっぱりそういうことなんですね・・・。
たいへん失礼しました。

【71626】Re:エラーのクリア
発言  レッズ命  - 12/3/23(金) 14:42 -

引用なし
パスワード
   ▼Abebobo さん:

Initializeからは先ほどのものを外して、開いてから、
Cmd印刷プレビュー_EnterでMsgboxを開くようにしたのですが、
やはり閉じられません。
どうしてでしょうか?

【71628】Re:エラーのクリア
発言  UO3  - 12/3/23(金) 14:59 -

引用なし
パスワード
   ▼レッズ命 さん:

横から失礼します。
まず、Initializeでエラーになったコードは、どれでしたか?
それと、Sheets("カウンター数一覧").Select 以下のコードはInitializeルーティンに書いてあるのですね。

全般的にコードの記述そのものに、たくさん直していただきたいところはあるのですが
それはさておき、本当に

Set y = Sheets("カウンター数一覧").Columns("B")
    .Find(what:=ComboBox1.Value, lookat:=xlWhole)

と書かれているのですか?
実行時以前に、構文エラーになっていると思いますが?

【71629】Re:エラーのクリア
発言  UO3  - 12/3/23(金) 15:06 -

引用なし
パスワード
   ▼レッズ命 さん:

もう1つ、質問です。
(もしかしたら、今までのレスにでてきているのかもしれませんが)

Sheets("カウンター数一覧").Select 以降のコードの最後のほうで
Unload UserForm2 や UserForm2.Show が記述されています。
このコードは、UserForm2とは異なるモジュール(たとえばUserForm1)に書いてあるのですか?
その下の、CommandButton3_Click では Unload Me と、Me を使っておられるのに
上では、フォーム名を指定しておられますので・・・
何か意味があるのかな?と。意味があるとすれば、このコードはUserForm2ではないんだろうかと
そう思いまして。

【71630】Re:エラーのクリア
発言  レッズ命  - 12/3/23(金) 15:19 -

引用なし
パスワード
   ▼UO3 さん:

>Sheets("カウンター数一覧").Select 以降のコードの最後のほうで
>Unload UserForm2 や UserForm2.Show が記述されています。
>このコードは、UserForm2とは異なるモジュール(たとえばUserForm1)に書いてあるのですか?

いいえ、UserForm2に書いてあります。
何がしたいかというと、UserForm2をInitializeしたときに、
ComboBoxで選ばれている会社をシート上で検索して、
ないときには、エラーメッセージを表示し、
再試行なら、別シートのその会社名を削除したうえで、
再度UserForm2を再度開きたい。
キャンセルなら、UserForm2を閉じたいのです。


>その下の、CommandButton3_Click では Unload Me と、Me を使っておられるのに
>上では、フォーム名を指定しておられますので・・・
>何か意味があるのかな?と。意味があるとすれば、このコードはUserForm2ではないんだろうかと

MsgBoxを開いてるので、閉じるのはUserForm2だよと分かりやすくするためでした。
とくに意味はありません・・・。

【71631】Re:エラーのクリア
発言  UO3  - 12/3/23(金) 15:21 -

引用なし
パスワード
   ▼レッズ命 さん:

細切れ質問で恐縮です。

>Sheets("会社一覧").Rows(x.Offset(1, 0).Row).Delete Shift:=xlUp

この x って何ですか?

【71632】Re:エラーのクリア
発言  UO3  - 12/3/23(金) 15:24 -

引用なし
パスワード
   ▼レッズ命 さん:

コードが書かれているところがUserForm2というのはわかりました。

追加で出した質問と、前に出している、エラーのコードがどれかということ、
よろしくお願いしますね。

【71633】Re:エラーのクリア
発言  UO3  - 12/3/23(金) 15:28 -

引用なし
パスワード
   ▼レッズ命 さん:

いくつか出させていただいているしつもんの回答をもらってから
最終的にコメントしたいと思いますが、「前触れ」で。

Initializeルーティンというのは、フォームがメモリーに呼び込まれるときに発生します。
で、そのあと、フォームが実際に表示されますが、いずれにしても、この段階はフォームの表示前ですから
フォームの上のコンボボックスやテキストボックスには、何もはいっていない状態です。
その時点で、それらの値(空白値)で、シートを検索することが、間違っていますよね。

もちろん、それらとは別に、エラーになるところは見つけますけど。

【71634】Re:エラーのクリア
発言  UO3  - 12/3/23(金) 15:49 -

引用なし
パスワード
   ▼レッズ命 さん:

そろそろ、外出しなきゃいけませんので、もう少しコメントしておきます。

(あくまで、Sheets("カウンター数一覧").Select 以降のコードがUserForm2のInitializeにかかれているという前提です)

・まず、エラーのコードですが
 Sheets("会社一覧").Rows(x.Offset(1, 0).Row).Delete Shift:=xlUp
 ここではないのですか?
・メッセージに対してRetryをしたときはエラーにならず、その後、CommandButton3を押すとエラーになる。
 キャンセルのときはすぐにエラーになるというのは本当ですか?
 Retryをしたときにエラーになるのではないですか?
・先のレスで申し上げたとおり、これがInitializeルーティンであれば、このコード全体が
 間違った場所にかかれているということですが、加えて
 Unload UserForm2
 UserForm2.Show
 これが実行されるとすれば、メモリーからUserForm2が削除され(Unload)その後
 Showによって、再び、メモリーに呼び込まれます。
 この時、まだ、このInitializeルーティンの中にいるわけですが、その次のコードの実行の前に
 再び、このInitializeルーティンに入ってきます。(連鎖します)
 それは、理解しておられますか?
・そもそも、この2行は不要ですよ。

>▼Abebobo さん:
>
>Initializeからは先ほどのものを外して、開いてから、
>Cmd印刷プレビュー_EnterでMsgboxを開くようにしたのですが、
>やはり閉じられません。
>どうしてでしょうか?

【71638】Re:エラーのクリア
発言  レッズ命  - 12/3/23(金) 16:13 -

引用なし
パスワード
   ▼n さん:
▼Abebobo さん:
▼UO3 さん:

色々ご回答ありがとうございます。
長かったので、省略した部分を全て書きます。
下記のことがしたいので、アドバイスお願いします。
『会社名で検索して、ない時にはメッセージボックスを表示させ、
 再試行のときは、別シートのその会社の行を削除して、再度UserForm2を開く。
 キャンセルのときは、UserForm2を閉じる。』

エラーは2つです。
1.再試行のときは、再度UserForm2が開くのですが、
 CommandButton3を押すと、
 『オブジェクト変数またはWithブロック変数が設定されていません』と出ます。
2.キャンセルのときは、すぐに
 『オブジェクト変数またはWithブロック変数が設定されていません』と出ます。

これで分かるでしょうか?

Private Sub UserForm_Initialize()

Dim a As Integer
Dim x As Range
Dim y As Range
Dim z As Range

Sheets("会社一覧").Select

Set x = Sheets("会社一覧").Columns("B") _
    .Find(what:=Sheets("カウンター数一覧").Range("J1").Value, lookat:=xlWhole)

x.Select

a = Sheets("会社一覧").Range("B3").End(xlDown).row
ComboBox1.RowSource = "会社一覧!B3:B" & a

If x.Offset(1, 0) = "" Or Sheets("カウンター数一覧").Range("J1").Value = "" Then
 ComboBox1.Value = Sheets("会社一覧").Range("B3").Value
 TextBox2.Value = Sheets("会社一覧").Range("F3").Value
 TextBox3.Value = Sheets("会社一覧").Range("H3").Value
 TextBox5.Value = Sheets("会社一覧").Range("I3").Value
 If Sheets("会社一覧").Range("G3").Value <> "" Then
  TextBox4.Visible = True
  TextBox4.Value = Sheets("会社一覧").Range("G3").Value & " 様"
 Else
  TextBox4.Visible = False
  TextBox4.Value = ""
 End If
Else
 ComboBox1.Value = x.Offset(1, 0).Value
 TextBox2.Value = x.Offset(1, 4).Value
 TextBox3.Value = x.Offset(1, 6).Value
 TextBox5.Value = x.Offset(1, 7).Value
 If x.Offset(1, 5).Value <> "" Then
  TextBox4.Visible = True
  TextBox4.Value = x.Offset(1, 5).Value & " 様"
 Else
  TextBox4.Visible = False
  TextBox4.Value = ""
 End If
End If

Label14.Caption = ""
If x.Offset(1, -1).Value <> "" Then
 Label14.Caption = "契約情報  " & x.Offset(1, -1).Value
 Label14.ForeColor = RGB(255, 0, 0)
 CommandButton2.SetFocus
End If

TextBox6.Value = Month(Date) - 1

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

Set y = Sheets("カウンター数一覧").Columns("B") _
    .Find(what:=ComboBox1.Value, lookat:=xlWhole)
Set z = Sheets("カウンター数一覧").Range("D2:O2") _
    .Find(what:=TextBox6.Value & "月", lookat:=xlWhole, MatchByte:=False)

If Not y Is Nothing Then
 y.Select

 TextBox7.Value = Format(Sheets("カウンター数一覧") _
          .Cells(y.row, z.Column).Value, "#,##0")

 If y.Offset(0, 1).Value = "モノクロ" Then
  TextBox8.Value = Format(Sheets("カウンター数一覧") _
           .Cells(y.row + 2, z.Column).Value, "#,##0")
  TextBox8.BackColor = &H80000005
 Else
  TextBox8.BackColor = &H8000000F
 End If
Else
 msg = MsgBox("『カウンター数一覧』に該当の会社名がありません。" & vbCrLf & _
       "どちらかの処理をしてください。" & vbCrLf & "" & vbCrLf & _
       "  再試行ボタン⇒『会社一覧』から列削除します。" & vbCrLf & _
       "キャンセルボタン⇒2つのシートが一致するよう、" & vbCrLf & _
       "            何かしらの処理をしてください。 " _
       , vbRetryCancel + vbCritical, "シート同士の不一致")
 If msg = vbRetry Then
  Sheets("会社一覧").Rows(x.Offset(1, 0).row).Delete Shift:=xlUp
  Unload UserForm2
  UserForm2.Show
 Else
  Unload UserForm2 ←2.ここでエラーが出ます。
 End If
End If

End Sub

Private Sub CommandButton3_Click()

Application.CutCopyMode = False
Unload UserForm2 ←1.ここでエラーが出ます。

End Sub

【71639】Re:エラーのクリア
発言  UO3  - 12/3/23(金) 16:42 -

引用なし
パスワード
   ▼レッズ命 さん:

コード全てのアップで、すこし、もやもやが晴れました。
で、先にも申し上げたように、コード記述としていくつか申し上げたいところもありますが
それは、やめておきましょう。

1.UserForm_Initialize を UserForm_activate に変えて試してください。
 たしかにInitializeということはメモリーにロードされているのですが、おそらくは
 このInitializeが終わって(End Sub ) はじめて、UserForm2 というオブジェクトに有効な値がセットされるようです。
 ですから、Initializeの中でUnload するとエラーになります。(リトライじゃなかった場合)
2.また、リトライの場合の、Unload UserForm2とUserForm2.Showは不要ですから消してください。
 結果的に、これが、CommandButton3を押した時のエラーの元凶になっています。

【71640】Re:エラーのクリア
発言  UO3  - 12/3/23(金) 17:00 -

引用なし
パスワード
   ▼レッズ命 さん:

なんとなく、意図がわかってきました。
Initialize(Activateにかえていただきますけど)で、なぜデータ整合性のチェックをしているんだろう?
随分奇妙に思っていたんですが、想像するに、アップされたコードには入っていませんけど
たとえば更新ボタンなんかが押された時に、データの整合性をチェックする。
その時に、UnloadしてShowをしておられるんでしょうか?
そうすることでInitializeルーティンを動かして、チェックしようと。

もし、そうなら、残念ながら、それはできないですね。
Unload して SHow すると、全てのコントロール(コンボボックスやテキストボックス)は
当然ながら初期値に戻っていますので、入力していたものは、フォーム上には残りません。

もし、勘違いしていればスルーしてください。

【71641】Re:エラーのクリア
発言  レッズ命  - 12/3/23(金) 17:36 -

引用なし
パスワード
   ▼UO3 さん:

>1.UserForm_Initialize を UserForm_activate に変えて試してください。
>2.また、リトライの場合の、Unload UserForm2とUserForm2.Showは不要ですから消してください。

この結果、再試行するときの実行は出来るようになりました。
ありがとうございます。

キャンセルしたときにUserForm2を消す方法はありませんか?

【71643】Re:エラーのクリア
発言  n  - 12/3/23(金) 21:01 -

引用なし
パスワード
   >>1.UserForm_Initialize を UserForm_activate に変えて試してください。
>>2.また、リトライの場合の、Unload UserForm2とUserForm2.Showは不要ですから消してください。
このアドバイスを確実に実行されたのですよね?
それでも

If msg = vbRetry Then
  Sheets("会社一覧").Rows(x.Offset(1, 0).Row).Delete Shift:=xlUp
Else
  Unload UserForm2 '■
End If

■でエラーが出ますか?

【71644】Re:エラーのクリア
発言  レッズ命  - 12/3/23(金) 23:35 -

引用なし
パスワード
   ▼n さん:

>それでも
>:
>If msg = vbRetry Then
>  Sheets("会社一覧").Rows(x.Offset(1, 0).Row).Delete Shift:=xlUp
>Else
>  Unload UserForm2 '■
>End If
>:
>■でエラーが出ますか?

はい、『オブジェクトが必要です。』と出ます。

【71646】Re:エラーのクリア
発言  n  - 12/3/23(金) 23:39 -

引用なし
パスワード
   UserForm_Initializeイベントが残ってませんか?

【71647】Re:エラーのクリア
発言  n  - 12/3/23(金) 23:57 -

引用なし
パスワード
   ん?
>はい、『オブジェクトが必要です。』と出ます。

Unload UserForm2 '■
これで?
..UserForm2というオブジェクト名を変えたりしてませんよね?


それからFormモジュールの冒頭に

Option Explicit

と追加して、変数宣言を強制にしてください。
変数などのタイプミスがあれば実行前にコンパイルエラーでチェックしてくれます。

【71648】Re:エラーのクリア
お礼  レッズ命  - 12/3/24(土) 0:10 -

引用なし
パスワード
   ▼n さん:
>ん?
>>はい、『オブジェクトが必要です。』と出ます。
>
>Unload UserForm2 '■
>これで?
>..UserForm2というオブジェクト名を変えたりしてませんよね?
>
>
たいへん失礼しました。
名前変えてるの忘れてました。
無事に解決できました。

ご回答くださいました、皆様、ほんとうにありがとうございました。

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