我正在尝试更好地学习 Excel 中的 VBA 编码。最近,我一直在努力弄清楚如何将简单的 VBA 代码应用到非常大的工作表上。这个想法是,下面使用的“我的 Portfolio.xlsx”文件名最终将成为一个变量,这样我就可以在任何可以工作的工作表上运行代码,而不必将宏单独复制粘贴到每个工作表中。
我正在尝试做两件简单的事情,其中一件可以工作,而另一件却给了我一个我无法弄清楚的 1004 错误。
1 - 将文本列转换为数字数据类型
Sub ConvertTextToNumber()
Workbooks("My Portfolio.xlsx").Sheets("Sheet1").Range("A2:A9999").NumberFormat = "General"
End Sub
这个我工作得很好。即使我将文件名更改为不同的文件名也能完美运行。所以我认为一般格式应该是正确的。
2 - 将第一列(带标题)从小到大排序
Sub SortSmallestToLargest()
Workbooks("My Portfolio.xlsx").Sheets("Sheet1").Range("A2:BT9999").Sort Key1:=Range("A:A"), Order1:=xlAscending
End Sub
这个我不能上班。我多次调整了排序部分,将范围从“A:A”更改为“A”到“A2”,但它们都不起作用。我也试过说 Header=Yes 或 Header=No,但它总是出错。可悲的是,excel 不提供调试,因此它不会给我任何关于究竟是什么失败的信息。只是'运行时错误'1004':应用程序定义或对象定义的错误'。我对该错误的其他搜索通常是指给它越界范围或其他东西,但上面代码中的所有内容都应该没问题...
我认为问题是在“排序”部分开始后出现的,但无论我更改或删除什么,我都无法正确地对“A”列进行排序。
有人对我做错了什么有任何想法吗?
答案 0 :(得分:0)
试试这个:
Sub SortSmallestToLargest()
Workbooks("My Portfolio.xlsx").Sheets("Sheet1").Range("A2:BT9999").Sort Key1:=Workbooks("My Portfolio.xlsx").Sheets("Sheet1").Range("A:A"), Order1:=xlAscending
End Sub
或者更易读:
Sub SortSmallestToLargest()
with Workbooks("My Portfolio.xlsx").Sheets("Sheet1")
.Range("A2:BT9999").Sort Key1:= .Range("A:A"), Order1:=xlAscending
end with
End Sub
注意,您需要在 .Range() 赋值中使用点。我只是被那个绊倒了。
答案 1 :(得分:0)
如果我理解正确,您的目标是在任何工作簿上运行宏,而无需将代码复制到该工作簿中。
我发现的两种最佳方法是:
使用您的个人宏工作簿,这是一个始终在后台打开 excel 的工作簿。因此,您可以将代码存储在那里,并且始终可以运行。我通常在我的宏中引用活动工作簿。
将工作簿另存为加载项。
我更喜欢这种方法,因为它允许我共享宏或轻松删除。此外,个人宏工作簿有时会出现异常。
最后,通过从快速访问工具栏激活宏,您可以确保当前活动的工作簿是无人看管的工作簿。