2016-02-22 193 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