复制列';从多个excel文件中删除数据,并将其粘贴到新的excel文件中
我想从文件夹中的excel文件中复制一个特定列,并将所有值粘贴到新的excel工作表中 完成-复制列';从多个excel文件中删除数据,并将其粘贴到新的excel文件中,excel,vbscript,Excel,Vbscript,我想从文件夹中的excel文件中复制一个特定列,并将所有值粘贴到新的excel工作表中 完成- 我能够循环浏览文件夹中的所有文件 我能够从特定列复制数据 无法完成: 无法粘贴复制的数据 我只想复制不同的值 我想复制列,直到行出现为止。如果有7个 行然后复制列的7个值。我的复制命令正在复制所有 截至excel工作表最后一行的值 我的代码(VBScipt)- 此函数将返回工作表中给定列的使用范围 Private Function getRange(ByVal ColumnName As String
此函数将返回工作表中给定列的使用范围
Private Function getRange(ByVal ColumnName As String, ByVal Sheet As Worksheet) As Range
Set getRange = Sheet.Range(ColumnName & "1", ColumnName & Sheet.Range(ColumnName & Sheet.Columns(ColumnName).Rows.Count).End(xlUp).Row)
End Function
如果你用它来代替你的Set Source=objExcel.Activeworkbook.Sheets(1.Columns(“G”)
,它应该可以做你想做的事情
例如:Set Source=getRange(“G”,objExcel.Activeworkbook.Sheets(1))
您可能需要将dest
更改为单元格而不是列(以防excel抱怨其大小错误)
Set dest=objExcel.Activeworkbook.Sheets(1).单元格(“A1”)
刚刚看到您将其标记为VBScript,我没有将其测试为VBS,但它可能与VBA的工作原理相同。用于不同的复制
。使用AdvancedFilter()
方法,使用@NickSlash中的getRange()
定义单元格。对于从文件添加数据,将为每个文件创建新工作表,然后将数据过滤到其中。我希望这有帮助。VBScript
Const xlFilterCopy = 2
Const xlUp = -4162
Const xlDown = -4121
strPathSrc = "C:\Test" ' Source files folder
strMaskSrc = "*.xlsx" ' Source files filter mask
iSheetSrc = 1 ' Sourse sheet index or name
iColSrc = 7 ' Source column index, e. g. 7 for "G"
strPathDst = "C:\Test\New Folder\4.xlsx" ' Destination file
iColDst = 1 ' Destination column index
Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = True
Set objWorkBookDst = objExcel.Workbooks.Open(strPathDst)
Set objSheetTmp = objWorkBookDst.Worksheets.Add
objSheetTmp.Cells(1, iColDst).Value = "TempHeader"
Set objShellApp = CreateObject("Shell.Application")
Set objFolder = objShellApp.NameSpace(strPathSrc)
Set objItems = objFolder.Items()
objItems.Filter 64 + 128, strMaskSrc
objExcel.DisplayAlerts = False
For Each objItem In objItems
Set objWorkBookSrc = objExcel.Workbooks.Open(objItem.Path)
Set objSheetSrc = objWorkBookSrc.Sheets(iSheetSrc)
objSheetSrc.Cells(1, iColSrc).Insert xlDown
objSheetSrc.Cells(1, iColSrc).Value = "TempHeader"
Set objRangeSrc = GetRange(iColSrc, objSheetSrc)
If objRangeSrc.Cells.Count > 1 then
nNextRow = GetRange(iColDst, objSheetTmp).Rows.Count + 1
objRangeSrc.AdvancedFilter xlFilterCopy, , objSheetTmp.Cells(nNextRow, iColDst), True
objSheetTmp.Cells(nNextRow, iColDst).Delete xlUp
Set objRangeTmp = GetRange(iColDst, objSheetTmp)
Set objSheetDst = objWorkBookDst.Worksheets.Add
objRangeTmp.AdvancedFilter xlFilterCopy, , objSheetDst.Cells(1, iColDst), True
objSheetTmp.Delete
Set objSheetTmp = objSheetDst
End If
objWorkBookSrc.Close
Next
objSheetTmp.Cells(1, iColDst).Delete xlUp
objExcel.DisplayAlerts = True
Function GetRange(iColumn, objSheet)
With objSheet
Set GetRange = .Range(.Cells(1, iColumn), .Cells(.Cells(.Cells.Rows.Count, iColumn).End(xlUp).Row, iColumn))
End With
End Function
我认为PasteSpecial将有助于在vb脚本中粘贴。最好在PasteSpecial中使用-4163参数,以确保仅粘贴值。下面的代码在Microsoft Visual Studio 2012中适用于我。添加注释只是为了知道程序在代码中的位置。希望这有帮助
Imports System.Data.OleDb
Imports System.IO
Imports System.Text
Public Class Form1
Dim objCSV, objExcel, objSourceWorkbook, objDestWorkbook, objCSVWorkSheet, objXLSWorkSheet, srcCPUXrange, srcCPUYrange, srcMEMYrange, dstCPUXrange, dstCPUYrange, dstMEMYRange
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
'Create and open source CSV object
Label1.Text = "Setting Source"
objCSV = CreateObject("Excel.Application")
objCSV.Visible = True
objSourceWorkbook = objCSV.Workbooks.Open("C:\SourceFile.csv")
Label1.Text = "Source set"
'Create and open destination Excel object
Label1.Text = "Setting Destination"
objExcel = CreateObject("Excel.Application")
objExcel.Visible = True
objDestWorkbook = objExcel.Workbooks.Open("C:\DestinationFile.xlsx")
Label1.Text = "Destination Set"
'Select desired range from CSV file
Label1.Text = "Copying Data"
objCSVWorkSheet = objSourceWorkbook.Worksheets(1)
objCSVWorkSheet.Activate()
objSourceWorkbook.Worksheets(1).Range("A1").EntireColumn.Copy()
Label1.Text = "Data Copied"
'Paste in Excel workbook
Label1.Text = "Pasting Data"
objXLSWorkSheet = objDestWorkbook.Worksheets(1)
objXLSWorkSheet.Activate()
objDestWorkbook.Worksheets(1).Range("A2").PasteSpecial(-4163)
Label1.Text = "Data Pasted"
End Sub
End Class
Imports System.Data.OleDb
Imports System.IO
Imports System.Text
Public Class Form1
Dim objCSV, objExcel, objSourceWorkbook, objDestWorkbook, objCSVWorkSheet, objXLSWorkSheet, srcCPUXrange, srcCPUYrange, srcMEMYrange, dstCPUXrange, dstCPUYrange, dstMEMYRange
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
'Create and open source CSV object
Label1.Text = "Setting Source"
objCSV = CreateObject("Excel.Application")
objCSV.Visible = True
objSourceWorkbook = objCSV.Workbooks.Open("C:\SourceFile.csv")
Label1.Text = "Source set"
'Create and open destination Excel object
Label1.Text = "Setting Destination"
objExcel = CreateObject("Excel.Application")
objExcel.Visible = True
objDestWorkbook = objExcel.Workbooks.Open("C:\DestinationFile.xlsx")
Label1.Text = "Destination Set"
'Select desired range from CSV file
Label1.Text = "Copying Data"
objCSVWorkSheet = objSourceWorkbook.Worksheets(1)
objCSVWorkSheet.Activate()
objSourceWorkbook.Worksheets(1).Range("A1").EntireColumn.Copy()
Label1.Text = "Data Copied"
'Paste in Excel workbook
Label1.Text = "Pasting Data"
objXLSWorkSheet = objDestWorkbook.Worksheets(1)
objXLSWorkSheet.Activate()
objDestWorkbook.Worksheets(1).Range("A2").PasteSpecial(-4163)
Label1.Text = "Data Pasted"
End Sub
End Class