在For循环中使用范围运行时错误1004 - VBA Excel Mac
问题描述:
一些上下文: - 我建立一个大表(1000x1000) - 我想填写一些值1 - 我有每个这种情况的行和列在一张单独的表格中在For循环中使用范围运行时错误1004 - VBA Excel Mac
这是我用来填充表格的代码。正如你所看到的,我在For循环中使用Range。它以前使用较小的数据集。这是造成麻烦的线是这样的一个: 表( “Feuil1.csv”)细胞(rng.Value,rng.Offset(1)。价值)= “1”
Sub FillEdges()
Dim rng As Range
For Each rng In Sheets("Feuil2").Range("A1:A53498")
Sheets("Feuil1.csv").Cells(rng.Value, rng.Offset(, 1).Value) = "1"
Next rng
End Sub
做一些研究我了解到我可能想暂时保存,关闭并重新打开工作簿。我尝试过,但看起来VBA不考虑“保存,关闭和重新打开”代码。我试图找出一些与此帮助页面:
http://support.microsoft.com/kb/210684/en-us
害得我一个错误91与此代码。错误在第三行。
Sub FillEdges()
Dim rng As Range, mybook As Workbook
mybook.SaveAs "Macintosh HD:Users:Nicolas:test.xslm", FileFormat:=53
For Each rng In Sheets("Feuil2").Range("A1:A53498")
If rng Mod 2500 = 0 Then
mybook.Close SaveChanges:=True
Set mybook = Nothing
Set mybook = Application.Workbooks.Open("Macintosh HD:Users:Nicolas:test.xslm")
End If
Sheets("Feuil1.csv").Cells(rng.Value, rng.Offset(, 1).Value) = "1"
Next rng
End Sub
你知道如何解决这个错误91吗?
所以我不确定这将完全解决错误1004,但我认为这是正确的道路。或者,也许你会建议其他的东西......?
非常感谢您的时间。 祝您有美好的一天。 Nicolas。
答
这是我最终做的。在编码之前学习更多关于VBA的知识是关键!特别是关于打开,保存和关闭文件。
请注意,最后我几乎没有触及上述微软网站的例子。
Sub remplir()
Application.ScreenUpdating = False
Dim rng As Range
Dim worksheet1 As Worksheet
Dim iTemp As Integer
Dim oBook As Workbook
Dim iCounter As Long
Set worksheet1 = ActiveWorkbook.ActiveSheet
iCounter = 1
' Open the new full of zeros workbook:
Application.Workbooks.Open "Macintosh HD:Users:Nicolas:vba:test.xlsm"
Set oBook = ActiveWorkbook
'iTemp = Application.SheetsInNewWorkbook
'Application.SheetsInNewWorkbook = 1
'Set oBook = Application.Workbooks.Add
'Application.SheetsInNewWorkbook = iTemp
' Add a defined name to the workbook
' that RefersTo a range:
oBook.Names.Add Name:="tempRange", _
RefersTo:="=Sheet1!$A$1"
' Save the workbook: (attention extension fausse, mais ça n'empeche rien !)
oBook.SaveAs "Macintosh HD:Users:Nicolas:vba:test.xslm", FileFormat:=53
' Work the sheet in a loop. Eventually,
' you get error 1004: Copy Method of
' Worksheet class failed.
For Each rng In worksheet1.Range("A1:A5038")
If rng.Value > 0 And rng.Row <> 1 Then
If rng.Value <> rng.Offset(-1, 0).Value Then
iCounter = iCounter + 1
End If
End If
Sheets("Feuil1").Cells(iCounter, rng.Offset(0, 1).Value + 1) = "1"
Sheets("Feuil1").Cells(iCounter, 1) = rng.Value
'Uncomment this code for the workaround:
'Save, close, and reopen after every 100 iterations:
If rng Mod 1000 = 0 Then
oBook.Close SaveChanges:=True
Set oBook = Nothing
'(attention extension fausse, mais ça n'empeche rien !)
Set oBook = Application.Workbooks.Open("Macintosh HD:Users:Nicolas:vba:test.xslm")
End If
Next rng
偏移(0,1) - 失踪的youre 0,你必须设置mybook,如:设置mybook = Application.Workbooks.Add – 2013-03-18 09:15:06
感谢mehow。这可能是正确的。 不幸的是,我不明白这里使用的Set函数是什么。它打开一个新的工作簿,我不确定我将如何访问工作表“Feuil2”了。 它引发了我一个不同的错误。运行时错误:-2147352565(8002000b)。 我目前正在研究。 – 2013-03-18 09:41:05
你必须为两者创建一个参考。例如:Dim worksheet1 as Worksheet,Set worksheet1 = ThisWorkbook.ActiveWorksheet。我认为你需要停止编程并学习VBA基础知识...对不起,但是你似乎没有足够的关于vba的知识,并且你试图做一些超出你的能力的东西。 – 2013-03-18 09:47:14