【问题标题】:Run-time error 1004 using Range in a For loop - VBA Excel Mac在 For 循环中使用 Range 时出现运行时错误 1004 - VBA Excel Mac
【发布时间】:2013-03-18 09:04:57
【问题描述】:

一些上下文: - 我正在建造一张大桌子(1000x1000) - 我想用值 1 填充一些情况 - 我将每个案例的行和列放在单独的工作表中

这是我用来填写表格的代码。如您所见,我在 For 循环中使用 Range。它以前使用较小的数据集。造成麻烦的线路是这一行: Sheets("Feuil1.csv").Cells(rng.Value, rng.Offset(, 1).Value) = "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,但我认为这是正确的路径。或者,也许您会提出其他建议...?

非常感谢您的宝贵时间。 祝你有美好的一天。 尼古拉斯。

【问题讨论】:

  • offset(0,1) - 你缺少 0。你必须像这样设置 mybook:Set mybook = Application.Workbooks.Add
  • 谢谢我。这可能是正确的方式。不幸的是,我不明白 Set 函数在这里的用途。它打开了一个新的工作簿,我不确定我将如何访问工作表“Feuil2”了。它导致我犯了一个不同的错误。运行时错误:-2147352565 (8002000b)。我目前正在研究这个。
  • 您必须为两者创建参考。例如:将工作表 1 调暗为工作表,设置工作表 1 = ThisWorkbook.ActiveWorksheet。我认为您需要停止编码并学习 VBA 基础知识...抱歉,但您似乎对 vba 的知识水平不够,并且您正在尝试做超出您能力范围的事情。
  • 嗯,这可能是真的:D。我相信你同意我无法扩展我以前拥有的宏是一种耻辱。我会努力的。很快就和你谈谈;)
  • 是的,如果您了解一些基础知识,它不会太复杂。继续阅读有关通过 vba 在 excel 中打开、关闭和保存工作簿的信息。这似乎是一个有用的指南zerrtech.com/content/…

标签: macos excel vba


【解决方案1】:

这就是我最终的做法。在编码之前了解有关 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-16
    相关资源
    最近更新 更多