【问题标题】:With statement produces Run-Time Error 438With 语句产生运行时错误 438
【发布时间】:2020-03-29 17:24:25
【问题描述】:

我明白了

运行时错误“438”
“对象不支持此属性或方法。”

我使用的代码激活了另一个工作簿(Changes_Database Workbook),然后(在 Changes_Database Workbook 中有一个名为 Changes 的工作表>) 代码插入一行并将其他行向下移动,复制下面单元格的格式,然后在日期和时间旁边输入键、部件和流程名称(基本上是描述,不重要)。

下面的代码很慢:

Sub NewPart2()

'Sets Changes_Database as active contents and unprotects

    Set Cd = Workbooks.Open(Filename:="\\FILEPATH\Technology_Changes\Changes_Database_IRR_200-2S_New.xlsm", Password:="Swarf")
    Set Changes = Cd.Sheets("Changes")

Changes.Activate
ActiveSheet.Unprotect "Swarf"

'Selects the 2nd row of the database, which is the row after the headings
ActiveSheet.Rows("2:2").Select

'Inserts a new row and shifts the other rows down
Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromRightOrBelow

'Inputs the key that is being added to the new row
ActiveSheet.Range("A2").Value = Sheet1.Range("H4").Value

'Inputs the part and process name to the new row
ActiveSheet.Range("D2").Value = UCase(Sheet1.Range("E4").Value)
ActiveSheet.Range("E2").Value = Sheet1.Range("E5").Value

'Inputs the date and time for when it was added
ActiveSheet.Range("B2").Value = Now
ActiveSheet.Range("C2").Value = Now
ActiveSheet.Range("C2").NumberFormat = "h:mm:ss AM/PM"
ActiveSheet.Range("B2").NumberFormat = "dd/mm/yyyy"

'On Error Resume Next

            ActiveSheet.Protect "Swarf"
            ActiveWorkbook.Save
            ActiveWorkbook.Close SaveChanges:=True

On Error Resume Next

End Sub

激活另一张工作表需要很长时间才能使该模块执行其功能,因此我尝试了 With 语句,但出现了该错误。

我正在尝试用我的第二个代码提高此代码的速度:(两个代码的屏幕截图也可以在下面找到

Sub NewPart2()

Application.ScreenUpdating = False

Set y = Workbooks.Open(Filename:="\\FILEPATH\Technology_Changes\Changes_Database_IRR_200-2S_New.xlsm", Password:="Swarf")

    With y

      Sheets("Changes").Unprotect "Swarf"

        .Sheets("Changes").Rows("2:2").Select
        'Inserts a new row and shifts the other rows down
        .Sheets("Changes").Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromRightOrBelow

        'Inputs the key that is being added to the new row
        .Sheets("Changes").Range("A2").Value = Sheet1.Range("H4").Value

        'Inputs the part and process name to the new row
        .Sheets("Changes").Range("D2").Value = UCase(Sheet1.Range("E4").Value)
        .Sheets("Changes").Range("E2").Value = Sheet1.Range("E5").Value

        'Inputs the date and time for when it was added
        .Sheets("Changes").Range("B2").Value = Now
        .Sheets("Changes").Range("C2").Value = Now
        .Sheets("Changes").Range("C2").NumberFormat = "h:mm:ss AM/PM"
        .Sheets("Changes").Range("B2").NumberFormat = "dd/mm/yyyy"

      Password = "Swarf"

        .Save
        .Close False

    End With

Application.ScreenUpdating = True

End Sub

【问题讨论】:

  • 不要使用Selection - 你不需要Select。您还缺少Sheets("Changes").Unprotect "Swarf" 前面的句号。
  • ^^^^^^^this may help
  • @BigBen 使用 Select 的替代方法是什么?根据我的理解,我故意省略了 Sheets("Changes").Unprotect "Swarf" 前面的句点,因为它只需要在 with 语句中(我测试过)
  • 没有。句点必​​须在那里。在 with 语句中没有任何意义。它“有效”——不是真的,有一个隐含的ActiveWorkbook——你实际上并没有限定这张表确实在y中。添加句点实际上符合此条件。

标签: excel vba runtime-error with-statement


【解决方案1】:

不要使用(或尝试使用)SelectionWorksheetSheet 没有 Selection 属性。

改变

.Sheets("Changes").Rows("2:2").Select
'Inserts a new row and shifts the other rows down
.Sheets("Changes").Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromRightOrBelow

.Sheets("Changes").Rows("2:2").Insert Shift:=xlDown, CopyOrigin:=xlFormatFromRightOrBelow

旁注,您使用 Sheets("Changes") 的频率如此之高,以至于您可以将其与您的 With...End With 一起使用并节省大量输入。

Set y = Workbooks.Open(Filename:="\\FILEPATH\Technology_Changes\Changes_Database_IRR_200-2S_New.xlsm", Password:="Swarf")

With y.Sheets("Changes")
    .Rows("2:2").Insert Shift:=xlDown, CopyOrigin:=xlFormatFromRightOrBelow
    ' and so on
End With

y.Save
y.Close False

非常重要:通过预先添加句点.,确保您在With...End With 中符合RowsRange 调用。

【讨论】:

  • 好的,我已经做出了建议的更改,我唯一的问题是它在.Save 上给我一个运行时错误,出于某种原因?有什么帮助吗?
  • 那应该是y.Save - 因为它是Workbook.Savey.Close 也一样。查看编辑。
  • 您说得对,感谢您的耐心等待!最后一个问题(如果您知道的话),当我打开第二个工作簿进行检查时,我第一次尝试打开它时,它会自动显示“您提供的密码不正确。验证 CAPS LOCK 键是关闭并确保使用正确的大写”这很奇怪,因为我实际上没有单击或输入任何内容,我什至在第一次尝试时都没有看到密码提示(或者在我关闭它并尝试重新打开之后,我得到了此大写锁定消息然后必须再次单击工作簿才能打开它并获得密码提示)
  • 嗯我不确定,这似乎是一个无关的问题,但仍然是一个肯定的问题。
  • @Handreen Workbooks.Open 函数调用提供了一个硬编码的“Swarf”密码。删除此 Password: "Swarf" 参数,或更改字符串文字以匹配实际密码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多