Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(指定なし : Microsoft 365)
VBAのコードについて
投稿日時: 23/11/16 13:13:03
投稿者: masamasa1736

先駆者が作られたVBAがわからず困ってます。
このコードを使うと該当の箇所からエクセルが順次作られていきますが普通にコードを動かすとエクセルが作られる速度がかなり遅いです。そのため該当のデータを入力したあとにデータが入っているところの一番下以降と一番右以降の部分を全削除してからこのコードを行うとわりとスムーズにエクセルが作られます。なぜ削除しないと遅くなってしまうのかもわからない状態です。この削除作業を行わないようにするにはどの部分を修正するか何かコードを追加したらできるのか教えて頂きたいです。ちなみに配信一覧_11行目はA列全部が選択されており配信一覧_11行目2はA列からAS列全体を範囲にしておりました。
 
Sub ファイル作成11行目()
 
      Application.ScreenUpdating = False
    
    Set motoRng = Range("配信一覧_11行目")
        myFld = 1
    
   Set criRng = Range("抽出リスト")
    Set motoRngAll = Range("配信一覧_11行目2")
    Set windowset = Range("window")
     Set Mypass = Range("password")
     Dim tmpName As String
   For Each tmpRng In criRng
  
      '該当シート作成
         motoRng.AutoFilter myFld, tmpRng
         Set tmpSht = Sheets.Add(after:=Worksheets(Sheets.Count))
         motoRngAll.Copy
         With tmpSht
             .Range("A1").PasteSpecial 8
             .Range("A1").PasteSpecial xlPasteAll
             .Name = tmpRng.Value
         End With
                
         'xls新規作成
         ActiveWindow.SelectedSheets.Copy
         ActiveWorkbook.Worksheets(tmpRng.Value).Activate
          
         'オートフィルターの設定
         'ActiveSheet.Range("$A$3:$BK$3").AutoFilter
        'Columns("A:D").Select
         'Application.CutCopyMode = False
         'Selection.Delete Shift:=xlToLeft
         Columns("AOM:XFD").Select
         Application.CutCopyMode = False
         Selection.Delete Shift:=xlToLeft
        Rows("20000:20000").Select
         Range(Selection, Selection.End(xlDown)).Select
         Selection.Delete Shift:=xlUp
         ActiveWindow.DisplayGridlines = False
         Range(windowset.Value).Select
         ActiveWindow.FreezePanes = True
         Cells.Select
         With Selection.Font
             .Name = "Meiryo UI"
             .Size = 9
             .Strikethrough = False
             .Superscript = False
             .Subscript = False
             .OutlineFont = False
             .Shadow = False
             .Underline = xlUnderlineStyleNone
             .TintAndShade = 0
             .ThemeFont = xlThemeFontNone
         End With
         Range("A1").Select
         With Selection.Font
             .Name = "Meiryo UI"
             .Size = 12
             .Strikethrough = False
             .Superscript = False
             .Subscript = False
             .OutlineFont = False
             .Shadow = False
             .Underline = xlUnderlineStyleNone
             .TintAndShade = 0
             .ThemeFont = xlThemeFontNone
         End With
     'Cells.EntireColumn.AutoFit
     'Range("A1").Select
     'Columns("A:A").ColumnWidth = 25.5
     ActiveWindow.DisplayGridlines = False
 
         'ファイル名指定
         Application.DisplayAlerts = False
         ActiveWorkbook.CheckCompatibility = False
          
        'ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path & "\" & Range("A1") & "【" & tmpRng & "様】.xls", FileFormat:=xlWorkbookNormal, _
         Password:="KDDI" & Mypass
          
         ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path & "\" & "【" & tmpRng & "様】" & Range("A1") & ".xlsx", FileFormat:=xlWorkbookDefault, _
         Password:="KDDI" & Mypass
          
        'ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path & "\" & "(" & tmpRng & "様)" & Range("A1") & ".xls", FileFormat:=xlWorkbookNormal, _
         Password:="KDDI" & Mypass
   
         '差異見本選択して閉じる
         Range("A1").Select
         Application.DisplayAlerts = False
         ActiveWorkbook.CheckCompatibility = False
         ActiveWorkbook.Save
         'ActiveWorkbook.ChangeFileAccess Mode:=xlReadOnly
         ActiveWorkbook.Close
         Application.DisplayAlerts = True
          
         '元xlsの後片付け
         Sheets("設定").Select
         Application.DisplayAlerts = False
         Worksheets(tmpRng.Value).Delete
         Application.DisplayAlerts = True
     Next
    
     ThisWorkbook.Activate
     Application.Goto motoRng
     ActiveSheet.ShowAllData
     Application.ScreenUpdating = True
     Sheets("設定").Select
      
     MsgBox "11行目ファイル作成終了"
 
 End Sub

回答
投稿日時: 23/11/16 15:01:36
投稿者: Suzu

ご自身で、コードの中身について、分析を行おうとした上でのご質問でしょうか?
少なくとも、各コードがどんな処理を行っているか確かめましたか?
 
おっしゃっている、データーの入っている所というのが、コード中のどこなのか、明確にしてください。
 
 
何となくですが、コードでは
   For Each tmpRng In criRng
  
      '該当シート作成
         motoRng.AutoFilter myFld, tmpRng
 
    中略
 
         Worksheets(tmpRng.Value).Delete
         Application.DisplayAlerts = True
     Next
この間
 
criRng に指定された コレクション 中の オブジェクトを、変数 tmpRng に代入する事を繰り返す事
が行われます。
 
今回の場合ですと、
 
Set criRng = Range("抽出リスト")
 
名前定義 抽出リスト に指定された Rangeコレクションの各セルを tmpRng に代入 しています。
 
 

そのため該当のデータを入力したあとにデータが入っているところの一番下以降と一番右以降の部分を全削除

この操作範囲が、名前定義済み範囲、「抽出リスト」の範囲になっていて
 
元々、データが入っていない範囲も、抽出リストの範囲になっている状態であり
データが無い範囲も繰り返し処理の対象範囲となっている。
 
それを、抽出リスト の データの無い範囲を削除し、抽出リストの範囲が狭くなり
繰り返し数が少なくて済むようになったモノと推測します。
 
名前定義 を使わずに
データが入力されている範囲をコードで取得し
その範囲に対し、繰り返し処理を行う様に 改善すれば良いでしょう。
 
 
必ず入力されている列があるのか
列または、行 の途中で、その列・行に、が全くデータが入っていない 行・列 があるのか
等、データがどんな感じで入っているのかが判らないので、
具体的なコードは示せませんが、
「Excel データ範囲 VBA」をキーワードにWEB検索を行えば
範囲の取得方法が判ると思います。

投稿日時: 23/11/16 17:37:24
投稿者: masamasa1736

ご丁寧に回答頂きありがとうございました。回答をもとにネットで調べてみて頑張って対応したいと思います。