【问题标题】:Writing a string to a cell in excel将字符串写入excel中的单元格
【发布时间】:2012-07-19 01:54:05
【问题描述】:

我正在尝试将值写入“A1”单元格,但出现以下错误:

应用程序定义或对象定义的错误'1004'

我在网上尝试了很多解决方案,但没有一个有效。我使用的是 excel 2007,文件扩展名为 .xlsm。

我的代码如下:

Sub varchanger()
On Error GoTo Whoa
Dim TxtRng  As Range

Worksheets("Game").Activate
ActiveSheet.Unprotect

Set TxtRng = ActiveWorkbook.Sheets("Game").Cells(1, 1)
TxtRng.Value = "SubTotal"

'Worksheets("Game").Range("A1") = "Asdf"

LetsContinue:
    Exit Sub
Whoa:
    MsgBox Err.number
    Resume LetsContinue
End Sub

编辑:如果我点击警告图标然后选择显示计算步骤它正常工作,则会出现错误

【问题讨论】:

  • 如果我没有缺票,我会为On Error Goto Whoa+1
  • @LittleBobbyTables 谢谢。这个错误真的吓到我了
  • 我对此表示怀疑。我在 Bing 上搜索了您的错误消息,结果发现了各种各样的错误——所有这些都与语法有关。您是否尝试过通过 F8 单步执行代码以查找发生错误的行?有时在 Excel 调试器抛出错误时查看额外的调试信息有助于缩小范围。
  • 尝试声明 TxtRng As Excel.Range 而不仅仅是 Range。如果这不起作用,请尝试Worksheets("Game").Select 而不是Activate。如果这不起作用,请先手动取消保护工作簿/工作表。
  • 您打开了多少文件?就一个?尝试使用工作簿限定所有工作表引用:例如。 Worksheets("Game") 应该是 ThisWorkbook.Worksheets("Game")。然后注释掉错误处理程序并运行它,看看是哪一行的问题。

标签: vba excel excel-2007


【解决方案1】:

我认为您可能会被床单保护绊倒。我稍微简化了您的代码,并明确设置了对工作簿和工作表对象的引用。在您的示例中,您在设置 TxtRng 对象时明确引用了工作簿和工作表,但在取消保护工作表时却没有。

试试这个:

Sub varchanger()

    Dim wb As Workbook
    Dim ws As Worksheet
    Dim TxtRng  As Range

    Set wb = ActiveWorkbook
    Set ws = wb.Sheets("Sheet1")
    'or ws.Unprotect Password:="yourpass"
    ws.Unprotect

    Set TxtRng = ws.Range("A1")
    TxtRng.Value = "SubTotal"
    'http://stackoverflow.com/questions/8253776/worksheet-protection-set-using-ws-protect-but-doesnt-unprotect-using-the-menu
    ' or ws.Protect Password:="yourpass"
    ws.Protect

End Sub

如果我在 ws.Unprotect 注释掉的情况下运行子程序,我会收到运行时错误 1004。(假设我已经保护了工作表并锁定了范围。)取消注释该行允许代码运行良好。

注意事项:

  1. 写入范围后,我正在重新设置工作表保护。如果您首先保护了工作表,我假设您想这样做。如果您稍后在进一步处理后重新设置保护,则需要删除该行。
  2. 我删除了错误处理程序。 Excel 错误消息为您提供了比 Err.number 更多的详细信息。一旦您的代码工作并显示您想要的任何内容,您就可以将其放回原处。显然你也可以使用 Err.Description。
  3. Cells(1, 1) 表示法会引起巨大的痛苦。小心使用它。 Range("A1") 对人类来说更容易解析,并且倾向于防止拍前额错误。

【讨论】:

  • 错误描述是什么? (完整的错误信息,不仅仅是 1004)
  • 应用程序定义或对象定义
【解决方案2】:

我今晚喝了几杯蔓越莓伏特加,所以我可能会漏掉一些东西……设置范围有必要吗?为什么不使用:

Activeworkbook.Sheets("Game").Range("A1").value = "Subtotal"

这也会失败吗?

看起来你尝试了类似的东西:

'Worksheets("Game").Range("A1") = "Asdf"

但是,Worksheets 是一个集合,因此您不能引用“游戏”。我认为您需要改用 Sheets 对象。

【讨论】:

    【解决方案3】:

    替换 范围(“A1”)=“Asdf” 和 Range("A1").value = "Asdf"

    【讨论】:

      【解决方案4】:

      试试这个

      Set TxtRng = ActiveWorkbook.Sheets("Game").Range("A1")

      添加

      可能文件已损坏 - 我以前曾多次遇到过这种情况,唯一的解决方案是将所有内容复制到一个新文件中。

      请您尝试以下方法:

      • 保存一个新的 xlsm 文件并将其命名为“MyFullyQualified.xlsm”
      • 添加没有保护的工作表并将其命名为“mySheet”
      • 向工作簿添加模块并添加以下过程

      这会运行吗?

       Sub varchanger()
      
       With Excel.Application
          .ScreenUpdating = True
          .Calculation = Excel.xlCalculationAutomatic
          .EnableEvents = True
       End With
      
       On Error GoTo Whoa:
      
          Dim myBook As Excel.Workbook
          Dim mySheet As Excel.Worksheet
          Dim Rng  As Excel.Range
      
          Set myBook = Excel.Workbooks("MyFullyQualified.xlsm")
          Set mySheet = myBook.Worksheets("mySheet")
          Set Rng = mySheet.Range("A1")
      
          'ActiveSheet.Unprotect
      
      
          Rng.Value = "SubTotal"
      
          Excel.Workbooks("MyFullyQualified.xlsm").Worksheets("mySheet").Range("A1").Value = "Asdf"
      
      LetsContinue:
              Exit Sub
      Whoa:
              MsgBox Err.Number
              GoTo LetsContinue
      
      End Sub
      

      【讨论】:

      • 经典 - 请关闭 Excel 再打开;甚至可以重新启动你的机器。
      • 关闭 excel 没有帮助。我会尝试重新启动
      • 重启也无济于事
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多