Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 试图在生成数据时将数据从.xls工作簿复制到.xlsm工作簿_Vba_Excel_Excel 2010 - Fatal编程技术网

Vba 试图在生成数据时将数据从.xls工作簿复制到.xlsm工作簿

Vba 试图在生成数据时将数据从.xls工作簿复制到.xlsm工作簿,vba,excel,excel-2010,Vba,Excel,Excel 2010,我试图循环浏览.xls工作簿的一列。该列的每一行都有需要复制到新的.xlsm工作簿的数据,同时自动生成我创建的字符串(名称、说明等)。我尝试了下面列出的解决方案,但出现了1004错误,我不知道如何继续。我是VBA的新手,因此任何指点都将不胜感激 我看到或可能需要解决的一些问题如下: 错误1004(应用程序定义或对象定义错误)。错误发生在if语句 当我从.xls工作簿中的一行复制数据时,它会填充数据 为新的.xlsm工作簿增加两行(故意)。因此我需要 能够在每次复制数据时容纳一个额外的行。这就是

我试图循环浏览.xls工作簿的一列。该列的每一行都有需要复制到新的.xlsm工作簿的数据,同时自动生成我创建的字符串(名称、说明等)。我尝试了下面列出的解决方案,但出现了1004错误,我不知道如何继续。我是VBA的新手,因此任何指点都将不胜感激

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

  • 错误1004(应用程序定义或对象定义错误)。错误发生在if语句<.范围(单元格((x+1)等)内>
  • 当我从.xls工作簿中的一行复制数据时,它会填充数据 为新的.xlsm工作簿增加两行(故意)。因此我需要 能够在每次复制数据时容纳一个额外的行。这就是为什么我 在for循环中设置x=x+1
  • 对于.xls工作簿行中的某些数据 通过复制,他们有2到3条数据需要解析 分为2的子集。因此,对于工作簿的大多数部分,它都是1条数据 在新文档中,它会变成两行,但是如果是两个 数据>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
subtestthis()
将wb设置为工作簿
作为整数的Dim x
Application.ScreenUpdating=False
设置wb=Workbooks.Open(“C:\Users\blah\Documents\blah\Week 02\old file.xls”,True,True)
使用此工作簿。工作表(“模板”)
NumRows=wb.Sheets(1).Range(“T9:T1116”).Rows.Count
范围(“T9:T1116”)。选择
对于x=1到NumRows
如果是ActiveCell.Formula“”,则
.Range(单元格(x,2)).Formula=“字段1”
.Range(单元格(x,5)).Formula=“字段2”
.Range(单元格(x,7)).Formula=“此处有一个句子,但已被替换”
.Range(单元格(x,9)).Formula=“1”
.Range(单元格(x,10)).Formula=“诸如此类的数据”
.Range(单元格(x,11)).Formula=“更多数据”
.范围(单元格((x+1),9))。公式=“2”
.Range(单元格((x+1),10)).Formula=“+ActiveCell.Formula+中的数据存储在blah中”
.Range(单元格((x+1),11)).Formula=“数据存储在blah中”
如果结束
x=x+1
ActiveCell.Offset(1,0)。选择
下一个
以
wb.关闭错误
设置wb=Nothing
Application.ScreenUpdating=True
端接头

首先,我不会奇怪地遍历列中的所有单元格。在vba中获取数据,然后在那里循环和操作。例如

Dim aInVar As Variant

'This captures all the data inside an input variant in one hit
aInVar = Sheets(1).Range("T9:T1116")
您还可以创建输出变量,以便在解析输入变量时将内容传递到其中:

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
最后,您只需输出在一次点击中创建的输出变量:

Sheets(2).Range(Cells(1, 1), Cells(UBound(aOutVar, 1), 1)) = aOutVar
在vba中处理数据比在运行过程中循环和测试单元格快数英里,而且更容易控制对其所做的操作。此外,当我看到人们使用“选择”/“激活”在单元格中循环时,会显示我的OCD:)


所有这些都没有经过测试,但希望足够让您使用另一种方法。

首先,我不会奇怪地遍历列中的所有单元格。在vba中获取数据,然后从那里循环和操作。例如

Dim aInVar As Variant

'This captures all the data inside an input variant in one hit
aInVar = Sheets(1).Range("T9:T1116")
您还可以创建输出变量,以便在解析输入变量时将内容传递到其中:

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
最后,您只需输出在一次点击中创建的输出变量:

Sheets(2).Range(Cells(1, 1), Cells(UBound(aOutVar, 1), 1)) = aOutVar
在vba中处理数据比在运行过程中循环和测试单元格快数英里,而且更容易控制对其所做的操作。此外,当我看到人们使用“选择”/“激活”在单元格中循环时,会显示我的OCD:)


这些都没有经过测试,但希望足以让您使用不同的方法。

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

参考资料:

基本上,您可以使用ADO和OLE DB Jet驱动程序连接到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
接下来,现在您有了an,您可以使用它来创建:

N.B请注意[SHEET NAME$]-每个工作表都是一个表

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

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


打开记录集后,可以使用的方法一步将记录集转储到目标工作表的单元格中,为什么不使用ADO并将源数据表视为db表呢。这将完全避免循环,并且您仍然可以自动生成字符串

参考资料:

基本上,您可以使用ADO和OLE DB Jet驱动程序连接到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
接下来,现在您有了an,您可以使用它来创建:

N.B请注意[SHEET NAME$]-每个工作表都是一个表

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

或者,您可以将数据转储到中,然后使用VBA以编程方式为数百行或多次行添加公式