2016-02-22 77 views
0

我是vba代码的初学者,我有2个工作簿让我们说“reportPageImpression.xlsx”和“testCloseWork.xslx”。目前我可以通过单击“更新”按钮从reportpage获取数据到testcloseworkbook。在excel中使用VBA复制粘贴

update button

所以现在什么,我尝试做,当再次点击更新按钮,该值会去扬-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 

回答

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

来检查电池是空的,你必须使用一个公式,如“COUNTA(range)”为ExecuteExcel4Macro(arg)方法的参数并取回非空单元格的数量在关闭工作簿指定范围。

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

为了不迷失在引用,我建议你重构你的代码,并大量使用“包装”,以便有干净的maintanable码

在这里你会发现我所上来按我理解

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

+0

非常感谢@ user3598756 :) – user2982040

+0

嗨@ user3598756,如何检查是否从D39单元格的值是否为空,则希望分配从D38电池新价值? 。谢谢 – user2982040

+0

欣赏你的时间来回答我的问题与伟大的解决方案..再次感谢@ user3598756 – user2982040