Excel VBA質問箱 IV

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

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


304 / 3841 ページ ←次へ | 前へ→

【76348】Re:取り消し線が引けない
お礼  ペンネーム船長  - 14/11/1(土) 22:18 -

引用なし
パスワード
   γ さん
お世話になっています。

事前に色々調べたものは全てセルをセレクトしているものばかりでした。
私のコードはシートをセレクトしていないので、突然、セルをセレクトしようと思っても、出来ないという事ですね。

私が何時間掛けて調べても分らなかった事を即座に教えていただけて、いつもながら感謝しています。
・ツリー全体表示

【76347】Re:2つの値検索して取得
お礼  you  - 14/11/1(土) 22:04 -

引用なし
パスワード
   ▼γ さん:
ありがとうございました。
作っていただいたマクロでうまくいきました。
原因は名のところが別セルの部分から関数で入って
いたため文字列として認識していませんでした。

いろいろと考えてくださって、本当に助かりました。
・ツリー全体表示

【76346】Re:取り消し線が引けない
発言  γ  - 14/11/1(土) 21:52 -

引用なし
パスワード
   objが属するシートがアクティブになっていますか?

こうした場合は,逐一selectしないのがコツです。
obj.Offset(0, 3).Font.Strikethrough = True
・ツリー全体表示

【76345】Re:「サブフォルダ内ファイルのプロパテ...
回答  おさむ  - 14/11/1(土) 21:51 -

引用なし
パスワード
   カリーニン様
ご返信ありがとうございます。

ただ今、参考web「パソコン便利ツール集」の管理人者様にアドバイスをいただき試行錯誤しているところですが、何分vbaの知識が0に等しい状態なので…

以下が参考webのURLです。
ht tp://makoto-watanabe.main.jp/vba_file3.html#FileProperty

そして、以下を参考に、上記URLのものに再帰処理を追加してみるようアドバイスいただいたものの、苦戦しております。
ht tp://makoto-watanabe.main.jp/vba_file4.html#FileSystemObject

勝手なお願いではございますが、お力添え、よろしくお願いします。
・ツリー全体表示

【76344】取り消し線が引けない
質問  ペンネーム船長  - 14/11/1(土) 21:29 -

引用なし
パスワード
   下記のコードで取り消し線を引こうと思うのですが、「RangeクラスのActivateメソッドが失敗しました」のエラーが出ます。
何処が間違っているか教えて下さい。

    obj.Offset(0, 3).Activate
    With Selection.Font
      .Strikethrough = True '取り消し線を引く
    End With

なお、変数objは、Range型と定義しています。
objは検索した結果を示す変数として定義しています。
・ツリー全体表示

【76343】Re:2つの値検索して取得
発言  γ  - 14/11/1(土) 20:47 -

引用なし
パスワード
   ▼you さん:
>でデバックがでます。
だけでは情報が不十分です。
どんなメッセージが出ているかを書かないと、
うまくいきません、と同レベルです。

シート上のデータが想定しているものと違うかも知れませんし、
こちらでは打つ手がありません。

ステップ実行
ht tp://hp.vector.co.jp/authors/VA016119/step/step01.html
を参考にして、ご自分でデバッグ作業をすることが必須です。

・TanNoという変数に想定どおりの文字列がセットされたか、
・本当は、どのセルにマッチするはずなのか。
・そのセルと、TanNoとは本当に一致しているのかどうか、
これらを、ご自分で確認しないと、前には進みません。

コードの問題というよりも、
想定したデータとは異なるデータになっているような気がします。

ポイントは、
・デバッグ手法をマスターすること
です。

# ちなみに、私が提案したコーディング上の改善点が無視されているのは
# どうしてなんでしょうか。理解されたのかどうかも不明ですね。
・ツリー全体表示

【76342】Re:「サブフォルダ内ファイルのプロパテ...
発言  カリーニン  - 14/11/1(土) 20:39 -

引用なし
パスワード
   >web上の作例を参考に

差支えなければ、参考にしたWEBページのURLをアップしてみてください。

※ここは直接リンク出来ないので

ht tp://〜
のようにhtとtpの間の開けるなどして貼り付けてください。
・ツリー全体表示

【76341】Re:2つの値検索して取得
質問  you  - 14/11/1(土) 18:58 -

引用なし
パスワード
   γ さんありがとうございます。
ご指摘を参考に直してみたのですが
Selection.FIND(what:=TanNo, lookat:=xlWhole).Activate
でデバックがでます。

Sub 検索結果()
'
Dim ANSYL As Integer
Dim TanNo, FIND As Variant
Dim X1, X2 As Worksheet

'検索シート(X2)、一覧シートX1)を省略形
  Set X1 = Worksheets("DB")
  Set X2 = Worksheets("検索")

'姓名を検索
  TanNo = X2.Range("A1").Value & X2.Range("A2").Value
  
'一覧シートの中で姓名を検索
  X1.Activate
  Set FND = X1.Columns("A:A").FIND(what:=TanNo, lookat:=xlWhole)
  
'姓名が存在すれば、アクティブにし、行番号を取得

    X1.Activate
    X1.Range("A:A").Select
    Selection.FIND(what:=TanNo, lookat:=xlWhole).Activate
      ANSYL = ActiveCell.Row

'検索シートに結果を表示
    X2.Cells(1, 3) = X1.Cells(ANSYL, 4) '社名
    X2.Cells(1, 4) = X1.Cells(ANSYL, 5) '住所
    X2.Cells(1, 5) = X1.Cells(ANSYL, 6) '電話番号

X2.Activate
Range("D4").Select

End Sub

また、作成していただいたマクロなんですが、A1に姓、A2に名を入れると「該当なし」A2の名をセルから消すとマクロが実行されA3、A4、A5に値が返されます。

見よう見まねで作成しているのでVBAがよく分かっていません。
議論にならず。申し訳ありません。
よろしくお願いします。
・ツリー全体表示

【76340】Re:2つの値検索して取得
発言  γ  - 14/11/1(土) 17:26 -

引用なし
パスワード
   >完全一致にするため
>
>一覧にA列は姓名を結合しました
それなら、あなたのコードにおいて、
TanNo = X2.Range("A1").Value & X2.Range("A2").Value
として検索すればいいんじゃないですか?

>やはり同じ姓があると該当なしになってしまいます。
私のところではそうなりません。
データの例をあげてもらえば議論できますが、
連結データを作ったのなら、無駄な議論になるかも知れない。

それはさて置いても、折角コードを作ったので、
・インデントのつけかた、
・.Valueなどは省略しないほうがいいこと
・型宣言の話
など、参考にしてもらいたいですな。
・ツリー全体表示

【76339】Re:2つの値検索して取得
質問  you  - 14/11/1(土) 15:07 -

引用なし
パスワード
   rさん、回答ありがとうございます。
やはり同じ姓があると該当なしになってしまいます。
完全一致にするため

一覧にA列は姓名を結合しました
A列         B列  C列  D列   E列  F列
姓名(スペースなし) 姓  名  会社名  住所 電話番号

検索だけは
A列1行目に姓、A列2行目に名を入力してマクロを走らせたいのですが
何か良い手はないでしょうか

あまりマクロが分かってないですいません。
お忙しいところよろしくお願いします。
・ツリー全体表示

【76338】Re:複数回連続して検索したいが上手くゆ...
お礼  ペンネーム船長  - 14/11/1(土) 13:57 -

引用なし
パスワード
   γさん

いつもお世話になっています。

1)Findの引数を記述しました。文字の属性に左右されないよう記述したら、2回目も検索出来ました。

2)「On Error Resume Next 」を外すと、objのある行が実行時エラー91がでていたのですが、検索結果がNothingの時の処理が出来ていなかったことに気付きました。
下記のように記述を直しました。

3)シートの商品の構成をよく見ると、商品1と商品2は同じシートにあることが分りました。よって、ワークシート変数shとsh2と区別せず、shのみとしました。

何れもγさんのアドバイスで気付けた事です。
本当に有難う御座いました。

Private Sub CommandButton1_Click()
Dim sh As Worksheet
Dim obj As Range
Dim obj2 As Range
Dim w As String

For Each sh In Worksheets
  Set obj = sh.Cells.Find(what:="商品1", LookIn:=xlValues, lookat:=xlWhole, MatchCase:=False, MatchByte:=False)            '1回目の検索
  If Not obj Is Nothing Then
    w = obj.Offset(0, 7).Value   'K列
    If w = "1" Then
      Set obj2 = sh.Cells.Find(what:="商品2", LookIn:=xlValues, lookat:=xlWhole, MatchCase:=False, MatchByte:=False)  ’2回目の検索
      MsgBox ”商品2が検索できました”
    End If
  End If
  w = ""
Next sh
End Sub
・ツリー全体表示

【76336】Re:2つの値検索して取得
発言  γ  - 14/11/1(土) 10:35 -

引用なし
パスワード
   姓と名の間のスペースに規則性があるなら、
検索する姓と名を連結してから、完全一致で検索すればヒットするはずです。

仮にそうした規則性がなく、姓と名とを別々にチェックせざるを得ないなら、
部分一致検索を使って、次のような感じになるのではないですか?

(ただし、姓と名のケースによっては上手くいかないケースがあるかもしれません。
例えば、「太」で「太一」にマッチしてしまうとかですね。
そうしたケースが頻出するなら、そのための対応が必要ですが、
とりあえずコードを作ってみました。参考になれば。)

Sub 検索結果()
  Dim ws1 As Worksheet, ws2 As Worksheet
  Dim name1 As String
  Dim name2 As String
  Dim fnd As Range
  Dim flag As Boolean
  Dim firstAddress As String
  Dim r As Long

  '検索シート(ws2)、一覧シート(ws1)を省略形
  Set ws1 = Worksheets("一覧")
  Set ws2 = Worksheets("検索")

  '氏名を検索
  name1 = ws2.Range("A1").Value
  name2 = ws2.Range("A2").Value

  '一覧シートの氏名を検索
  flag = False
  With ws1.Columns("A")
    Set fnd = .FIND(what:=name1, lookat:=xlPart)
    If Not fnd Is Nothing Then
      firstAddress = fnd.Address
      If InStr(fnd.Value, name2) > 0 Then
        flag = True
      Else
        Do
          Set fnd = .FindNext(fnd)
          If InStr(fnd.Value, name2) > 0 Then
            flag = True
            Exit Do
          End If
        Loop While Not fnd Is Nothing And fnd.Address <> firstAddress
      End If
    End If
  End With

  '氏名が存在すれば、行番号を取得
  If flag = True Then
    r = fnd.Row
    '検索シートに結果を表示
    ws2.Cells(1, 3).Value = ws1.Cells(r, 3).Value  '社名
    ws2.Cells(1, 4).Value = ws1.Cells(r, 4).Value  '住所
    ws2.Cells(1, 5).Value = ws1.Cells(r, 5).Value  '電話番号
    ws2.Activate
  Else
    MsgBox "該当するデータがありません"
  End If
End Sub


本来は、姓と名の間を(例えば)全角空白ひとつに限定することとし、
これに沿って元データを作り直しておくのが、良いと思います。
こうすれば、検索する姓と名を全角空白を含めて連結してから、
完全一致で検索すればヒットするわけですから、悩む必要がありません。

なお、貴兄の変数宣言の方法はまちがいです。
>Dim TanNo, FIND As String
とすると、String型なのはFindだけで、TanNoはVariant型です。
それぞれ型宣言する必要があります。
・ツリー全体表示

【76335】Re:「サブフォルダ内ファイルのプロパテ...
お礼  おさむ  - 14/11/1(土) 9:42 -

引用なし
パスワード
   マルチネスさま
はじめまして、おはようございます。

ご返信、ありがとうございました。
このような質問掲示板を利用することが初めての私に、「マルチポスト」について丁寧にご解説いただき、大変勉強になりました。

ただ、最初の質問内容については未だ解決しておりません。
どうぞご教示のほど、よろしくお願いいたします。
・ツリー全体表示

【76334】Re:「サブフォルダ内ファイルのプロパテ...
発言  マルチネス  - 14/11/1(土) 7:42 -

引用なし
パスワード
   >VBA質問箱基本ポリシー

マルチポストについて
別のサイト(掲示板)にまったく同じ目的の投稿をすることを、一般に「マルチポスト」といいます。当質問箱では、マルチポストは原則認めています。つまり、ほかのサイトで質問したことをこのサイトで質問してもかまわないということです。

しかし、もしマルチポストをするのなら、可能な限り「○○にも同じ質問を出しました」ということを宣言してください。そして、仮に他のサイトで解決したのなら、ここにも必ずその顛末を書いてください。質問しっぱなし、というのはモラルに反します。「解決したからいいや」というのではありません。

また、マルチポストを明示的に禁止しているサイトとのマルチポストをしてはいけません。
・ツリー全体表示

【76333】「サブフォルダ内ファイルのプロパティ取...
質問  おさむ  - 14/11/1(土) 1:52 -

引用なし
パスワード
   はじめましてこんばんは。
仕事の必要上、「サブフォルダを含めた全フォルダの中の、全ファイルのプロパティ(詳細情報)の一覧作成」マクロを、vbaの知識がないことからweb上の作例を参考に作ろうとしているのですが、全くうまく動きません。

大変お恥ずかしいのですが、下の記述で修正個所等を教えてください。
よろしくお願いします。

Sub ファイルプロパティ一覧()
  Dim フォルダパス As String
  Dim ファイルタイプ As String
  Dim エラーカウント As Integer
  Dim 拡張子 As String
  Dim メッセージ As String
  Dim 開始日時 As Variant
  Dim 終了日時 As Variant
  Dim 既存データ As Integer
  Dim 追加シート名初期 As String
  Dim 追加シート名 As String
  Dim 重複 As Integer
  Dim シート As Worksheet
  Dim シート数 As Integer

  追加シート名初期 = "ファイプロパティ"
  追加シート名 = 追加シート名初期
  
  ThisWorkbook.Worksheets("スタートシート").Activate
  
  For 重複 = 1 To 100
     For Each シート In Worksheets
      If シート.Name = 追加シート名 Then
        追加シート名 = 追加シート名初期 & "(" & 重複 & ")"
      End If
    Next シート
  Next 重複
  シート数 = Worksheets.Count
  Worksheets("テンプレート02").Copy After:=Worksheets(シート数)
  ActiveSheet.Name = 追加シート名

  ChDrive ThisWorkbook.Path
  ChDir ThisWorkbook.Path
  
   フォルダパス = Application.GetOpenFilename(ファイルタイプ)
 
    If フォルダパス = "False" Then End
 
  開始日時 = Now        ' 開始時刻を変数に格納

   フォルダパス = Left(フォルダパス, InStrRev(フォルダパス, "\"))

     On Error GoTo エラー表示

  項目数 = 40
  ReDim ファイルプロパティ(項目数, 1)
  
  Call ファイル検索(フォルダパス, ファイルプロパティ, 拡張子)
  
  Worksheets(追加シート名).Activate
  
  Range("A3").Resize(UBound(ファイルプロパティ, 2), 項目数) _
  = WorksheetFunction.Transpose(ファイルプロパティ)
  
  Range("A3").Select

  終了日時 = Now
  MsgBox "処理時間は、" _
  & Format(終了日時 - 開始日時, "hh時間nn分ss秒") & " でした。"

  Exit Sub 'エラー以外は、以下のラベル部分を実行させないためのテクニック。

エラー表示:

  エラーカウント = エラーカウント + 1
  メッセージ = "エラーが発生しました。" & Chr(13) _
  & "フォルダパス= " & フォルダパス & Chr(13) _
  & "フルパス= " & フルパス & Chr(13) _
  & "UBound(ファイルプロパティ, 2)= " & UBound(ファイルプロパティ, 2) & Chr(13) _
  & "ActiveWorkbook名= " & ActiveWorkbook.Name & Chr(13) _
  & "エラー番号 " & Str(Err.Number) & Err.Source & _
  " でエラーが発生しました。" & Chr(13) & Err.Description
  
  MsgBox メッセージ, , "エラー", Err.HelpFile, Err.HelpContext
  
  ActiveWorkbook.Close False

  If エラーカウント > 5 Then Exit Sub
  Resume Next
End Sub


Sub ファイル検索(フォルダパス As String, ファイルプロパティ() As String, 拡張子 As String)
'再帰処理でファイル抽出

  Dim i As Integer
  Dim strFileName As Variant
  Dim 行 As Integer
  Dim 列 As Integer
  Dim ファイル As Integer
  Dim データ(10000, 65) As Variant
  Dim 追加シート名 As String
  Dim ファイル拡張子 As String
  Dim ファイル名 As String
  Dim objShell As Object
  Dim objFolder As Object
  
  Set objShell = CreateObject("Shell.Application")
  Set objFolder = objShell.Namespace(フォルダパス)
 
  For i = 0 To 40
    データ(0, i) = objFolder.GetDetailsOf(objFolder.Items, i)
  Next
  ファイル = 0
  For Each strFileName In objFolder.Items
 
   ファイル名 = CStr(strFileName)
   ファイル拡張子 = LCase(Right(ファイル名, Len(ファイル名) - InStrRev(ファイル名, ".")))
   If 拡張子 = "*" Then ファイル拡張子 = "*"
   
   If ファイル拡張子 = 拡張子 Then
     ファイル = ファイル + 1
     For i = 0 To 40
       データ(ファイル, i) = objFolder.GetDetailsOf(strFileName, i)
     Next
    End If
  Next

  ThisWorkbook.Worksheets(追加シート名).Activate
  Application.ScreenUpdating = True

  For 行 = 0 To ファイル
    For 列 = 0 To 40
      ThisWorkbook.Worksheets(追加シート名).Range("A2").Cells(行 + 1, 列 + 1) _
      = データ(行, 列)
    Next 列
  Next 行

End Sub
・ツリー全体表示

【76332】2つの値検索して取得
質問  you  - 14/11/1(土) 0:31 -

引用なし
パスワード
   2つの値を検索して値を返すにはどうしたらよいのでしょうか
教えてください。シート2に下記の一覧があります。
シート2(X1)
セルA列  B列 C列  D列  E列
佐藤   太郎 社名 住所  電話番号
・    ・   ・  ・    ・
・    ・   ・  ・    ・
・    ・   ・  ・    ・
・    ・   ・  ・    ・
佐藤   花子  社名 住所  電話番号
・    ・   ・  ・    ・
・    ・   ・  ・    ・
・    ・   ・  ・    ・
・    ・   ・  ・    ・
鈴木   三郎  社名 住所  電話番号

検索用のシート下記に値を入力
シート1(X2)
セルA列1行目
姓(佐藤)を入力      
セルA列2行目
名(花子)を入力

マクロを実行すると検索した値をシート1に返したいのです。
シート1(X2)
セルA列3行目
佐藤花子の会社名     
セルA列4行目
佐藤花子の住所
佐藤花子の電話番号

こんな感じで書いていますが1つの値しか検索できません。
また、値がなかったらデバッグがでます。全然できてませんが
どなたかよろしくお願いします。

Sub 検索結果()
'
Dim ANSYL As Integer
Dim TanNo, FIND As String
Dim X1, X2 As Worksheet

'検索シート(X2)、一覧シート(X1)を省略形
  Set X1 = Worksheets("一覧")
  Set X2 = Worksheets("検索")

'指名を検索
  TanNo = X2.Range("A1")
  
'一覧シートの指名を検索
  X1.Activate
  Set FND = X1.Columns("A:A").FIND(what:=TanNo, lookat:=xlWhole)
  
'指名が存在すれば、アクティブにし、行番号を取得

    X1.Activate
    X1.Range("A:A").Select
    Selection.FIND(what:=TanNo, lookat:=xlWhole).Activate
      ANSYL = ActiveCell.Row

'検索シートに結果を表示
    X2.Cells(1, 3) = X1.Cells(ANSYL, 3) '社名
    X2.Cells(1, 4) = X1.Cells(ANSYL, 4) '住所
    X2.Cells(1, 5) = X1.Cells(ANSYL, 5) '電話番号
X2.Activate
Range("D4").Select

End Sub
・ツリー全体表示

【76331】Re:2つのブック 一致したIDを区分毎で日...
発言  γ  - 14/10/31(金) 22:11 -

引用なし
パスワード
   Findメソッドを使って、
"110001241"をID管理票.xlsのシートのなかを検索するコードは書けますか?
"110001241"の行のB列の区分で判定して、日付を書き入れます。
見つかったセルの右、二つ右、三つ右などは Offsetを使います。

あとは、「IDデータ表」.xlsの特定の範囲のデータを繰り返すだけです。

ひとつひとつはさほど難しくないはずです。
少しご自分でトライされたらいかがでしょう。
できているところまで示して、皆さんの助言をもらったほうが有益だと思います。
・ツリー全体表示

【76330】Re:複数回連続して検索したいが上手くゆ...
発言  γ  - 14/10/31(金) 3:04 -

引用なし
パスワード
   こんにちは。
> 2回目の検索が無視されてしまいます。
このことは、何をもってそう判断されているのでしょうか。
今のコードでは、それを判断できるものはないと思いますが。

簡単な例を作って、ステップ実行して確認しておられますか?
本来、マッチする場面でどのようなことが起きているのでしょうか。
そのことを教えて下さい。

・一回目はマッチしますか?
・その時のwの値は何ですか?
・マッチしたとき、再度、検索をする処理を通っていますか?
・その検索で、各シートでどんな振る舞いがみられるのですか?
・マッチしないとしたら、そのマッチすべきセルには何が入っていますか?
 数字の全角半角とか間違いないですか?

なお、
(1)
>On Error Resume Next 'エラーを無視して進む
これは何を目的に入れているのでしょうか。
マッチの有無を判定するには、
結果が Nothing であるかどうかで判定すれば済むことです。

今回は影響がないかもしれませんが、
本来、エラーになるべき時に、エラーになりませんから、
少なくともデバッグ中は、「百害あって一利なし」です。
重要な情報を隠すだけの効果しかありません。
仮に使う場合も、できるだけ早い時点で、
On Error Goto 0 としておくべきです。

(2)
Findの引数はもっと多いはずですが、普通は省略しないほうがよろしいでしょう。
以前の条件をそのまま引き継いでしまうからです。
この場合も、それが原因である可能性は低いかもしれませんが。
・ツリー全体表示

【76329】Re:複数回連続して検索したいが上手くゆ...
回答  ペンネーム船長  - 14/10/31(金) 0:10 -

引用なし
パスワード
   商品1も商品2も1シートにひとつしかありません。
しかし、複数のシートに登録されています。
商品1のある行のK列には、必ず「1」「2」「3」「4」「5」のいずれかの数字があります。
下記のように1回目の検索に使う変数と2回目に使う変数を変えても2回目の検索
が無視されてしまいます。
なお、商品1も商品2もD列に登録されています。

Private Sub CommandButton1_Click()
On Error Resume Next 'エラーを無視して進む
Dim sh As Worksheet
Dim sh2 As Worksheet
Dim obj As Range
Dim obj2 As Range
Dim w As String

For Each sh In Worksheets

  Set obj = sh.Cells.Find(what:="商品1") '1回目の検索

  w = obj.Offset(0, 7).Value 'K列
  
  If w = "1" Then  ’wが1のとき2回目の検索を実行する
    For Each sh2 In Worksheets
      Set obj2 = sh2.Cells.Find(what:="商品2") '続けて2回目の検索⇒NG
    Next sh2
  End If
  w = ""

Next sh

End Sub
・ツリー全体表示

【76328】Re:できません。
発言  ichinose  - 14/10/31(金) 0:05 -

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

www.vbalab.sakura.ne.jp/vbaqa/c-board.cgi?cmd=ntr;tree=76288;id=excel
同じ方ですか?

どんなエラーメッセージなのかは、記述してください。


新規ブックにて

ユーザーフォームを一つ作成してください(UserForm1)。

このUserForm1には、コントロールは何も配置しないでください。
コントロールは以下に記述するコードにて、配置しますので・・・。


UserForm1のモジュールに、

'=============================================================================
Option Explicit
Private WithEvents cmd1 As msforms.CommandButton
Private WithEvents cmd2 As msforms.CommandButton
Private frm As msforms.Frame
'=============================================================================
Private Sub cmd1_Click()
  With frm.Controls.Add("Forms.CheckBox.1", "chk0")
   .Left = 42
   .Top = 42
   .Width = 120
   .Height = 30
   .Caption = "チェック0"
  End With
  With frm.Controls.Add("Forms.CheckBox.1", "chk1")
   .Left = 174
   .Top = 42
   .Width = 120
   .Height = 30
   .Caption = "チェック1"
  End With
  With frm.Controls.Add("Forms.CheckBox.1", "chk2")
   .Left = 306
   .Top = 42
   .Width = 120
   .Height = 30
   .Caption = "チェック2"
  End With
  With frm.Controls.Add("Forms.Label.1", "lbl1")
   .Left = 36
   .Top = 102
   .Width = 108
   .Height = 24
   .BackColor = &HC0FFFF
   .Caption = "テスト ラベル"
   .SpecialEffect = 2
   .Font.Size = 16
  End With
  With frm.Controls.Add("Forms.TextBox.1", "txt1")
   .Left = 144
   .Top = 102
   .Width = 204
   .Height = 24
   .Font.Size = 14
  End With
End Sub
'=============================================================================
Private Sub cmd2_Click()
  Dim ccc As msforms.Control, jjj As msforms.Control
  For Each ccc In Controls
    If ccc.Name = "Frame_tmp" Then
     For Each jjj In ccc.Controls
       Controls.Remove (jjj.Name)
     Next jjj
     Exit For '見つかったのでout
    End If
  Next ccc
End Sub
'=============================================================================
Private Sub UserForm_Initialize()
  With Me
    .Width = 775
    .Height = 558
    Set cmd1 = .Controls.Add("Forms.CommandButton.1", "CommndButton1")
    With cmd1
     .Left = 12
     .Top = 42
     .Width = 90
     .Height = 42
     .Caption = "コントロール作成"
    End With
    Set cmd2 = .Controls.Add("Forms.CommandButton.1", "CommndButton1")
    With cmd2
     .Left = 108
     .Top = 42
     .Width = 90
     .Height = 42
     .Caption = "コントロール削除"
    End With
    Set frm = .Controls.Add("Forms.Frame.1", "Frame_tmp")
    With frm
     .Left = 12
     .Top = 96
     .Width = 744
     .Height = 432
     .Caption = "コントロール作成アリア"
    End With
  End With
End Sub
'=============================================================================
Private Sub UserForm_Terminate()
  Set cmd1 = Nothing
  Set cmd2 = Nothing
  Set frm = Nothing
End Sub


標準モジュールに

'=======================================================
Option Explicit
Sub test()
  UserForm1.Show
End Sub


コードは、以上です。


testを実行してください。UserForm1が表示されます。


コントロール作成、コントロール削除というコマンドボタン及び、コントロール作成エリア というフレームが表示されているはずです。


「コントロール作成」コマンドボタンをクリックしてください。

コントロール作成エリア内に、三つのチェックボックス(チェック0〜チェック2)、ラベル及び、テキストボックスが作成されます。


次に「コントロール削除」コマンドボタンをクリックしてください。

作成されたコントロールが削除されます。
このコントロール削除ボタンには、追加さんが投稿されたコードをそのまま使っています(cmd2_Click)。


どこが違うのか考察してみてください。

尚、
Removeメソッドは、VBEにて事前に作成したコントロールは、削除できません。
・ツリー全体表示

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