Vba for i循环中的运行时错误13,该循环过去正常工作
背景: 我想根据第7行中是否有x隐藏工作表中的列。x不是键入的,而是通过公式填写的 我在另一个工作表中使用了下面的代码。我唯一更改的是子对象、工作表和行的名称(7而不是5) 但是,每当我尝试从vba编辑器手动运行此子项作为测试时,它都会产生运行时错误13(类型不匹配) 我的问题: 为什么上面的代码会产生运行时错误13,我需要更正什么?这里是: 请注意,它在没有Vba for i循环中的运行时错误13,该循环过去正常工作,vba,excel,runtime-error,Vba,Excel,Runtime Error,背景: 我想根据第7行中是否有x隐藏工作表中的列。x不是键入的,而是通过公式填写的 我在另一个工作表中使用了下面的代码。我唯一更改的是子对象、工作表和行的名称(7而不是5) 但是,每当我尝试从vba编辑器手动运行此子项作为测试时,它都会产生运行时错误13(类型不匹配) 我的问题: 为什么上面的代码会产生运行时错误13,我需要更正什么?这里是: 请注意,它在没有dimws的情况下工作,但我认为在使用前对变量进行尺寸标注是一个很好的做法 如果有人能让我知道为什么没有必要在这里Dim ws,这将消除我
dimws
的情况下工作,但我认为在使用前对变量进行尺寸标注是一个很好的做法
如果有人能让我知道为什么没有必要在这里Dim ws
,这将消除我头脑中的一些疑虑
Sub hidCol2()
Dim i As Long
Dim ws As Worksheet 'As Suggested by @eirikdaude but I don't know why it worked without it as well (Tested on a workbook with a single worksheet)
Application.ScreenUpdating = False
Set ws = ThisWorkbook.Worksheets("Zeitplan")
ws.Activate
ws.Cells.EntireColumn.Hidden = False
For i = ws.Cells(7, Columns.Count).End(xlToLeft).Column To 1 Step -1
If Trim(ws.Cells(7, i).Text) = "x" Then ws.Cells(7, i).EntireColumn.Hidden = True
Next i
Application.ScreenUpdating = True
End Sub
尝试
If trim(str(Cells(7,i))=“x”然后或者If Cells(7,i)。Value=“x”然后您需要告诉我们是哪行代码导致了错误?尝试If trim(Cells(7,i)。Text)=“x”然后是Cells(7,i).entireclumn.Hidden=True
更改到该行肯定会起作用您没有标注ws
,并且您没有限定for循环的单元格和列正在处理的工作表,但除此之外,我没有看到任何会在代码中引起错误的内容(在一个名为“Zeitplan”)。我提到的后一个问题可能会导致它。@Santosh你的话行得通,如果你给出答案,我会把它标记为解决方案。如果你把选项显式
放在(每个)的顶部模块,那么您需要有Dim
语句。强烈建议您始终将Option Explicit
放在模块顶部,因为他没有Option Explicit
。严格地说,如果没有,永远不需要对变量进行调暗,并关闭Option Explicit,编译器只需在遇到变量时创建变量。如果您想对option explicit进行更深入的解释,以及为什么很容易忽略它会导致头痛,这可能会成为一个不错的新问题,尽管已经有一些相当类似的问题:如果您能详细说明为什么比较会失败,因为点击周围的空格,我会觉得很有趣。我确实觉得比较失败有点奇怪。@eirikdaude比较没有失败,不管有没有失败。之前的比较失败是因为有尾随空格或前导空格以及字符x
,因此trim删除并获取文本o仅从该范围内的每个单元格进行比较。然后比较应返回false,而不是返回运行时错误。
Sub hidCol2()
Dim i As Long
Dim ws As Worksheet 'As Suggested by @eirikdaude but I don't know why it worked without it as well (Tested on a workbook with a single worksheet)
Application.ScreenUpdating = False
Set ws = ThisWorkbook.Worksheets("Zeitplan")
ws.Activate
ws.Cells.EntireColumn.Hidden = False
For i = ws.Cells(7, Columns.Count).End(xlToLeft).Column To 1 Step -1
If Trim(ws.Cells(7, i).Text) = "x" Then ws.Cells(7, i).EntireColumn.Hidden = True
Next i
Application.ScreenUpdating = True
End Sub