Excel VBA質問箱 IV

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

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


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

【40661】selectcaseについて てつじ 06/7/20(木) 9:43 質問[未読]
【40664】Re:selectcaseについて ハチ 06/7/20(木) 9:59 回答[未読]
【40666】Re:selectcaseについて Statis 06/7/20(木) 10:30 回答[未読]
【40672】Re:selectcaseについて ichinose 06/7/20(木) 11:44 発言[未読]
【40677】Re:selectcaseについて 訂正 ichinose 06/7/20(木) 12:32 発言[未読]
【40687】Re:selectcaseについて てつじ 06/7/20(木) 14:02 お礼[未読]
【40694】Re:selectcaseについて てつじ 06/7/20(木) 15:31 質問[未読]
【40713】Re:selectcaseについて Statis 06/7/21(金) 9:51 回答[未読]
【40725】Re:selectcaseについて てつじ 06/7/21(金) 14:11 質問[未読]
【40749】Re:selectcaseについて Statis 06/7/22(土) 8:50 回答[未読]
【40779】Re:selectcaseについて てつじ 06/7/24(月) 8:43 お礼[未読]

【40661】selectcaseについて
質問  てつじ  - 06/7/20(木) 9:43 -

引用なし
パスワード
   textbox5〜176のtextboxがあるのですが、下記のコードのように、47、90、133、176のtextboxには、違う値が入ります。
全て連続していれば、select caseを用いて出来そうな気がするのですが、こういった場合下記の方法以外に良い書き方はあるのでしょうか?
今の自分の力では、これが精一杯です・・・。
よろしくお願いします。


 For i = 5 To 46
  Me.Controls("textbox" & i).Value = Worksheets(Mys).Cells(4, i - 1)
 Next i

 For i = 48 To 89
  Me.Controls("textbox" & i).Value = Worksheets(Mys).Cells(5, i - 44)
 Next i

 For i = 91 To 132
  Me.Controls("textbox" & i).Value = Worksheets(Mys).Cells(6, i - 87)
 Next i

 For i = 134 To 175
  Me.Controls("textbox" & i).Value = Worksheets(Mys).Cells(7, i - 130)
 Next i

TextBox47.Value = Application.WorksheetFunction.Sum(Sheets(Mys).Range("d4:as4"))
TextBox90.Value = Application.WorksheetFunction.Sum(Sheets(Mys).Range("d5:as5"))
TextBox133.Value = Application.WorksheetFunction.Sum(Sheets(Mys).Range("d6:as6"))
TextBox176.Value = Application.WorksheetFunction.Sum(Sheets(Mys).Range("d7:as7"))

【40664】Re:selectcaseについて
回答  ハチ  - 06/7/20(木) 9:59 -

引用なし
パスワード
   ▼てつじ さん:
>全て連続していれば、select caseを用いて出来そうな気がするのですが、こういった

Select Caseでできそうです。
For i = 5 To 175
  Select Case i
    Case Is <= 46
      Me.Controls("textbox" & i).Value = Worksheets(Mys).Cells(4, i - 1)
    Case Is = 47
      TextBox47.Value = Application.WorksheetFunction.Sum(Sheets(Mys).Range("d4:as4"))
    Case Is <= 89
      Me.Controls("textbox" & i).Value = Worksheets(Mys).Cells(5, i - 44)
    '・・・
  End Select
Next i

上から順に評価されていくのでこんな感じでは?

【40666】Re:selectcaseについて
回答  Statis  - 06/7/20(木) 10:30 -

引用なし
パスワード
   こんにちは
コードも見て気付いた点です。
Worksheets("xx")とかSheets("xx")
Meを使ったり使わなかったりしている
テキストボックスでは「Value」プロパティを使っているがセルの値の
取得のときは使っていない。

コードに統一性を持たせましょう。

TextBoxなど小文字を使ったりしている

セル番地やコントロールのオブジェクト名は正確に記載した方が良いです。

Withステートメントを有効に使いましょう。

一応こんな感じです。

Dim i As Long, Ro As Long, Co As Long
Dim R As Range, Ch As Boolean

With Worksheets(Mys)
   For i = 5 To 175
     Ch = True
     Select Case i
      Case 5 To 46
         Ro = 4: Co = 1
      Case 48 To 89
         Ro = 5: Co = 44
      Case 91 To 132
         Ro = 6: Co = 87
      Case 134 To 175
         Ro = 7: Co = 130
      Case 47
         Ch = False: Set R = .Range("D4:AS4")
      Case 90
         Ch = False: Set R = .Range("D5:AS5")
      Case 133
         Ch = False: Set R = .Range("D6:AS6")
      Case 176
         Ch = False: Set R = .Range("D7:AS7")
     End Select
     If Ch Then
      Me.Controls("TextBox" & i).Value = .Cells(Ro, i - Co).Value
     Else
      Me.Controls("TextBox" & i).Value = Application.Sum(R)
      Set R = Nothing
     End If
   Next i
End With

【40672】Re:selectcaseについて
発言  ichinose  - 06/7/20(木) 11:44 -

引用なし
パスワード
   ▼てつじ さん:
こんにちは。

こんな方法もあります。
一行の数が(ここで言う43)変更になっても
なるべく変更が少ないようにしてみました。
例は、コッマンドボタンのクリックイベントでのコードです。


Private Sub CommandButton1_Click()
  Const cnt = 43 '1行、または、1列のテキストボックス数
  Const txtst = 5 'テキストボックスの開始インデックス
  Const txted = 176 'テキストボックスの終了インデックス
  Const strw = 4 'シートの移行開始行
  Const stcol = 4 'シートの移行開始列
  Dim col As Long
  Dim rw As Long
  Dim idx As Long
  For idx = txtst To txted
    col = (idx - txtst + 1) Mod cnt
    rw = (idx - txtst + 1) \ cnt
    If (idx - txtst + 1) Mod cnt Then
     Controls("textbox" & idx).Value = Worksheets(1).Cells(strw + rw, stcol + col - 1).Value
    Else
     With Worksheets(1)
      Controls("textbox" & idx).Value = Application.Sum(.Range(.Cells(strw + rw - 1, stcol), _
                             .Cells(strw + rw - 1, stcol + cnt - 2)))
      End With
     End If
    Next idx
End Sub


試してみてください。

【40677】Re:selectcaseについて 訂正
発言  ichinose  - 06/7/20(木) 12:32 -

引用なし
パスワード
   ▼ichinose さん:
>▼てつじ さん:
>こんにちは。
>
>こんな方法もあります。
>一行の数が(ここで言う43)変更になっても
>なるべく変更が少ないようにしてみました。
>例は、コッマンドボタンのクリックイベントでのコードです。
>
>
>Private Sub CommandButton1_Click()
>  Const cnt = 43 '1行、または、1列のテキストボックス数
>  Const txtst = 5 'テキストボックスの開始インデックス
>  Const txted = 176 'テキストボックスの終了インデックス
>  Const strw = 4 'シートの移行開始行
>  Const stcol = 4 'シートの移行開始列
>  Dim col As Long
>  Dim rw As Long
>  Dim idx As Long
>  For idx = txtst To txted
>    col = (idx - txtst + 1) Mod cnt
>    rw = (idx - txtst + 1) \ cnt
    If col>0 Then
>     Controls("textbox" & idx).Value = Worksheets(1).Cells(strw + rw, stcol + col - 1).Value
>    Else
>     With Worksheets(1)
>      Controls("textbox" & idx).Value = Application.Sum(.Range(.Cells(strw + rw - 1, stcol), _
>                             .Cells(strw + rw - 1, stcol + cnt - 2)))
>      End With
>     End If
>    Next idx
>End Sub
>
>
>試してみてください。

【40687】Re:selectcaseについて
お礼  てつじ  - 06/7/20(木) 14:02 -

引用なし
パスワード
   返事が遅れてすみません。
みなさんの回答、アドバイス大変ありがとうございました。
さっそく、試して勉強してみます。

【40694】Re:selectcaseについて
質問  てつじ  - 06/7/20(木) 15:31 -

引用なし
パスワード
   さきほどはありがとうございました。
下記のコードで行う事にしました。
コードを解読してなんとなく意味はわかったのですが、ch=trueとCh = False: Set R = .Range("D4:AS4")のChの意味としてどう考えれば良いのかわかりません。
教えて頂ければ大変助かります。


With Worksheets(Mys)
   For i = 5 To 176
     Ch = True
     Select Case i
      Case 5 To 46
         Ro = 4: Co = 1
      Case 48 To 89
         Ro = 5: Co = 44
      Case 91 To 132
         Ro = 6: Co = 87
      Case 134 To 175
         Ro = 7: Co = 130
      
      Case 47
         Ch = False: Set R = .Range("D4:AS4")
      Case 90
         Ch = False: Set R = .Range("D5:AS5")
      Case 133
         Ch = False: Set R = .Range("D6:AS6")
      Case 176
         Ch = False: Set R = .Range("D7:AS7")
     End Select
     If Ch Then
      Me.Controls("TextBox" & i).Value = .Cells(Ro, i - Co).Value
     Else
      Me.Controls("TextBox" & i).Value = Application.Sum(R)
      Set R = Nothing
     End If
   Next i
End With

【40713】Re:selectcaseについて
回答  Statis  - 06/7/21(金) 9:51 -

引用なし
パスワード
   こんにちは

>コードを解読してなんとなく意味はわかったのですが、ch=trueとCh = False: >Set R = .Range("D4:AS4")のChの意味としてどう考えれば良いのかわかりません。
>教えて頂ければ大変助かります。

「Ch」の変数はフラグです。
Case の何処を通過したかを確認しています。
47,90,133,176を通過したときは合計をテキストボックスに表示させています。
なのでこのときは「Ch」の値を「False」にしています。(以外はTrueです)
あとはIf文で区分し合計値か単独セルの値かをテキストボックス表示させています。

変数「R」はRangeにて宣言しています。
そしてSetステートメントで変数「R」にセル範囲をセットしてます。
なのでSet R = .Range("D4:AS4")はセルD4からセルAS4までの範囲を
セットしている事になります。
Application.Sum(R) はApplication.Sum(.Range("D4:AS4"))と同じことです。

【40725】Re:selectcaseについて
質問  てつじ  - 06/7/21(金) 14:11 -

引用なし
パスワード
   ▼Statis さん:
>こんにちは
>
>>コードを解読してなんとなく意味はわかったのですが、ch=trueとCh = False: >Set R = .Range("D4:AS4")のChの意味としてどう考えれば良いのかわかりません。
>>教えて頂ければ大変助かります。
>
>「Ch」の変数はフラグです。
>Case の何処を通過したかを確認しています。
>47,90,133,176を通過したときは合計をテキストボックスに表示させています。
>なのでこのときは「Ch」の値を「False」にしています。(以外はTrueです)
>あとはIf文で区分し合計値か単独セルの値かをテキストボックス表示させています。
>
>変数「R」はRangeにて宣言しています。
>そしてSetステートメントで変数「R」にセル範囲をセットしてます。
>なのでSet R = .Range("D4:AS4")はセルD4からセルAS4までの範囲を
>セットしている事になります。
>Application.Sum(R) はApplication.Sum(.Range("D4:AS4"))と同じことです。

ありがとうございました。
逆に表示させた値をシートに移す場合は、下記コードになるのかと思いますが、
この中で、47,90,133,176の値は無視してそれ以外をシートへ移動させたいのですが
下記コードのcase47,90,133,176は必要ないのですか?もし記入するべきだとしたら
どのように記入するべきですか?

With Worksheets(Mys)
   For i = 5 To 176
     Ch = True
     Select Case i
      Case 5 To 46
         Ro = 4: Co = 1
      Case 48 To 89
         Ro = 5: Co = 44
      Case 91 To 132
         Ro = 6: Co = 87
      Case 134 To 175
         Ro = 7: Co = 130
      Case 47
        
      Case 90
        
      Case 133
        
      Case 176
        
     End Select
     If Ch Then
       Cells(Ro, i - Co).Value = Me.Controls("TextBox" & i).Value
  
     End If
   Next i
End With

【40749】Re:selectcaseについて
回答  Statis  - 06/7/22(土) 8:50 -

引用なし
パスワード
   こんにちは

こんな感じです。

With Worksheets(Mys)
   For i = 5 To 176
     Ch = True
     Select Case i
      Case 5 To 46
         Ro = 4: Co = 1
      Case 48 To 89
         Ro = 5: Co = 44
      Case 91 To 132
         Ro = 6: Co = 87
      Case 134 To 175
         Ro = 7: Co = 130
      Case 47, 90, 133, 176
         Ch = Flase
     End Select
     If Ch Then
       Cells(Ro, i - Co).Value = Me.Controls("TextBox" & i).Value
 
     End If
   Next i
End With

尚、「Case 47, 90, 133, 176」は「Case Else」でも良いと思います。

【40779】Re:selectcaseについて
お礼  てつじ  - 06/7/24(月) 8:43 -

引用なし
パスワード
   返事が遅くなりました。
理屈はわかってはいましたが、書き方がいまいちわかりませんでしたので
大変たすかりました。
ありがとうございました。

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