返回列表 上一主題 發帖

[發問] 簡化巨集程式

回復 1# PJChen
  1. Option Explicit
  2. Sub Acopy_from_Multi_format()
  3.     Dim Sh(1 To 2) As Worksheet
  4.     '*** 工作表 指定給變數: 如程序很大 修改工作表名稱時不必在程序中一一更改 ***   
  5.     Set Sh(1) = Workbooks("2011 BCMart Multi-Format.xlsx").Sheets("BCM控管")
  6.     Set Sh(2) = Workbooks("VBA Cluster.xlsm").Sheets("BCM控管")
  7.        With Sh(1)
  8.         .Columns("A:CZ").Hidden = False
  9.         Set A = Intersect(.UsedRange, .Range("A:CZ")).SpecialCells(xlCellTypeVisible)
  10.         Sh(2).Columns("A:CZ").Hidden = False
  11.         A.Copy Sh(2).Range("A1")  '完全複製
  12.     End With
  13.     With Sh(2)  '請改成要複製活頁簿的名稱(已經打開)
  14.         .Columns("A:CZ").Hidden = False
  15.         Set A = Intersect(.UsedRange, .Range("A:CZ")).SpecialCells(xlCellTypeVisible)
  16.         A.Copy .Range("A1")  '完全複製
  17.         .Columns("F:F").Replace What:="#N/A", Replacement:="", LookAt:=xlPart, _
  18.         SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
  19.         ReplaceFormat:=False
  20.     End With
  21.     Workbooks("VBA Cluster.xlsm").Sheets("VBA").Activate
  22.     Range("B1").Select
  23. End Sub
複製代碼

TOP

本帖最後由 GBKEE 於 2012-1-21 11:49 編輯

回復 3# PJChen
  1. Option Explicit
  2. Sub Acopy_from_Multi_format()
  3.     Dim Wb(1 To 2) As Workbook, Sh As Worksheet    '或是 Sh As Variant
  4.     '*** 指定給變數: 如程序很大 修改名稱時不必在程序中一一更改 ***
  5.     Set Wb(1) = Workbooks("2011 BCMart Multi-Format.xlsx")
  6.     Set Wb(2) = Workbooks("VBA Cluster.xlsm")
  7.     For Each Sh In Wb(1).Sheets(Array("BCM控管", "Factory Ship", "Chart"))   '
  8.         'For Each Sh In Array("BCM控管", "Factory Ship", "Chart")   'Sh As Variant 如此作
  9.         With Sh
  10.             'With Wb(1).Sheets(Sh)                                  'Sh As Variant 如此作
  11.             .Columns("A:CZ").Hidden = False
  12.              Intersect(.UsedRange, .Range("A:CZ")).SpecialCells(xlCellTypeVisible).Copy
  13.                                                                     '先做複製的動作
  14.             With Wb(2).Sheets(Sh.Name)
  15.              '   With Wb(2).Sheets(Sh)                              'Sh As Variant 如此作
  16.                 .Range("A1").PasteSpecial Paste:=xlPasteAll          '完全複製
  17.                 .Range("A1").PasteSpecial Paste:=xlPasteValues       '複製值
  18.                 .Columns("A:CZ").Hidden = False
  19.             End With
  20.         End With
  21.     Next
  22.     Application.CutCopyMode = False
  23.     'CutCopyMode 屬性: 設定 [剪下] 或 [複製] 模式的狀態。可為 True、False 或一個 XLCutCopyMode 常數,如下列表格所示。讀/寫 Long。
  24. End Sub
複製代碼

TOP

本帖最後由 GBKEE 於 2012-1-21 13:56 編輯

回復 5# PJChen
  1. Option Explicit
  2. Sub Acopy_from_Multi_format()
  3.     Dim Wb(1 To 2) As Workbook, xS As Integer, Ar1(), Ar2()
  4.     '*** 指定給變數: 如程序很大 修改名稱時不必在程序中一一更改 ***
  5.     Dim Ar(1 To 2)
  6.     Set Wb(1) = Workbooks("2011 BCMart Multi-Format.xlsx")
  7.     Set Wb(2) = Workbooks("VBA Cluster.xlsm")
  8.     Ar1 = Array("BCM控管", "Factory xsip", "Chart")    '置入陣列
  9.     Ar2 = Array("A:CZ", "A:AI", "A:AP")                '置入陣列
  10.     For xS = 0 To UBound(Ar1)     '-> Array("BCM控管", "Factory xsip", "Chart")
  11.         With Wb(1).Sheets(Ar1(xS))                                  '代入 Ar1(xS)
  12.             .Columns("A:CZ").Hidden = False
  13.             Intersect(.UsedRange, .Range(Ar2(xS))).SpecialCells(xlCellTypeVisible).Copy
  14.                                    ''代入 Ar2(xS) : 先做複製的動作
  15.                 With Wb(2).Sheets(Ar1(xS))                              '代入 Ar1(xS)
  16.                     .Range("A1").PasteSpecial Paste:=xlPasteAll         '完全複製
  17.                     .Range("A1").PasteSpecial Paste:=xlPasteValues      '複製值
  18.                     .Columns("A:CZ").Hidden = False
  19.             End With
  20.         End With
  21.     Next
  22.     Application.CutCopyMode = False
  23.     'CutCopyMode 屬性: 設定 [剪下] 或 [複製] 模式的狀態。可為 True、False 或一個 XLCutCopyMode 常數,如下列表格所示。讀/寫 Long。
  24. End Sub
複製代碼

TOP

回復 7# PJChen
你將複製程式碼後,貼在已有的程式碼下方當然會在那裡出現.
刪掉  或移 到頂端  就好了.

TOP

回復 9# PJChen
如有 這些Option  都必須置於 模組的頂端
Option Explicit     陳述式 : 在模組層次中強迫每個在模組�堛瘍僂くㄔ眸楨�確的宣告。
Option Compare 陳述式 : 在模組層次中用來宣告當比較字串資料時,所預設使用的比較方法。
Option Base         陳述式 : 在模組層次中用來宣告陣列索引的預設下限。
Option Private     陳述式 : 當主應用程式允許可引用跨越多個專案時,Option Private Module 可以避免模組被外部專案所引用。但若主應用程式不允許跨專案引用時,則 Option Private 沒有作用。

TOP

回復 12# homeman
Intersect 方法 傳回 Range 物件,此物件代表兩個或多個範圍重疊的矩形範圍。
  1. Sub Ex()
  2.     With ActiveSheet
  3.     Set isect = Application.Intersect(.Range("A1:E5"), .Range("B1:B100"))
  4.         If isect Is Nothing Then
  5.             MsgBox "沒有 交集的範圍 "
  6.         Else
  7.          MsgBox isect.Address
  8.         isect.Select     '交集的範圍
  9.     End If
  10.     End With
  11. End Sub
複製代碼

TOP

        靜思自在 : 人事的艱難與琢磨,就是一種考驗。
返回列表 上一主題