Excel VBA質問箱 IV

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

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


20 / 13331 ツリー ←次へ | 前へ→

【80926】指定のシートがあれば処理を行い、無ければ次のフォルダを開く時 fika 19/6/21(金) 14:06 質問[未読]
【80927】Re:指定のシートがあれば処理を行い、無け... Jaka 19/6/21(金) 14:54 発言[未読]
【80928】Re:指定のシートがあれば処理を行い、無け... Jaka 19/6/21(金) 15:04 発言[未読]
【80943】Re:指定のシートがあれば処理を行い、無け... fika 19/6/24(月) 8:24 発言[未読]
【80944】Re:指定のシートがあれば処理を行い、無け... Jaka 19/6/24(月) 10:41 発言[未読]
【80945】Re:指定のシートがあれば処理を行い、無け... fika 19/6/24(月) 12:44 お礼[未読]
【80946】あ・・・・。 Jaka 19/6/24(月) 18:02 発言[未読]
【80947】等幅忘れた。 Jaka 19/6/24(月) 18:05 発言[未読]

【80926】指定のシートがあれば処理を行い、無けれ...
質問  fika  - 19/6/21(金) 14:06 -

引用なし
パスワード
   行き詰りました。。お知恵をお借りできたら嬉しいです。

1つのフォルダに複数のブックにあり、
そのブックの中で、特定のシートにあるレコードだけを1つのブックに
コピぺで集約していくマクロを作成しています。

シートが有るか無いかをflagを使って処理をしようと入れてみました。
一番最初に該当するシートが無いブックに当たった場合は、処理ができたのですが、途中に該当するシートが無いブックにがあると、
「実行時エラー9、インデックスが有効範囲にありません。」となり、
ウォッチで見ると、flag の値が empty になっていました。
flag の値を空にする処理が必要なのでしょうか。。

以下がVBAになります。
宜しくお願い致します!

<行いたい処理>
ブックの中に、シートAがあったら値を集約先にコピーする処理、
なかったら次のブックに進む。

<VBA>
============================================
Sub 集約()
Dim fso As FileSystemObject
Set fso = New FileSystemObject
Dim pass As String
pass = ThisWorkbook.Path & "\ファイルの保存先"
Dim i As Long, j As Long

j = 2
Dim f As File
Dim ws As Worksheet
Dim flag As Boolean

For Each f In fso.GetFolder(pass).Files
  With Workbooks.Open(f)
  
  For Each ws In Worksheets
   If ws.Name = "A" Then flag = True
  Next ws
  If flag = False Then Close
  If flag = True Then
   
   With .Worksheets("A")
    
       i = 2
      Do While .Cells(i, 1).Value <> ""  
        Sheet1.Cells(j, 1).Value = .Cells(i, 1).Value 
        Sheet1.Cells(j, 2).Value = .Cells(i, 2).Value 
        Sheet1.Cells(j, 3).Value = .Cells(i, 3).Value 
        Sheet1.Cells(j, 4).Value = .Cells(i, 4).Value 
        Sheet1.Cells(j, 5).Value = .Cells(i, 5).Value 
        Sheet1.Cells(j, 6).Value = .Cells(i, 6).Value 
        Sheet1.Cells(j, 7).Value = .Cells(i, 7).Value 
        Sheet1.Cells(j, 8).Value = .Cells(i, 8).Value 
        Sheet1.Cells(j, 9).Value = .Cells(i, 9).Value 
        Sheet1.Cells(j, 9).Value = .Cells(i, 10).Value 
        i = i + 1
        j = j + 1
      Loop
    End With
  Set ws = Nothing

  End If
     
    .Close
  End With
  
Next f
End Sub

【80927】Re:指定のシートがあれば処理を行い、無...
発言  Jaka  - 19/6/21(金) 14:54 -

引用なし
パスワード
   flag が立ったら、ずっと立ちっぱなしなので、どこかで下す必要があるのでは。

【80928】Re:指定のシートがあれば処理を行い、無...
発言  Jaka  - 19/6/21(金) 15:04 -

引用なし
パスワード
   あまりよく見てないけど・・・・。

>  If flag = False Then Close
             ↑
          .が足りない。

【80943】Re:指定のシートがあれば処理を行い、無...
発言  fika  - 19/6/24(月) 8:24 -

引用なし
パスワード
   ▼Jaka さん:
>あまりよく見てないけど・・・・。
>
>>  If flag = False Then Close
>             ↑
>          .が足りない。

Jakaさん、ありがとうございます!
.を付けてみましたが、with .worksheets("A") のところで止まり、
インデックスが有効範囲にありません。が出ました。。

flag を下すということですね。。
探してみます!

【80944】Re:指定のシートがあれば処理を行い、無...
発言  Jaka  - 19/6/24(月) 10:41 -

引用なし
パスワード
   >  With Workbooks.Open(f)
>   For Each ws In Worksheets
          ↑
        .がない。
     Openしたばかりのアクティブブック対象となるので
     同じようのは動くけど。

この辺↓、なんかフラグつかったりごちゃごちゃしすぎに感じません?

>  For Each ws In Worksheets
>   If ws.Name = "A" Then flag = True
>  Next ws
>  If flag = False Then Close
>  If flag = True Then
   
>    With .Worksheets("A")

こんな感じで良いと思うけど?

  For Each ws In Worksheets
   If ws.Name = "A" Then
    With ws
       i = 2
      Do While .Cells(i, 1).Value <> ""
        Sheet1.Cells(j, 1).Value = .Cells(i, 1).Value
        Sheet1.Cells(j, 2).Value = .Cells(i, 2).Value
        Sheet1.Cells(j, 3).Value = .Cells(i, 3).Value
        Sheet1.Cells(j, 4).Value = .Cells(i, 4).Value
        Sheet1.Cells(j, 5).Value = .Cells(i, 5).Value
        Sheet1.Cells(j, 6).Value = .Cells(i, 6).Value
        Sheet1.Cells(j, 7).Value = .Cells(i, 7).Value
        Sheet1.Cells(j, 8).Value = .Cells(i, 8).Value
        Sheet1.Cells(j, 9).Value = .Cells(i, 9).Value
        Sheet1.Cells(j, 9).Value = .Cells(i, 10).Value
        i = i + 1
        j = j + 1
      Loop
     end with
   end if
  next

因みに
フラグを立てる flag = True
フラグを降ろす flag = False
   (下すって変換されちゃってたけど)

【80945】Re:指定のシートがあれば処理を行い、無...
お礼  fika  - 19/6/24(月) 12:44 -

引用なし
パスワード
   ▼Jaka さん:
直ぐに回答をありがとうございます!

フラグのところ、仰る通りややこしくなりました。。
フラグを立てる、降ろす一文、なるほど。。勉強になります。

そしてJakaさんがアドバイスしてくださったコードが
スッキリして解りやすいです!
フラグを使わない方法はこのようになるのですね。

お蔭さまで無事に処理が進みました!
ありがとうございます!

とても勉強になりました。


============
>>  With Workbooks.Open(f)
>>   For Each ws In Worksheets
>          ↑
>        .がない。
>     Openしたばかりのアクティブブック対象となるので
>     同じようのは動くけど。
>
>この辺↓、なんかフラグつかったりごちゃごちゃしすぎに感じません?
>
>>  For Each ws In Worksheets
>>   If ws.Name = "A" Then flag = True
>>  Next ws
>>  If flag = False Then Close
>>  If flag = True Then
>   
>>    With .Worksheets("A")
>
>こんな感じで良いと思うけど?
>
>  For Each ws In Worksheets
>   If ws.Name = "A" Then
>    With ws
>       i = 2
>      Do While .Cells(i, 1).Value <> ""
>         Sheet1.Cells(j, 1).Value = .Cells(i, 1).Value
>         Sheet1.Cells(j, 2).Value = .Cells(i, 2).Value
>         Sheet1.Cells(j, 3).Value = .Cells(i, 3).Value
>         Sheet1.Cells(j, 4).Value = .Cells(i, 4).Value
>         Sheet1.Cells(j, 5).Value = .Cells(i, 5).Value
>         Sheet1.Cells(j, 6).Value = .Cells(i, 6).Value
>         Sheet1.Cells(j, 7).Value = .Cells(i, 7).Value
>         Sheet1.Cells(j, 8).Value = .Cells(i, 8).Value
>         Sheet1.Cells(j, 9).Value = .Cells(i, 9).Value
>         Sheet1.Cells(j, 9).Value = .Cells(i, 10).Value
>         i = i + 1
>        j = j + 1
>      Loop
>     end with
>   end if
>  next
>
>因みに
>フラグを立てる flag = True
>フラグを降ろす flag = False
>   (下すって変換されちゃってたけど)

【80946】あ・・・・。
発言  Jaka  - 19/6/24(月) 18:02 -

引用なし
パスワード
   こっちの方が・・・・
下にある、end with、end if も入れ替えてね。

>   If ws.Name = "A" Then
>    With ws
    ↓
   With ws
     If .Name = "A" Then

>   For Each ws In Worksheets
>          ↑
>        .がない。

と書いたくせに、入れてなかったので、その辺注意。

【80947】等幅忘れた。
発言  Jaka  - 19/6/24(月) 18:05 -

引用なし
パスワード
   >   For Each ws In Worksheets
>          ↑
>        .がない。

と書いたくせに、入れてなかったので、その辺注意。

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