2015-08-04 3 views
0

Я новичок в VBA. Я пытаюсь скопировать выбранный диапазон из разных книг и вставить в целевую книгу с другим именем листа, соответствующим названию исходного файла.Могу ли я использовать переменную как имя листа (VBA)

код, как показано ниже:

'open file 

Sub RstChk() 
Dim StrFileName As String 
Dim StrFilePath As String 
Dim TimeStr As String 
Dim Version As Integer 
Dim x As Workbook 
Dim y As Workbook 
Dim PstTgt As String 

'define filename as array 

Dim FN(10) As String 

FN(1) = "CIO Wholesale" 
FN(2) = "RMG" 
FN(3) = "DCM" 
FN(4) = "DivHeadOth" 
FN(5) = "Runoff" 
FN(6) = "Other Risk Subs" 
FN(7) = "FIC" 
FN(8) = "Treasury" 
FN(9) = "Cash Equities" 
FN(10) = "Global Derivatives" 

'define file path 

StrFilePath = "V:\RISKMIS\PUBLIC\apps\MORNING\RMU 1.5 Report\Consolidated\" 

'define TimeStr 

TimeStr = Format(Now() - 1, "mm-dd-yyyy") 

Set y = Workbooks.Open("H:\Eform\Report_checking.xls") 

'applying filename from array using loop 
'---------------------------------------------------------------- 
For i = 1 To 10 

'define changing file name with path & loop 

For Version = 65 To 68 

StrFileName = (StrFilePath & FN(i) & "_" & TimeStr & "_" & Chr(Version) & ".xls") 

Set x = Workbooks.Open(StrFileName) 

'------------------------------------------------- 
If Chr(Version) = "A" Then 
PstTgt = "A3" 

ElseIf Chr(Version) = "B" Then 
PstTgt = "E3" 


ElseIf Chr(Version) = "C" Then 
PstTgt = "I3" 

Else 

PstTgt = "M3" 

End If 

'copy the column and paste to report checking 

y.Worksheets(FN(i)).PstTgt.Copy Destination = x.Sheets("Risk Summary").Range ("AA5:AC118") 


Application.CutCopyMode = False 

x.Close 

Next Version 

Next i 

End Sub 

я получаю сообщение об ошибке при попытке скопировать диапазон от исходного файла (х) целевой файл (Y).

Ошибка выполнения '13', тип рассогласование

Просто не могу понять, что пошло не так.

Большое спасибо за помощь.

Dan

ответ

0

Вы получили эту ошибку, потому что ваша переменная PstTgt является строкой, а не диапазон «несоответствие типов»

Если вы посмотрите на документацию Range.Copy https://msdn.microsoft.com/en-us/library/office/ff837760.aspx

У вас есть два выбор:

  • Сделать PstTgt диапазон и ссылки непосредственно в пределах в вашем ENDIF

    ' Redefine PstTgt as a range 
    dim PstTgt as Range 
    
    ' set value of PstTgt 
    If Chr(Version) = "A" Then 
        set PstTgt = y.Worksheets(FN(i)).Range("A3") 
    endif 
    ... 
    ' Copy the range where you want 
    PstTgt.Copy destination:=x.Sheets("Risk Summary").Range("AA5") 
    
  • Вы держите свой код, как это и просто исправить вашу копию, добавив диапазон

    y.Worksheets(FN(i)).Range(PstTgt).Copy Destination = x.Sheets("Risk Summary").Range("AA5")