我编写了这段代码,用于分析工作表中导入数据的大小。目标是确定导入数据的最后一行和哪一行,然后选择该范围并将其格式化为表并为其指定名称。听起来很简单,对吧?
当我运行我的代码时,我似乎在我定义要格式化的范围的部分出现错误。我使用变量lCol和lRow作为范围的末尾,代表最后一列和最后一行,如前面的代码中所示。 我得到的错误是:
Run-time error '1004':
Method '_Default' of object 'Range' failed
我真的在每个论坛上挖掘了我能找到的关于这件事的帖子,但我还是没有弄清楚出了什么问题。我也是VBA的新手,请原谅我,如果涉及一个非常简单的解决方案。
整个代码是:
Sub TextBox1_Click()
End Sub
Sub Range_Find_Method_Row()
Worksheets("Copy Quick Report Here").Activate
'Finds the last non-blank row on a sheet/range.
Dim lRow As Long
On Error Resume Next
lRow = Cells.Find(What:="*", _
After:=Range("A1"), _
LookAt:=xlPart, _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious, _
MatchCase:=False).Row
On Error GoTo 0
End Sub
Sub Range_Find_Method_Column()
'Finds the last non-blank row on a sheet/range.
Dim lCol As Long
On Error Resume Next
lCol = Cells.Find(What:="*", _
After:=Range("A1"), _
LookAt:=xlPart, _
LookIn:=xlFormulas, _
SearchOrder:=xlByColumns, _
SearchDirection:=xlPrevious, _
MatchCase:=False).Column
On Error GoTo 0
End Sub
Sub Format_as_Table()
' Format_as_Table Macro
' This Macro formats the imported Quick Report as a table. This creates headers which are necessary for
' the summary calculations.
Sheet1.Activate
Sheet1.Range(Cells(5, 2), Cells(lRow, lCol)).Select %%%%ERROR HERE%%%%%
ActiveSheet.ListObjects.Add(xlSrcRange, Range(Cells(5, 2), Cells(lRow, lCol)), , xlYes).Name = "KPI_Table"
Range("KPI_Table[#All]").Select
ActiveSheet.ListObjects("KPI_Table").TableStyle = "TableStyleLight1"
ActiveWindow.ScrollColumn = 1
End Sub
如果有人可以帮助我,我将非常感激。 问候 D.
答案 0 :(得分:1)
你的问题是你创造了3个不同的子,每个子都彼此独立 您需要了解life cycle and scope of a variable。
话虽如此,您的变量let realm = try! Realm()
override func viewDidLoad() {
super.viewDidLoad()
// retrieve all objects from realm
let readers = realm.objects(Reader)
print(readers)
}
和lrow
在程序lcol
和Range_Find_Method_Row()
完成执行后立即销毁。
您的第三个也是最后一个程序Range_Find_Method_Row()
无法识别。
现在,我们如何让它发挥作用。好吧,第一个答案是在我发布的链接中。您可以将其声明为Format_as_Table()
或我们大多数人称之为(我的错误,全局变量使用 Module-Level
Global Variable
< em>关键字而不是 Public
)。这样,在您调用它的过程之后,您的变量持久化事件将完成执行。像这样:
Dim
Option Explicit
Dim lcol As Long
Dim lrow As Long
Sub Range_Find_Method_Row()
'~~> Notice that I did a little modification here, I'm not a fan of Activate Method
Dim ws As Worksheet
Set ws = Worksheets("Copy Quick Report Here")
On Error Resume Next
lRow = ws.Cells.Find(What:="*", _
After:=ws.Range("A1"), _
LookAt:=xlPart, _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious, _
MatchCase:=False).Row
On Error GoTo 0
End Sub
Sub Range_Find_Method_Column()
Dim ws As Worksheet
Set ws = Worksheets("Copy Quick Report Here")
On Error Resume Next
lCol = ws.Cells.Find(What:="*", _
After:=ws.Range("A1"), _
LookAt:=xlPart, _
LookIn:=xlFormulas, _
SearchOrder:=xlByColumns, _
SearchDirection:=xlPrevious, _
MatchCase:=False).Column
On Error GoTo 0
End
第二个(实际上这应该是第一个)是将所有子组合成一个大程序。我认为你没有理由不想这样做。
第三种情况是,如果您要在代码的其余部分中经常检查最后一行和列,则可能需要使用函数。类似的东西:
Sub Format_as_Table()
'~~> I'm not a fan of select/Activesheet as well, so re-tailored your code a bit
With Sheet1
.ListObjects.Add(xlSrcRange, Range(Cells(5, 2), _
Cells(lRow, lCol)), , xlYes).Name = "KPI_Table"
.ListObjects("KPI_Table").TableStyle = "TableStyleLight1"
With
End Sub
然后您可以在程序中的任何位置使用此功能,如下所示:
Function Range_Find_Last(ws As Worksheet, Optional SearchOrder As XlSearchOrder = xlByRows)
Dim r As Range
On Error Resume Next
Set r = ws.Cells.Find(What:="*", _
After:=ws.[A1], _
LookAt:=xlPart, _
LookIn:=xlFormulas, _
SearchOrder:=SearchOrder, _
SearchDirection:=xlPrevious, _
MatchCase:=False)
On Error GoTo 0
If Not r Is Nothing Then
If SearchOrder = xlByRows Then
Range_Find_Last = r.Row
Else
Range_Find_Last = r.Column
End If
Else
Range_Find_Last = "#Null!"
End If
End Function
这种功能已经有很多变化和/或找到最后一行和列的方法。你可以发现更多。