【发布时间】:2017-05-30 16:32:20
【问题描述】:
我正在编写一段非常简单的代码来将数据从一个工作簿移动到另一个工作簿。我试图避免使用选择和复制粘贴,因为它被广泛认为不是最佳的。好的,接受挑战。我已经写了几乎所有的东西,我突然意识到——我不知道如何将过滤数据的范围定义为一个范围,忽略被过滤掉的部分。我已经进行了一些搜索,但我并不完全在那里。当前代码如下:
Sub CSReport()
Dim CabReport As Workbook
Dim ExCashArchive As Workbook
Dim CABReconFilePath As String
Dim ExCashPath As String
Dim HoldingsTabName As String
Dim IMSHoldingsTabName As String
Dim HoldingsTab As Worksheet
Dim IMSHoldingsTab As Worksheet
Dim LastRowHoldings As Integer
Dim LastRowIMSHoldings As Integer
Dim RngHoldings As Range
Dim RngIMS As Range
Dim dt As Date
dt = Range("Today")
'Today is a named range with the date, just incase I need to be manually changing it
CABReconFilePath = Range("CABReconFilePath")
ExCashPath = Range("ExcessCashArchiveFilePath")
'What are the files we care about
HoldingsTabName = Range("HoldingTieOutTabName")
IMSHoldingsTabName = Range("IMSHoldingsTabName")
'What are the tab names we care about
Workbooks.Open Filename:=CABReconFilePath
Set CabReport = ActiveWorkbook
Workbooks.Open Filename:=ExCashPath
Set ExCashArchive = ActiveWorkbook
'Opening and defining the workbooks we're dealing with
HoldingsTab = ExCashArchive.Sheets(HoldingsTabName)
IMSHoldingsTab = ExCashArchive.Sheets(IMSHoldingsTabName)
'Defining the tabs
LastRowHoldings = HoldingsTab.Range("A" & Rows.Count).End(xlUp).Row
LastRowIMSHoldings = IMSHoldingsTab.Range("A" & Rows.Count).End(xlUp).Row
'Defining the edges of the data
'Filter goes here
RngHoldings = HoldingsTab.Range("A3:K" & LastRowHoldings)
RngIMS = IMSHoldingsTab.Range("A3:P" & LastRowIMSHoldings)
'Or maybe it goes here?
CABReconFilePath.Sheets("Holdings_TieOut").Range("A3").Resize(CopyFrom.Rows.Count).Value = RngHoldings.Value
CABReconFilePath.Sheets("IMS_Holdings").Range("A3").Resize(CopyFrom.Rows.Count).Value = RngIMS.Value
'Getting the values in
CABReconFilePath.Sheets("Recon Summary").Range("B1").Value = Text(dt, "MM/DD/YYYY")
'And setting the date manually, just incase we're running prior/future reports
ExCashArchive.Close savechanges:=False
CabReport.SaveAs Filename = CABReconFilePath & Text(dt, "MM.DD.YY")
CabReport.Close
End Sub
现在,我之前所做的都是相当笨拙的事情,例如:
Range("A1").Select
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.AutoFilter
ActiveSheet.Range("$A$1:$W$71").AutoFilter Field:=1, Criteria1:="=*1470*", Operator:=xlFilterValues
Selection.Copy
CABReconFilePath.Sheets("CS").Range("C1").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
到目前为止,这一直是我的方法“过滤数据,复制它,将其粘贴到其他地方” - 但我正在努力学习更好的编程方法,并且我不断听到“不要使用 select”和“尝试避免复制粘贴 - 将内容移动到一个范围内并使用它!”。但我被困在这一点上。
编辑: .SpecialCells(xlCellTypeVisible) 是我需要添加的限定符。
【问题讨论】:
-
您的过滤条件有多复杂?使用 AutoFilter 并不是一个糟糕的主意,但是如果您有一种巧妙的方法来了解如何处理您的标准,我会使用数组。将范围更改为数组,在数组中进行所有操作,一旦最终数组准备好,用一行粘贴。这是最快和最干净的方式。没有任何选择或模仿使用 UI
-
我很想知道应用过滤器的更好方法!
-
您没有回答我的问题,您的标准有多复杂?如果您知道列并且您知道不会经常更改的标准,那么编写 VBA 代码是有益的。您定义数据范围,然后将范围转储到数组中,在数组中进行过滤和操作,创建结果数组并将数据从数组传输到可以在任何工作簿或工作表中的范围。
-
很简单,但是只要你对自己的问题没有一个清晰的定义,就很难用代码帮你。把你到底需要做什么用一个例子/数据和预期结果
-
非常简单 - 范围始终相同,标准始终相同。认为第一列中有 A、B 或 C - 我只想选择 A 和 B。