Excel VBA質問箱 IV

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

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


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

【36561】連続したワークシートのデータ読み込み salt 06/4/3(月) 19:28 質問[未読]
【36562】Re:連続したワークシートのデータ読み込み Kein 06/4/3(月) 19:46 回答[未読]
【36564】Re:連続したワークシートのデータ読み込み salt 06/4/3(月) 20:03 質問[未読]
【36566】Re:連続したワークシートのデータ読み込み Kein 06/4/3(月) 20:55 回答[未読]
【36567】Re:連続したワークシートのデータ読み込み salt 06/4/4(火) 8:37 発言[未読]
【36568】Re:連続したワークシートのデータ読み込み Blue 06/4/4(火) 8:57 回答[未読]
【36569】Re:連続したワークシートのデータ読み込み salt 06/4/4(火) 9:17 発言[未読]
【36575】Re:連続したワークシートのデータ読み込み Kein 06/4/4(火) 12:14 回答[未読]
【36604】Re:連続したワークシートのデータ読み込み ハト 06/4/5(水) 11:42 回答[未読]
【36671】Re:連続したワークシートのデータ読み込み salt 06/4/7(金) 13:57 お礼[未読]

【36561】連続したワークシートのデータ読み込み
質問  salt  - 06/4/3(月) 19:28 -

引用なし
パスワード
   現在、シート名が「sh1」「sh2」「sh3」「sh4」・・・と数値が連続しているシートに対して、同じ加工を行おうとしています。

For Each ws In Worksheets(Array("sh1","sh2","sh3","sh4",・・・))
ws.activate

(加工文)

Next

で実行できるのですが、以下のような方法で実行はできないもんでしょうか?
(あまりにもシート数が多い場合、シート名が変更された場合に対応するため。)

Dim J As Long
For J = 1 To 50

Worksheets("sh" & J).Select
   Range("A1").Copy
・・・

Next J

実行してもエラーは出ないのですが、指示通りに加工されません。

ご教授願います。

【36562】Re:連続したワークシートのデータ読み込み
回答  Kein  - 06/4/3(月) 19:46 -

引用なし
パスワード
   まず
>指示通りに加工されません。
どんな処理をしようとしてますか ? 殆どの処理はシートを Select しなくても
できますから、そのように書き直すこと。あと、シート名のアタマ2文字が "sh"
であることを条件に出来るなら

Dim WS As Worksheet

For Each WS In Worksheets
  If Left$(WS.Name, 2) = "sh" Then
   処理
  End If
Next

というループにすることも出来ますが。

【36564】Re:連続したワークシートのデータ読み込み
質問  salt  - 06/4/3(月) 20:03 -

引用なし
パスワード
   >>指示通りに加工されません。
>どんな処理をしようとしてますか ?

データのある範囲を読み取って、指定箇所に色付けつる処理を行います。

With ActiveSheet
  Dim lastx As Long
  lastx = .Range("a1").End(xlDown).Row

  Dim x As Long
  For x = 1 To lastx
  
  If .Range("d" & x).Value = "○" Then
    .Rows(x).Interior.ColorIndex = 6

  End If

End With  

という処理をFor Each〜以外のプログラムで実行したいのですが。

よろしくお願いします。

【36566】Re:連続したワークシートのデータ読み込み
回答  Kein  - 06/4/3(月) 20:55 -

引用なし
パスワード
   それを、シート名の最初の2文字が "sh" になっているシートすべてで処理したい、
ということなら

Sub Test()
  Dim WS As Worksheet
  Dim MyR As Range   

  For Each WS In Worksheets
   If Left$(WS.Name, 2) = "sh" Then
     Set MyR = WS.Range("A1", WS.Range("A65536").End(xlUp))
     If Application.CountIf(MyR.Offset(, 3), "○") > 0 Then
      With MyR.Offset(, 26)
        .Formula = "=IF($D1=""○"",1,"""")"
        .SpecialCells(3, 1).EntireRow.Interior.ColorIndex = 6
        .ClearContents
      End With
     End If
     Set MyR = Nothing
   End If
  Next
End Sub

こんな感じになります。

【36567】Re:連続したワークシートのデータ読み込み
発言  salt  - 06/4/4(火) 8:37 -

引用なし
パスワード
   ありがとうございます。
で、For Each〜以外で処理することは可能なのでしょうか?

With〜を使って処理すると、実行してくれません。

For i As Long
With WorkSheets("sh" & i)
・・・
End With

色々なパターンでの処理の仕方を比較している最中で、他の方法もあればご教授いただくと助かります。

【36568】Re:連続したワークシートのデータ読み込み
回答  Blue  - 06/4/4(火) 8:57 -

引用なし
パスワード
   単に
>For i As Long
が間違っているだけなのでは?

Dim i As Long

For i = 1 To 50
  With Sheets("sh" & i)
    ' 処理
  End With
Next

【36569】Re:連続したワークシートのデータ読み込み
発言  salt  - 06/4/4(火) 9:17 -

引用なし
パスワード
   >単に
>>For i As Long
>が間違っているだけなのでは?
>

すみません、入力ミスです。
実際はDim i As Longといています・・・。

【36575】Re:連続したワークシートのデータ読み込み
回答  Kein  - 06/4/4(火) 12:14 -

引用なし
パスワード
   >色々なパターンでの処理の仕方を比較
複数のシートを対象にするなら、ループで処理するのが普通です。内容によっては
Worksheets.Select して SelectedSheets に対して一気に出来る場合もあるけど
ごく限られてます。なのでループにすることが決ってしまえば、"色々"と言っても
そんなに多くのパターンが考えられるわけでなく、どれも大差ないと思います。
ただし、もしシートの総数が30枚ぐらいとして、そのえち3枚の "sh〜" という
シートだけに限定するなら

Dim WS As Worksheet

For Each WS In Sheets(Array("sh1", "sh2", "sh3"))

Next

のように、配列を使うループが一番効率的でしょうね。逆に30枚中、28枚の処理を
するなら先に提示したサンプルのように

For Each WS In Worksheets
  If Left$(WS.Name, 2) = "sh" then

というコードが、ベターではないでしょーか ?

【36604】Re:連続したワークシートのデータ読み込み
回答  ハト  - 06/4/5(水) 11:42 -

引用なし
パスワード
   ▼salt さん:
>ありがとうございます。
>で、For Each〜以外で処理することは可能なのでしょうか?
>
>With〜を使って処理すると、実行してくれません。
>
>For i As Long
>With WorkSheets("sh" & i)
>・・・
>End With
>
>色々なパターンでの処理の仕方を比較している最中で、他の方法もあればご教授いただくと助かります。

以下の様にFor〜Next 文でやってみたところ処理出来ました


Sub Test()

Dim i As Long

On Error GoTo ERR_TEST

For i = 1 To 50

  With Worksheets("sh" & i)
    Dim lastx As Long
    lastx = .Range("a1").End(xlDown).Row

    Dim x As Long
    For x = 1 To lastx
 
      If .Range("d" & x).Value = "○" Then
        .Rows(x).Interior.ColorIndex = 6

      End If
  
    Next x
  
  End With

NEXT_SH:

Next i

On Error GoTo 0

Exit Sub

ERR_TEST:

  If Err.Number = 9 Then
    Resume NEXT_SH
  End If  
  MsgBox Error(Err.Number), vbOKOnly, "予想外のエラー"
    
End Sub

【36671】Re:連続したワークシートのデータ読み込み
お礼  salt  - 06/4/7(金) 13:57 -

引用なし
パスワード
   ありがとうございます。
動作確認できました。

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