2017-11-18 263 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

相關問題