2017-08-21 99 views
1

我还是VBA的新手,因此我所做的大多数编码都是在从互联网复制后记录或修改的。重命名工作簿vba无法正常工作

在记录我执行的步骤后,我注意到宏将记录文件名和表名。

因此,如果我要打开一个与录制宏名称不相似的文件,我的宏将无法工作。

例如,文件B是在宏中注册的名称,但是我现在希望在文件C上执行宏程序但失败。

有没有一种方法可以绕过这个问题?

Sub trial() 

Dim wb, wb2, wb3 As Workbook 

Dim fn As String 

Set wb = ActiveWorkbook 

With Application.FileDialog(msoFileDialogOpen) 
.AllowMultiSelect = False 
If .Show = -1 Then 
fn = .SelectedItems(1) 
Set wb2 = Workbooks.Open(fn) 
Else 
MsgBox "You cancel the process." 
End If 
End With 

Dim SheetName As String 

'this is the place i would like to edit 
Windows("SPC July BPW341CL - Copy.csv").Activate 
    Sheets("SPC July BPW341CL - Copy").Select 
    Sheets("SPC July BPW341CL - Copy").copy after:=Workbooks(_ 
     "New Microsoft Excel Worksheet.xlsm").Sheets(4) 
      Sheets("SPC July BPW341CL - Copy").Activate 


SheetName = Format(Date, "yyyymmdd") 'Change the format as per your requirement 
ActiveSheet.Name = SheetName 


    Set wb3 = Application.ActiveWorkbook 

    Sheets("Summary").Activate 
    Range("A1").Select 

     For Each ws In wb3.Worksheets 
      If ws.Name <> "Compare to RGB" And ws.Name <> "Summary" Then 
       For i = 1 To 5 
        Selection.Value = ws.Name 
        Selection.Offset(0, 1).Select 
      Next 
     End If 
    Next 

End Sub 

回答

1

你快到了。

在顶部,您要创建引用,您可以稍后在代码中使用的工作簿:

Set wb2 = Workbooks.Open(fn) 

这将创建一个工作簿中,你可以稍后在代码中使用的参考。

然后,当您有代码:

Windows("SPC July BPW341CL - Copy.csv").Activate 
Sheets("SPC July BPW341CL - Copy").Select 
Sheets("SPC July BPW341CL - Copy").copy after:=Workbooks(_ 
    "New Microsoft Excel Worksheet.xlsm").Sheets(4) 
     Sheets("SPC July BPW341CL - Copy").Activate 

我想这是记录的代码?您应该能够使用之前创建的引用:

wb.Sheets("SPC July BPW341CL - Copy").Select 
wb.Sheets("SPC July BPW341CL - Copy").copy after:=wb2.Sheets(4) 

这可能不是做的正是你想要什么做的,因为我并不完全清楚其上张要从哪个工作簿复制。但是你有一般的语法正确。

您还可以索引卡片一样

dim oSheet as worksheet 
set osheet = wb.sheets("sheetname") '//to set via name, Or 
set oSheet = wb.sheets(4)   '//Or to set via index 

希望这有助于。

编辑:其他几点注意: 1.)总是在代码的顶部使用Option Explicit。 2.)Dim wb,wb2,wb3作为工作簿 - 此行不声明三个工作簿对象。相反,它实际上声明了两个变体和一个工作簿。你需要声明它们为:Dim wb As Workbook, wb2 As Workbook, wb3 As Workbook

+0

非常感谢@ainwood的回答,但我仍然不清楚我应该在我的VBA中改变什么..就像你说我已经提出了一个引用,这是一个fn,是不是可能的是,我用fn替换了上述VBA中的所有名称?例如, /Windows(“SPC July BPW341CL - Copy.csv”)。激活/被替换为/Windows("fn").Activate/ ?? 截至目前,我只是想改变文件名“SPC July BPW341CL - Copy.csv”,这样其他名称不同的工作簿也可以由宏运行。 – Fong

+0

你能解释一下你想要的宏吗?允许用户选择一个Excel文件,然后呢? – ainwood

+0

文件A用于编译数据,文件B到Z或甚至更多是原始数据。我需要做的是让用户选择输入文件(文件B到Z),然后将其中的所有数据复制到文件A中,将它们一起编译到一个文件中。通过这样做,我无法列出所有文件名,因为它们会随时间变化,具体取决于原始数据。那么有没有一种方法可以让我可以用某种方式对它进行编程,以便用户可以选择任何文件,而不必一次更改文件名。 – Fong