在Excel中使用VBA复制粘贴

我是vba代码的初学者,我有2个工作簿让说“reportPageImpression.xlsx”和“testCloseWork.xslx”。 目前我可以通过点击“更新”button从报告页面获取数据到testcloseworkbook。

更新按钮

所以现在我正在尝试做什么,当再次点击更新button时,值将会在1月16日(新的列),依此类推。 在这里我的代码

Option Explicit Private Function GetValueFromClosedWorkbook(path, file, sheet, ref) Dim arg As String 'Let's check whether the file exists If Right(path, 1) <> "\" Then path = path & "\" If Dir(path & file) = "" Then GetValueFromClosedWorkbook = "File Not Found" Exit Function End If 'We create the argument arg = "'" & path & "[" & file & "]" & sheet & "'!" & _ Range(ref).Range("A1").Address(, , xlR1C1) 'MsgBox arg 'Now we execute an XLM macro 'All references must be given as R1C1 strings. GetValueFromClosedWorkbook = ExecuteExcel4Macro(arg) End Function Sub TestGetValueFromClosedWorkbook() Dim p As String, f As String Dim s As String, a As String p = ThisWorkbook.path f = "reportPageImpression.xlsx" s = "report_page_impression" a = "D39" ActiveSheet.Range("C8") = GetValueFromClosedWorkbook(p, f, s, a) End Sub 

 ActiveSheet.Cells(Range("C8").Row, Columns.Count).End(xlToLeft).Offset(0, 1) = GetValueFromClosedWorkbook(p, f, s, a) 

要检查一个单元格是否为空,您必须使用像“ COUNTA(range) ”这样的公式作为ExecuteExcel4Macro(arg)方法的参数,并获取closures的工作簿指定范围中的非空单元格的数量。

如果您将单元格地址指定为其范围,并且它返回零,那么该单元格为空,否则它有一个值,然后可以再次使用ExecuteExcel4Macro(arg)方法,将单元格引用作为其参数。 在后一种情况下,您可能希望使用原始“范围”上的.Offset(rowOffset)方法将其移动到rowOffset分开的单元格rowOffset行。

为了不迷失在引用中,我build议你重构你的代码,并广泛使用“包装”,以便有一个干净的代码

在这里,您可能会发现我所了解的内容

 Sub TestGetValueFromClosedWorkbook() Dim p As String, f As String Dim s As String, a As String Dim argPart As String Dim var As Variant Dim checkSheetResult As String p = ThisWorkbook.path f = "reportPageImpression.xlsx" s = "report_page_impression" a = "D39" checkSheetResult = CheckSht(p, f) ' check if the file to be read as closed is not already opened and if it exists If checkSheetResult = "" Then argPart = "'" & p & "[" & f & "]" & s & "'!" 'set the "constant" part of the argument var = GetFirstNonEmptyValueFromClosedWorkbook(a, argPart, -1) If var = -1 Then MsgBox ("No value found!") Else ActiveSheet.Cells(Range("C8").row, Columns.Count).End(xlToLeft).Offset(0, 1) = var End If Else MsgBox checkSheetResult End If End Sub Private Function GetFirstNonEmptyValueFromClosedWorkbook(ref As String, argPart As String, Optional rowOffsetRate As Variant) As Variant Dim arg As String, funcArg As String Dim var As Variant Dim rowOffset As Long If IsMissing(rowOffsetRate) Then rowOffsetRate = 0 rowOffset = 0 funcArg = SetArgFunction(ref, argPart, rowOffset, arg) var = ExecuteExcel4Macro(funcArg) Do While var = -1 And CheckIfOffset(ref, CLng(rowOffsetRate), rowOffset) funcArg = SetArgFunction(ref, argPart, rowOffset, arg) var = ExecuteExcel4Macro(funcArg) Loop If var <> -1 Then var = ExecuteExcel4Macro(arg) GetFirstNonEmptyValueFromClosedWorkbook = var End Function Private Function SetArgFunction(ref As String, argPart As String, rowOffset As Long, arg As String) As String arg = argPart & Range(ref).Range("A1").Offset(rowOffset).Address(, , xlR1C1) SetArgFunction = "IF(COUNTA(" & arg & ")>0,1,-1)" End Function Private Function CheckIfOffset(ref As String, rowOffsetRate As Long, rowOffset As Long) As Boolean Dim nextRow As Long Dim cell As Range Set cell = Range(ref) nextRow = cell.Offset(rowOffset).row + rowOffsetRate CheckIfOffset = rowOffsetRate > 0 And nextRow <= cell.Parent.Cells(cell.Parent.Rows.Count, 1).row _ Or (rowOffsetRate < 0 And nextRow > 0) If CheckIfOffset Then rowOffset = rowOffset + rowOffsetRate End Function Private Function CheckSht(path As String, file As String) As String Dim wb As Workbook Dim okSheet As Boolean If Right(path, 1) <> "\" Then path = path & "\" On Error Resume Next Set wb = Workbooks(file) On Error GoTo 0 okSheet = wb Is Nothing If Not okSheet Then okSheet = wb.path & "\" <> path If Not okSheet Then ' file is already open CheckSht = "workbook:" & vbCrLf & vbCrLf & file & vbCrLf & vbCrLf & "in:" & vbCrLf & vbCrLf & path & vbCrLf & vbCrLf & "is already open!" Else 'Let's check whether the file exists If Dir(path & file) = "" Then CheckSht = "workbook:" & vbCrLf & vbCrLf & file & vbCrLf & vbCrLf & "in:" & vbCrLf & vbCrLf & path & vbCrLf & vbCrLf & "not found!" End If End Function 

转换到不同单元格的“逻辑”全部在var = GetFirstNonEmptyValueFromClosedWorkbook(a, argPart, -1)其中-1是“rowOffsetRate” GetFirstNonEmptyValueFromClosedWorkbook(ref As String, argPart As String, Optional rowOffsetRate As Variant) As Variant函数考虑地址a的单元格是否为空。 如果没有传入“rowOffsetRate”,则只检查地址a的单元格