在生成数据时试图将.xls工作簿中的数据复制到.xlsm文件中

我正在尝试通过.xls工作簿的一列进行循环。 该列的每一行都有数据需要复制到新的.xlsm工作簿,同时自动生成string(名称,说明等)。 我试过我的解决scheme,下面列出,但我得到一个1004错误,我不知道如何进行。 我对VBA相当新,所以任何指针将不胜感激。

我看到或可能需要解决的一些问题如下:

  • 错误1004(应用程序定义或对象定义的错误)。 错误发生在if语句<.Range(Cells((x + 1)etc.>)内部
  • 当我从.xls工作簿中的一行复制数据时,它会填充两行(有意)用于新的.xlsm工作簿。 所以我需要能够容纳一个额外的行,每次我复制数据。 这就是为什么我在for循环中有x = x + 1的原因。
  • 对于我复制的.xls工作簿行中的某些数据,他们有2或3个数据需要被parsing成2个子集。因此,对于大多数工作簿来说,这是1个数据在新文档中变成2行,但如果是2行数据> 4行等

TL; DR-如何通过这个错误,如何让我的代码更好地成功地通过单个列迭代从另一个工作簿中的数据。

无论如何,这里是代码:

Sub TestThis() Dim wb As Workbook Dim x As Integer Application.ScreenUpdating = False Set wb = Workbooks.Open("C:\Users\blah\Documents\blah\Week 02\old file.xls", True, True) With ThisWorkbook.Worksheets("template") NumRows = wb.Sheets(1).Range("T9:T1116").Rows.Count Range("T9:T1116").Select For x = 1 To NumRows If ActiveCell.Formula <> "" Then .Range(Cells(x, 2)).Formula = "field 1" .Range(Cells(x, 5)).Formula = "field 2" .Range(Cells(x, 7)).Formula = "a sentence is here but is replaced" .Range(Cells(x, 9)).Formula = "1" .Range(Cells(x, 10)).Formula = "blah blah blah data" .Range(Cells(x, 11)).Formula = "blah blah blah more data" .Range(Cells((x + 1), 9)).Formula = "2" .Range(Cells((x + 1), 10)).Formula = "Data in " + ActiveCell.Formula + " is stored in blah" .Range(Cells((x + 1), 11)).Formula = "Data is stored in blah" End If x = x + 1 ActiveCell.Offset(1, 0).Select Next End With wb.Close False Set wb = Nothing Application.ScreenUpdating = True End Sub 

我会开始不奇怪列中的所有单元格。 获取vba中的数据,然后从那里循环和操作。 所以有点像

 Dim aInVar As Variant 'This captures all the data inside an input variant in one hit aInVar = Sheets(1).Range("T9:T1116") 

您也可以创build一个输出变体,以便在parsinginput变体时将其传入:

 Dim aOutVar As Variant 'This resizes it to twice the amount of rows as the original ReDim aOutVar(1 To UBound(aInVar, 1) * 2, 1 To 1) 

一旦它在那里,你可以更容易地循环变体。 所以;

 Dim i As Integer 'Loop through the in variant, doing whatever to its values For i = 1 To UBound(aInVar, 1) 'test each field looking for whatever. Select Case aInVar(i, 1) Case "field 1" 'do something here aOutVar(i * 2 - 1, 1) = aInVar(i, 1) Case "field 2" 'do something different here, eg aOutVar(i * 2 - 1, 1) = Replace(aInVar(i, 1), "replaceStr", "replacementStr") End Select Next i 

最后,您可以只输出一次创build的输出variables:

 Sheets(2).Range(Cells(1, 1), Cells(UBound(aOutVar, 1), 1)) = aOutVar 

在vba中操作数据比在循环和testing单元时更快,而且更容易控制你正在做什么。 此外,当我看到人们使用“select”/“激活”:)来循环单元格时带出我的OCD

没有一个testing,但希望足以让你用不同的方法去。

为什么不使用ADO并将源数据表视为数据库表。 这将完全避免循环 ,您仍然可以自动生成string

参考文献:

  • MS Technet [Office Space]:使用ADO查询Excel电子表格
  • MS知识库:如何使用Visual Basic或VBA中的Excel数据使用ADO
  • MSDN库(脚本诊所):许多关于文本文件的ADO

基本上,您使用ADO和OLE DB Jet Driver连接到您的Excel文件:

 Dim cn as ADODB.Connection Set cn = New ADODB.Connection With cn .Provider = "Microsoft.Jet.OLEDB.4.0" .ConnectionString = "Data Source=C:\MyFolder\MyWorkbook.xls;" & _ "Extended Properties=Excel 8.0;" .Open End With 

接下来,现在你有一个ADO连接,你可以使用它创build一个ADOlogging集 :

 objRecordset.Open "Select * FROM [Sheet1$]", _ objConnection, adOpenStatic, adLockOptimistic, adCmdText 

注意[SHEET NAME $]每张纸是一张桌子!

您的查询:您可以自定义您的查询,以包括列/字段名称和自动生成您的stringWhere子句 ,甚至添加派生列将公式放入工作表。

或者,您可以转储数据,然后使用VBA以编程方式添加公式,并在一个步骤中添加数百或者更多的行。

一旦打开logging集,可以使用Range对象的CopyFromRecordset方法将logging集转储到目标工作表的单元格中