【发布时间】:2015-03-13 14:38:44
【问题描述】:
我是一名葡萄牙工程师,我最近开始使用 Visual Basic 在名为“Livro MQTEN”的工作簿上名为“Início”的特定工作表中的一个按钮上进行编程。在工作表“Início”上,我有一个带有以下代码的按钮:
Private Sub CommandButton1_Click()
Dim lngCount As Long
Dim j As String
Dim fileName As String
Dim lngIndex As Long
Dim strPath() As String
Dim nome As String
Dim folha As String
' Open the file dialog
With Application.FileDialog(msoFileDialogOpen)
.Title = "Selecione o ficheiro dos comboios realizados do dia"
.InitialFileName = "Explor. *"
.AllowMultiSelect = False
.Show
.Filters.Add "Excel files", "*.xlsx; *.xls", 1
' Display paths of each file selected
For lngCount = 1 To .SelectedItems.Count
'MsgBox .SelectedItems(lngCount)
j = .SelectedItems(lngCount)
'MsgBox (j)
strPath() = Split(j, "\") 'Put the Parts of our path into an array
lngIndex = UBound(strPath)
fileName = strPath(lngIndex) 'Get the File Name from our array
'MsgBox (fileName)
nome = fileName
'Get name of sheet
Dim wb As Workbook
Dim ws As Worksheet
Dim TxtRng As Range
Set wb = ActiveWorkbook
Set ws = wb.Sheets("Início")
ws.Unprotect
Set TxtRng = ws.Range("D17")
TxtRng.Value = nome
ws.Protect
folha = Cells.Item(21, 6)
'MsgBox (folha)
'Copy from sheet
Dim x As Workbook, y As Workbook
Dim ws1 As Worksheet, ws2 As Worksheet
Dim SrcRange As Range
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Set x = Workbooks.Open(j)
Set y = ThisWorkbook
Set ws1 = x.Sheets(folha)
Set ws2 = y.Sheets("Explor. do Mês")
Set CopyData = ws1.Range("A1:M8000").EntireColumn
CopyData.Copy
Set Addme = ws2.Range("A1:M8000")
Addme.PasteSpecial xlPasteValues
x.Close True
Application.ScreenUpdating = True
Application.DisplayAlerts = True
Next lngCount
End With
End Sub
在代码中:
Set CopyData = ws1.Range("A1:M8000").EntireColumn
CopyData.Copy
Set Addme = ws2.Range("A1:M8000")
Addme.PasteSpecial xlPasteValues
我将整个列从 A 列粘贴到 M 列。我只需要复制和 PasteSpecial 工作表 ws1 中具有工作表 ws2 值的单元格。然后,如果我再次单击按钮并选择另一个工作簿,则将值添加到 ws2 而不是覆盖它们。如何在 Visual Basic 中执行此操作?我在这里缺少什么?拜托各位,我真的,真的需要你们的帮助!提前致谢。
解决了!
只是把上面的代码改成:
With ws2
'Presuming the column "A" in ws2 will always contain the last row.
intLastRow = .Cells(Rows.Count, 1).End(xlUp).Row
'Presuming we will ALWAYS copy the "A1:M8000" range, and that the column "A" is filled.
'Because we determine the last used row based on this column in ws2 (intLastRow)
ws1.Range("A1:M8000").Copy
.Cells(intLastRow + 1, 1).PasteSpecial xlPasteValues
Application.CutCopyMode = False
End With
并在变量声明中添加:
Dim intLastRow As Integer
【问题讨论】:
-
通过“然后,如果我再次单击按钮并选择另一个工作簿,则将值添加到 ws2 而不会覆盖它们。”你的意思是在相同的范围内它们应该加在一起(例如,在 ws2 "A1" = 5 中,你点击了按钮,现在 "A1" = 5 + 新值)或你想粘贴ws2 中已填充范围底部的新值?
-
我想将新值粘贴到ws2中已填充范围的底部,伙计。
标签: vba excel copy-paste