使用宏操作另一个工作表

时间:2021-05-26 07:46:26

标签: excel vba

我正在尝试更好地学习 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”列进行排序。

有人对我做错了什么有任何想法吗?

2 个答案:

答案 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)

如果我理解正确,您的目标是在任何工作簿上运行宏,而无需将代码复制到该工作簿中。

我发现的两种最佳方法是:

  1. 使用您的个人宏工作簿,这是一个始终在后台打开 excel 的工作簿。因此,您可以将代码存储在那里,并且始终可以运行。我通常在我的宏中引用活动工作簿。

  2. 将工作簿另存为加载项。

我更喜欢这种方法,因为它允许我共享宏或轻松删除。此外,个人宏工作簿有时会出现异常。

最后,通过从快速访问工具栏激活宏,您可以确保当前活动的工作簿是无人看管的工作簿。