2017-11-18 265 views
0

我不是来自软件背景并试图编写宏以避免导致错误的重复工作。请随时提出建议,让它变得更好。我尝试从本网站的不同程序中抽取部分内容并使其工作。如何打开保存在特定位置的Excel文件,使用VBA在工作表的最后一个选项卡中创建新选项卡

预先感谢您。

这是我正在做的。 a)我想从当前文件(说文件1)打开保存在特定位置的Excel文件(可以说是文件2)。 作品

b)以文件2相同在该文件中最后一个标签创建新的选项卡,工程

c)中重新命名使用2个不同的细胞从文件1所创建的标签(Auto Rename基于文件1单元很好,但我只能管理弹出,要求我输入但不重命名文件)。 不起作用/部分工作

d)弹出不同的细胞输入名称和2个输入(我只能拿你的名字,我怎么能得到3输入3种不同的细胞)隐而不宣't工作/部分工作

e)从文件1中复制2个单元格,并复制到文件2新创建的选项卡中。 不工作

这是我试图写的代码。

Sub Filling_List() 
Dim sPath As String, sFile As String, wb As Workbook, i As Integer 

'Application.ScreenUpdating = False 

sPath = "C:\Users\aricsonp\Desktop\Filling list macro\" 
sFile = sPath & "ArF Filling List.xlsm" 

Set wb = Workbooks.Open(sFile) 

ActiveSheet.Copy After:=Worksheets(Worksheets.Count) 
Worksheets(Worksheets.Count).Name = InputBox("New Name:") 
If sName = "" Then Exit Sub 

ActiveSheet.cell(3, "E") = InputBox("Your Name:") 

' With ActiveSheet.Sheets("ArF Filling List (7)") 
'.Range("B03").Value = uploader.Sheets("Que & Tsc Cal").Range("B02").Value 
' .Range("B05").Value = uploader.Sheets("Que & Tsc Cal").Range("B01").Value 
' End With 


'Application.ScreenUpdating = True 


End Sub 

回答

2

这里有一些指针。

1)Put Option Explicit at top,so syntax and declarations are checked。 这会强制您声明sNameuploader以及设置它们的值。 i也被声明但未被分配。

2)您的代码按原样重命名为工作表。您直接从输入框分配新添加的工作表,而不是将其存储在变量中。

Worksheets(Worksheets.Count).Name = InputBox("New Name:") 

假设可变sName竟是来保存这些和要抓住在包含代码(即的ThisWorkbook)正在运行的工作簿从2个细胞这个值:

sName = ThisWorkbook.Worksheets("Sheet1").Range("A1") & ThisWorkbook.Worksheets("Sheet1").Range("B1") 

您可能想要声明并分配ThisWorkbook以及作为变量引用的工作表。

例如

Dim wb1 as Workbook 
Dim ws1 as Worksheet 
Set wb1 = ThisWorkbook 
Set ws1 = ThisWorkbook.Worksheets("Sheet1") 'change as appropriate 

3)避免混合工作表集合。除非您有图表工作表,否则我更喜欢工作表集合。

4)在大多数情况下,您会希望与vbNullstring比较,而不是空字符串文字(“”)。分配速度更快,使用更少的内存等。

If sName = vbNullString Then Exit Sub 

5)将更多值分配给单元格;添加更多输入框AND使用Cells而非单元例如

ActiveSheet.Cells(4, "E") = InputBox("Your Age:") 

6)将更多单元格的值添加到新打开的工作簿中,新添加的工作表;用你的wbsName变量,以确保正确的定位:

With wb.Worksheets(sName) 

7)您可能要声明对自己的路线,即避免在一行多个声明顶部每个变量。使它更易于调试和发现任何隐含的变体。

所以,你可能有类似以下内容:

Option Explicit 

Public Sub Filling_List() 

Dim sPath As String 
Dim sFile As String 
Dim wb As Workbook 
' Dim i As Integer ''not used 
Dim sName As String 'add sName declaration 
'Add declaration for uploader variable and set its value 
Dim wb1 as Workbook 
Dim ws1 as Worksheet 

Set wb1 = ThisWorkbook 
Set ws1 = ThisWorkbook.Worksheets("Sheet1") 

Application.ScreenUpdating = False 

sPath = "C:\Users\aricsonp\Desktop\Filling list macro\" 
sFile = sPath & "ArF Filling List.xlsm" 

Set wb = Workbooks.Open(sFile) 

ActiveSheet.Copy After:=Worksheets(Worksheets.Count) 

'Worksheets(Worksheets.Count).Name = InputBox("New Name:") 

sName = ws1.Range("A1") & ws1.Range("B1") 'assign value from two cells 

ActiveSheet.Name = sName 

If sName = vbNullString Then Exit Sub 'compare against vbNullstring not empty string literal 

With wb.Worksheets(sName) 

    .Cells(3, "E") = InputBox("Your Name:") 
    .Cells(4, "E") = InputBox("Your Age:") 
    .Cells(5, "E") = InputBox("Your Occupation:") 
    .Range("B03") = uploader.Worksheets("Que & Tsc Cal").Range("B02").Value2 
    .Range("B05") = uploader.Worksheets("Que & Tsc Cal").Range("B01").Value2 

End With 

Application.ScreenUpdating = True 

End Sub 
+0

谢谢几乎工作。很好解释。我使用Option explicit,但它仍然给我错误,因为“编译错误变量未定义,我在最后2行看到代码停止在Uploader,我们试图从2个单元中提取值。我尝试修改wb1而不是上传器。 – Eric

+0

感谢它的帮助非常丰富,并且很好地解释了像我这样一个知识匮乏的人,当我把上传器改为wb1时,它的工作方式是我想要的,我看到很多弹出框作为输入,有没有办法让我得到1弹出框会询问我3件事(你的名字?你的年龄?你的职业?),我可以给出3个答案,这将得到3个不同的单元格Say Cell(3,E; 4,E; 5,E) – Eric

+0

是你可以,但你需要额外的代码来检查用户是否已经正确输入了信息。请参阅这里的示例:https://social.msdn.microsoft.com/Forums/en-US/52aa7ec1-9663-432c-9449 -55fb1d738969/vba-inputbox-that-returns-array-of-values?forum = isvvba – QHarr

相关问题