• ベストアンサー

ExcelVBAでUserFormのカウント

ユーザーフォームはどれも開いていない状態です。 カウントしようと Sub test01() Dim i As Long Dim uf As UserForm For Each uf In UserForms i = i + 1 Next MsgBox i End Sub としてみましたが0になってしまいます。 どう書けばいいのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率65% (1624/2466)
回答No.6

Set mFormも煩わしい感じなので直接以下のようにしてもいけます。 Sub Test022() Dim i As Long Dim ct As Control With ActiveWorkbook.VBProject For i = 1 To .VBComponents.Count If .VBComponents(i).Type = 3 Then For Each ct In .VBComponents(i).Designer.Controls If TypeName(ct) = "CommandButton" Then If ct.Caption = "TEST" Then .VBComponents(i).Designer.Controls.Remove (ct.name) End If End If Next ct End If Next i End With End Sub なお、蛇足かもしれませんが(回答で分からないと言ったりできないと言ったりして矛盾ぽいと思われたかもしれません) 削除できるのはControls.Addで動的に作成したコントロール というのは通常のUserForm1とかUserFormsなどでアクセスした場合のことで、No2でわからないと言ったのは上記のコードのやり方です。

emaxemax
質問者

お礼

ありがとうございます。 いま、この方法でやってみたところうまく削除できました! ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (5)

  • kkkkkm
  • ベストアンサー率65% (1624/2466)
回答No.5

なんかごぞごぞやっているうちに削除できました。 ただし、フォームを開いてすぐだとエラーになります。再度実行するかフォームを開く前だと正常に終わります。 Sub Test02() Dim i As Long Dim ct As Control Dim mForm As UserForm With ActiveWorkbook.VBProject For i = 1 To .VBComponents.Count If .VBComponents(i).Type = 3 Then Set mForm = ThisWorkbook.VBProject _ .VBComponents(i).Designer For Each ct In mForm.Controls If TypeName(ct) = "CommandButton" Then If ct.Caption = "TEST" Then mForm.Controls.Remove (ct.name) End If End If Next ct End If Set mForm = Nothing Next i End With End Sub

emaxemax
質問者

お礼

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

全文を見る
すると、全ての回答が全文表示されます。
  • kkkkkm
  • ベストアンサー率65% (1624/2466)
回答No.4

> 閉じたままなのですが。 そうですか。どちらにしても削除できるのはControls.Addで動的に作成したコントロールだけだと思います。

emaxemax
質問者

お礼

ありがとうございました。そういうものなんですね。勉強になりました。

全文を見る
すると、全ての回答が全文表示されます。
  • kkkkkm
  • ベストアンサー率65% (1624/2466)
回答No.3

> .Deleteでエラーになってしまいました。 開いているフォームのコントロールを削除できるのはControls.Addで動的に作成したコントロールだけだと思います。

emaxemax
質問者

お礼

ありがとうございます。ユーザーフォームは呼び出していません。閉じたままなのですが。

全文を見る
すると、全ての回答が全文表示されます。
  • kkkkkm
  • ベストアンサー率65% (1624/2466)
回答No.2

> ユーザーフォーム上の特定のコマンドボタンを削除する フォームそのものや特定のフォーム上のコントロール全てを削除することはできますが、特定のコントロールについてはわかりません。 Initialize()で該当するコントロールを.Visible = Falseにしておけばいかがでしょう。

emaxemax
質問者

お礼

ありがとうございます。 Initialize()で該当するコントロールを.Visible = Falseに も考えましたが、不必要なボタンを削除しようと思いました。それで」全部のユーザーフォームが無理ならほひとつづつではと思い以下のように書きましたが.Deleteでエラーになってしまいました。 Sub testUF() Dim ct As Control With UserForm1 For Each ct In .Controls If TypeName(ct) = "CommandButton" Then If ct.Caption = "TEST" Then ct.Delete 'ここでエラー End If End If Next End With End Sub

全文を見る
すると、全ての回答が全文表示されます。
  • kkkkkm
  • ベストアンサー率65% (1624/2466)
回答No.1

フォームモジュールがいくつあるか数えます。 VBEでフォームツリーにあるユーザーフォームの数です。 オプションのセキュリティセンター、マクロの設定で VBAプロジェクトオブジェクトモデルへのアクセスを信頼する のチェックを入れてください。 Sub Test() Dim i As Long, mCount As Long With ActiveWorkbook.VBProject For i = 1 To .VBComponents.Count If .VBComponents(i).Type = 3 Then mCount = mCount + 1 End If Next i MsgBox mCount End With End Sub 参考: http://officetanaka.net/excel/vba/vbe/04.htm

emaxemax
質問者

お礼

さっそくありがとうございます。カウントできました。 ただほんとにやりたかったことはカウントではなく、ユーザーフォーム上の特定のコマンドボタンを削除することでした。最初からきちんと書かずにすみません。 以下のようにしてみましたがエラーになってしまいました。どこを直せばよろしいのでしょうか? Sub Test02() Dim i As Long, mCount As Long Dim ct As Control With ActiveWorkbook.VBProject For i = 1 To .VBComponents.Count If .VBComponents(i).Type = 3 Then For Each ct In .VBComponents(i).Controls If ct.Caption = "TEST" Then mCount = mCount + 1 ct.Delete End If Next ct End If Next i MsgBox mCount End With End Sub

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • セルに対してFor Each~In~Nextを使う

    セルに対してFor Each~In~Nextを使う事は出来ない? シートやブックに対してループする時は Sub aaa() Dim w As Worksheet For Each w In Worksheets MsgBox w.Name Next End Sub 等を使いますが、 A1に「あ」 A2に「い」 A3に「う」 が入っている場合、 Sub bbb() Dim i As Long For i = 1 To Range("a65536").End(xlUp).Row MsgBox Cells(i, 1) Next End Sub で、全ての値を取得できますが、 For~to~nextではなく セルに対してFor Each~In~Nextを使う方法があれば教えてください。 上記のように Dim w As Worksheetは宣言できますが Dim c As Workcellとはできませんでした。 なぜわざわざFor~to~nextでできる事をFor Each~In~Nextでやりたいかと言うと、 シートやブックはFor~to~nextでできるのに、セルはFor~to~nextができない理由を知りたいからです。 ご回答よろしくお願いします。

  • VBAのUserFormのイベント

    VBAの公式問題集の練習をしているのですが、分からないことがあるので質問致します。 UserFormのイベントを使ってコードにマクロを作成したのですが、ユーザーフォームの実行を押しても、コンパイルエラーが表示されてしまいます。 具体的なマクロの式ですが、 Option Explicit Private Sub UserForm_Initialize() Dim i As Long TextBox1.Text = "UserFormの初期化" For i = 1 To 5 Listbox1.AddItem "Sample" & i Next i Listbox1.ListIndex = 2 End Sub です。 エラーには、コンパイルエラー: TextBox1が表示され、変数が定義されていませんと出ます。 どのようにしたらいいのでしょうか。 どなたかお分かりになるかたがいらっしゃいましたら教えて下さい。 お願いします。

  • AddItem をクリアしたい

    UserForm1.ListBox1.AddItem をクリアしたいです。 エクセルのユーザーフォームに全てのシート名を追加してるのですが Sub a() Dim s As Worksheet For Each s In Worksheets UserForm1.ListBox1.AddItem s.Name Next End Sub を実行する度に追加されてしまいます。 Sub a() Dim s As Worksheet UserForm1.ListBox1.AddItem Null For Each s In Worksheets UserForm1.ListBox1.AddItem s.Name Next End Sub のように、最初にリセットしてから追加したいのですが どうもNULLだとエラーになるようです どうすればリセットできますか?

  • エクセル2003のVBAで列を指定

    エクセルで特定の列の2~10行目に対して、ある作業をする場合、列を指定する方法は以下のどれがいいでしょうか?あるいはもっといい方法があれば教えてください。 実際には列は約40列(固定)、行は1~2万行(変動)程度で、作業はもっと複雑です。 Sub test01() Dim col Dim i As Long, n As Long For Each col In Array(1, 3, 7, 8, 11) '列番号で指定 For i = 2 To 10 n = n + 1 Cells(i, col).Value = n Next i Next col End Sub Sub test02() Dim col Dim i As Long, n As Long For Each col In Array("A", "C", "G", "H", "K") '列の記号で指定 For i = 2 To 10 n = n + 1 Cells(i, col).Value = n Next i Next col End Sub Sub test03() Dim col Dim i As Long, n As Long For Each col In Range("A2,C2,G2,H2,K2") 'セルで指定 For i = 2 To 10 n = n + 1 col.Offset(i - 2).Value = n Next i Next col End Sub

  • なぜiは変数の値が保持されるのに、wは保持されない

    なぜiは変数の値が保持されるのに、wは保持されないのでしょうか? Sub test() Dim w As Worksheet Dim i As Long i = 1 For Each w In Worksheets i = i + 1 Next MsgBox i MsgBox w.Name End Sub -------------------------------------- を行うと、 MsgBox i は表示されるのに、 MsgBox w.Name は、 「オブジェクト変数または With ブロック変数が設定されていません。」になります。 wはオブジェクト変数だから、 For Each ステートメントを抜けると値が破棄されてしまうのでしょうか? でもvbaのヘルプの 「For Each...Next ステートメントの使い方」 を見ても 「ステートメントを抜けるとオブジェクト変数なら値が破棄されます」 と記載されていません。

  • 動的配列の後始末?

    以下のサブルーチンで、lines()と動的配列を定義して、Splitでデータを入れたのですが、このサブルーチンが終了すると、lines()はデータも含めて解放されるのでしょうか? 極端な話、1億回このサブルーチンを呼ぶと、メモリーリークするのでしょうか? それと、VB6やVB.NETでは、For文・For Each文のどちらを使う方が良いのでしょうか? Sub test() Dim lines() As String lines = Split(Data, vbCrLf, -1, vbBinaryCompare) Dim i As Integer For i = LBound(lines) To UBound(lines) MsgBox ("for=[" & lines(i) & "]") Next i Dim s As Variant For Each s In lines MsgBox ("for each=[" & s & "]") Next End Sub

  • ExcelVBAの知恵をお貸しください。

    一つのシートで、複数のセル範囲を選択している場合に、セル範囲を選択しているのか?列、行を選択しているのかを判別する方法として次のようなのを考えました。 それとなく動いているのですが、なんとなくスマートでなく、場当たり的な感じがしますが、どのようにすればいいのか判りません!! どなたか、アドバイス頂けないでしょうか?宜しくお願いいたします。 Sub test()  Dim myRang As Range  Dim myArry As Variant  For Each myRang In Selection.Areas myArry = Split(Replace(myRang.Address, ":", ""), "$") If UBound(myArry) <> 2 Then   MsgBox "セル範囲を選択しています。" & myRang.Address Else If IsNumeric(myArry(1)) Then MsgBox "行を選択しています。" & myRang.Address Else MsgBox "列を選択しています。" & myRang.Address End If End If  Next End Sub

  • フォーム1が開いているのならMsgBoxを表示

    Sub マクロ() If フォーム1が開いているのなら Then MsgBox "フォーム1は開いています" End If End Sub アクセスで上記の事をやりたいのですが、コードを教えていただけますか? Sub test() Dim myForm As Form For Each myForm In Forms Debug.Print myForm.Name Next End Sub で、フォームをループできるのですが、いちいちループさせずに、フォーム1だけをつかんで、 起動している(開いている)ならメッセージボックスを表示させたいです。

  • VBAで文字列のカウントがうまくいかない・・・です

    Dim cnt As Long Dim i As Long Dim lastRow As Long For i = 1 to 20 step 2 lastRow = Cells(65536, i).End(xlUP).Row cnt = WorksheetFunction.CountIf(ActiveSheet.Range(Cells(10, i),Cells(lastRow, i), "お世話になっております")cnt = cnt + cnt Next Excelのセルを1列ずつ飛ばして列に「お世話になっております」が含まれたら件数をカウントしています。 そのカウント数が何故かリセットされてしまいます。 カウント数を足していきたいのですが・・・考え方自体が違うのでしょうか?

  • VBAでコントロールの数をカウント。結果が違う

    Access 2003のフォームについてお教えください。 フォームデザインビューで、「Form1」にテキストボックスが1つ配置されています。 レコードソースは連結されているので、フォームビューで見ると現在10のテキストボックスが フォームには表示されています。 やりたい事 フォームビューで見た時のコントロールの数をカウントしたい。ここでは、「10」という 結果が欲しいです。 そこで下記のコードを書き実行しましたが、「1」としか表示されません。 デザインビューで見ると、テキストボックスの数は1なので、それが表示 されている感じがします。 フォームビューで見た時のコントロールの数を数えるにはどのようにしたらよいでしょうか? Private Sub Form_Load() Dim ctl As Control Dim counter As Integer On Error Resume Next counter = 0 For Each ctl In Me.Controls 'コントロールがチェックボックスか判別 If TypeOf ctl Is TextBox Then counter = counter + 1 End If Next ctl msgbox counter End Sub

専門家に質問してみよう