Excel VBA質問箱 IV

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

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


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

【4909】チェックボックスのマクロを簡単に書くには? はらへりおおかみ 03/4/13(日) 18:30 質問
【4911】Re:チェックボックスのマクロを簡単に書くに... Hirofumi 03/4/13(日) 19:05 回答
【5060】Re:チェックボックスのマクロを簡単に書くに... りん 03/4/20(日) 10:30 回答
【5119】Re:チェックボックスのマクロを簡単に書くに... はらへりおおかみ 03/4/22(火) 22:31 お礼
【5232】シート上に配置しているのですが はらへりおおかみ 03/4/29(火) 20:09 質問
【5233】Re:シート上に配置しているのですが りん 03/4/29(火) 20:23 回答
【5357】Re:シート上に配置しているのですが はらへりおおかみ 03/5/7(水) 22:08 お礼

【4909】チェックボックスのマクロを簡単に書くに...
質問  はらへりおおかみ  - 03/4/13(日) 18:30 -

引用なし
パスワード
   60個のチェックボックスがあって、チェックを入れている時「記録用シート」の決まったセルに「レ」を入力するマクロを考えました。

Private Sub CommandButton1_Click()
 With Sheets("記録用シート")
  Dim i As Integer
  i=3
  Do 
    i=i+1
    If .Cells(i,1)="" Then Exit Do
  Loop
    .Cells(i,1).Value=TextBox1.Value
    If CheckBox1.Value=True Then
      .Cells(i,9).Value="レ"
    Else 
      .Cells(i,9).Value=""
    End If
    If CheckBox2.Value=True Then
      .Cells(i,10).Value="レ"
    Else 
      .Cells(i,10).Value=""
    End If
           :
    If CheckBox59.Value=True Then
      .Cells(i,77).Value="レ"
    Else 
      .Cells(i,77).Value=""
    End If
    If CheckBox60.Value=True Then
      .Cells(i,78).Value="レ"
    Else 
      .Cells(i,78).Value=""
    End If
  END With
End Sub
というように、各チェックボックスに対する処理を書いていたら、このような長いマクロになってしまいました。簡単に省略する方法は有りませんか?

【4911】Re:チェックボックスのマクロを簡単に書く...
回答  Hirofumi E-MAIL  - 03/4/13(日) 19:05 -

引用なし
パスワード
   直接的に書けばこんな?
チェックボックスとセルの列番号の関連の決まりが有ればもっと簡単に成るかも?
テストしていないので間違ったらゴメン

Private Sub CommandButton1_Click()

  Dim i As Integer
  Dim j As Integer
  Dim k As Integer
  Dim strTmp As String
  
  i = 3
  With Sheets("記録用シート")
    Do
      i = i + 1
      If .Cells(i, 1) = "" Then
        Exit Do
      End If
    Loop
    .Cells(i, 1).Value = TextBox1.Value
    For j = 1 To 60
      If Me.Controls("CheckBox1" & j).Value Then
        strTmp = "レ"
      Else
        strTmp = ""
      End If
      Select Case j
        Case 1 To 2
          k = j + 8
        Case 59 To 60
          k = j + 18
        Case Else '?
          k = j + 28
      End Select
      .Cells(i, k).Value = strTmp
    Next i
  End With
  
End Sub

【5060】Re:チェックボックスのマクロを簡単に書く...
回答  りん E-MAIL  - 03/4/20(日) 10:30 -

引用なし
パスワード
   はらへりおおかみ さん、おはようございます。
まだ解決マークになっていないようなので、ちょっと参加。

>60個のチェックボックスがあって、チェックを入れている時「記録用シート」の決まったセルに「レ」を入力するマクロを考えました。

>簡単に省略する方法は有りませんか?

Private Sub CommandButton1_Click()
  Dim I As Long, J As Integer
  With Worksheets("記録用シート")
   I = .Cells(I, 1).End(xlUp).Row + 1
   '
   .Cells(I, 1).Value = TextBox1.Value
   For J = 1 To 60
     'チェックボックスがシート上の場合
     With ActiveSheet.OLEObjects("CheckBox" & J).Object
      Select Case .Value
        Case True: .Cells(I, 8 + J).Value = "レ"
        Case Else: .Cells(I, 8 + J).Value = ""
      End Select
    End With
   Next
  End With
End Sub

フォーム上の場合はOLEObjectsではなくて、Hirofumiさんの書かれているとおり、Controlsを使います。

【5119】Re:チェックボックスのマクロを簡単に書く...
お礼  はらへりおおかみ  - 03/4/22(火) 22:31 -

引用なし
パスワード
   ▼りん さん,Hirofumiさん回答ありがとうございました。
Select Caseを使えば良かったのですね。とても参考になりました。
これで、マクロの部分もかなり省略できたのでかなり重かったのですがかなり軽くなりました。最後に、もう一度ありがとうございました。

【5232】シート上に配置しているのですが
質問  はらへりおおかみ  - 03/4/29(火) 20:09 -

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

例えば、入力シート上にOLEオブジェクトを置いて、記録用シートに転送する場合、
For J = 1 To 60
     'チェックボックスがシート上の場合
     With ActiveSheet.OLEObjects("CheckBox" & J).Object
      Select Case .Value
        Case True: .Cells(I, 8 + J).Value = "レ"
        Case Else: .Cells(I, 8 + J).Value = ""
      End Select
のWith ActiveSheet.OLEObjects("CheckBox" & J).ObjectをWith WORKSEETS("入力シート").OLEObjects("CheckBox" & J).Objectに変更、Case True: WORKSEETS("記録シート").Cells(I, 8 + J).Value = "レ"に変更したのですが上手く動かないようです。実行時エラー'438'が出てくるのですが、何が原因なのでしょうか?

【5233】Re:シート上に配置しているのですが
回答  りん E-MAIL  - 03/4/29(火) 20:23 -

引用なし
パスワード
   はらへりおおかみ さん、こんばんわ。

>例えば、入力シート上にOLEオブジェクトを置いて、記録用シートに転送する場合、
>For J = 1 To 60
>     'チェックボックスがシート上の場合
>     With ActiveSheet.OLEObjects("CheckBox" & J).Object
>      Select Case .Value
>        Case True: .Cells(I, 8 + J).Value = "レ"
>        Case Else: .Cells(I, 8 + J).Value = ""
>      End Select

>のWith ActiveSheet.OLEObjects("CheckBox" & J).ObjectをWith WORKSEETS("入力シート").OLEObjects("CheckBox" & J).Objectに変更、Case True: WORKSEETS("記録シート").Cells(I, 8 + J).Value = "レ"に変更したのですが上手く動かないようです。実行時エラー'438'が出てくるのですが、何が原因なのでしょうか?

With文でのオブジェクト指定が間違えてます。

With ActiveSheet.OLEObjects("CheckBox" & J).Object 
///略
  Case True: .Cells(I, 8 + J).Value = "レ"

これだと、
ActiveSheet.OLEObjects("CheckBox" & J).Object.Cells(I, 8 + J).Value = "レ"
としていることになり、
.Cellsは ActiveSheet.OLEObjects("CheckBox" & J).Objectの子オブジェクトではないのでエラーになります。

この分岐の部分を直接指定
>Case True: WorkSheets("記録用").Cells(I, 8 + J).Value = "レ"
>Case Else: WorkSheets("記録用").Cells(I, 8 + J).Value = ""

または、オブジェクト変数で指定する
>For J = 1 To 60
  Set r1 = WorkSheets("記録用").Cells(I, 8 + J)
////略
  Case True: r1.Value = "レ"
  Case Else: r1.Value = ""
////略

なとどして、With文を正しく設定しないとけません。

【5357】Re:シート上に配置しているのですが
お礼  はらへりおおかみ  - 03/5/7(水) 22:08 -

引用なし
パスワード
   ▼りん さん、こんばんわ。
>With文でのオブジェクト指定が間違えてます。
>
>With ActiveSheet.OLEObjects("CheckBox" & J).Object 
>///略
>  Case True: .Cells(I, 8 + J).Value = "レ"
>
>これだと、
>ActiveSheet.OLEObjects("CheckBox" & J).Object.Cells(I, 8 + J).Value = "レ"
>としていることになり、
>.Cellsは ActiveSheet.OLEObjects("CheckBox" & J).Objectの子オブジェクトではないのでエラーになります。
そういうことだったのですね。修正したら、きちんと動くようになりました。
ありがとうございました。

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