簡體   English   中英

嘗試使用Excel VBA將行復制/粘貼到表單上,在行之間保存表單

[英]Trying to use Excel VBA to copy/paste rows onto form, saving form in between rows

我有一本工作簿,它用作另一個基於Excel的表單(不是Userform,而是格式化的電子表格)的源數據。 源文件有2-40行數據(從第18行開始),每行都需要復制到表單中並分別保存,即源文件中的15行相當於15個不同的Form文件。

行中的每個單元格都必須單獨復制並粘貼到表單上的特定單元格中。 源表單包含客戶及其相關信息。 我試圖在窗體上使用宏來自動從源文件中提取訂單項,將窗體作為客戶端的名稱保存在指定的文件夾中,然后繼續直到源文件上出現空白行。 我有一些基本的VBA經驗,但是對循環,變量或函數的知識卻很少,這似乎是我在此處的最佳做法。

到目前為止,這就是我所擁有的。 我所能完成的就是從源文件復制/粘貼第一行。

Range("B18").Select
Selection.Copy
Windows("Form.xls").Activate
Range("F7:K7").Select
ActiveSheet.Paste
Windows("Source.xls").Activate
Range("C18").Select
Application.CutCopyMode = False
Selection.Copy
Windows("Processing Form.xls").Activate
Range("D8").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
Windows("Source.xls").Activate
Range("D18").Select
Application.CutCopyMode = False
Selection.Copy
Windows("Processing Form.xls").Activate
Range("H29").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
Windows("Source.xls").Activate
Range("E18").Select
Application.CutCopyMode = False
Selection.Copy
Windows("Processing Form.xls").Activate
Range("E29").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
Windows("Source.xls").Activate
Range("F18").Select
Application.CutCopyMode = False
Selection.Copy
Windows("Processing Form.xls").Activate
Range("D33").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
Range(“F7:K7”).Select
Application.CutCopyMode = False
Selection.Copy
ActiveWorkbook.SaveAs

我什至無法獲得我的宏來按客戶名稱保存表單。 我也知道,我廣泛使用“ Range”和“ Select”會使我的代碼慢下來,而我只是不知道如何提高效率。 我嘗試使用一個引用單元格來告訴宏要復制源文件的哪一行,但是在這條路上也沒有任何運氣。 任何和所有幫助將不勝感激!

您經常激活工作簿。 那是你的代碼變慢..下面的代碼會更快地工作

Sub test()
Dim dwb As Workbook
Dim swb As Workbook

Set dwb = Workbooks("Form.xls")
Set swb = Workbooks("Source.xls")
Set awb = Workbooks("Processing Form.xls")

    With swb
    .ActiveSheet.Range("B18").Copy Destination:=dwb.Sheet1.Range("F7:K7")
    .ActiveSheet.Range("C18").Copy Destination:=awb.Sheet1.Range("D8")
    .ActiveSheet.Range("D18").Copy Destination:=awb.Sheet1.Range("H29")
    .ActiveSheet.Range("e18").Copy Destination:=awb.Sheet1.Range("E29")
    .ActiveSheet.Range("F18").Copy Destination:=awb.Sheet1.Range("D33")
    End With

    End Sub

這可能有助於將您引向正確的方向:

Dim i As Long
For i = 1 To 10
    With Range("A" & i)
        .Copy Workbooks("ToWorkbook.xlsx").Worksheets("Sheet1").Range("B" & i + 9)
        .Copy Workbooks("ToAnother.xlsx").Worksheets("Sheet2").Range("C" & i + 8)
        .Copy Workbooks("AnotherOne.xlsx").Worksheets("SheetA").Range("D" & i + 2)
    End With
Next i

i To 10用作計數器來循環遍歷源工作簿中的行。 對於每個i ,您要從A列獲取范圍(即, with此操作),然后將其復制並粘貼到不同工作簿的不同單元中。 在第一輪中,將Range(“ A1”)復制到3個不同的工作簿中,分別位於Range(“ B10”),Range(“ C9”)和Range(“ D3”)。 下一回合,源書中的Range(“ A2”)將被復制並從上次粘貼到相同的目標工作簿中,但是在Range(“ B11”),Range(“ C10”)和Range(“ D4 ”)。 只需為您需要粘貼的不同表單找到模式即可。

這是一個簡單的演示:

注意:未測試

Option Explicit

Sub CopyToForm()

Dim wbSource As Workbook, wbForm As Workbook
Dim wsSource As Worksheet, wsForm As Worksheet
Dim formpath As String, foldertosavepath as string
Dim lrow As Long, i As Integer

Set wbSource = Thisworkbook '~~> assuming you write your code in Source.xls
Set wsSource = wbSource.Sheets("NameOfYourSheet") '~~> put the source sheet name

'~~> put the path where your form template is saved here
formpath = "C:\Users\Username\FolderName\Processing Form.xls"
'~~> put the path where you want to save individual updated forms.
foldertosavepath = "C:\Users\Username\FolderDestination\"

With wsSource
    '~~> get the number of rows with data
    lrow = .Range("B" & .Rows.Count).End(xlUp).Row
    If lrow < 18 Then Msgbox "No data for transfer": Exit Sub
    For i = 18 to lrow
        Set wbForm = Workbooks.Open(formpath) '~~> open the form
        Set wsForm = wbForm.Sheets("Sheetname") '~~> put the form sheet name
        '~~> proceed with the copying
        .Range("B" & i).Copy: wsForm.Range("F7:K7").PasteSpecial xlPasteValue
        .Range("C" & i).Copy: wsForm.Range("D8").PasteSpecial xlPasteValues
        .Range("D" & i).Copy: wsForm.Range("H29").PasteSpecial xlPasteValues
        .Range("E" & i).Copy: wsForm.Range("E29").PasteSpecial xlPasteValues
        .Range("F" & i).Copy: wsForm.Range("D33").PasteSpecial xlPasteValues
        '~~> Save the form using the client name, I assumed it is in B?
        wbForm.SaveAs foldertosavepath & .Range("B" & i).Value & ".xls"
        wbForm.Close True
        Set wbForm = Nothing
        Set wsForm = Nothing
   Next
End With

End Sub

在上面的代碼中,我假定Form.xlsProcessing Form.xls相同。
這應該給您邏輯。
希望這能幫助您開始。
正如我所指出的,這不是測試,因此,如果遇到錯誤,請注釋掉。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM