将代码从excel 2010复制到excel 2013,但无法正常工作

时间:2018-07-19 09:20:16

标签: vba

我想在这里解释问题。

我在计算机上的excel vba中编写了一个代码,上面装有excel 2010,然后将相同的代码复制到了另一台具有2013的计算机上。我想指出的是,我检查了我复制的文件,并进行了更改相应的路径。 基本上,我的代码是在一个名为“ FP发票”的工作簿中创建的用户窗体,该工作表从另一个名为“ “客户列表” ”的工作簿中获取数据。

初始化用户表单时,它将打开工作簿“客户列表” 并且还会将组合框行源分配给一个名为“ CustomerName” 的命名范围。

代码如下...当组合框值更改时,它应该从工作簿(客户列表)中获取数据,并将其填写在用户窗体的两个文本框中。

以下是代码:

Private Sub UserForm_Initialize()

'opening the workbook "Customers List"
Workbooks.Open Filename:="C:\Users\Watex\Desktop\Experiment Invoice\Customers List.xlsx"
'Defining ComboBox rowSource
Me.ComboBox1.RowSource = "'Customers List.xlsx'!CustomerName"

End Sub

'Combobox Changes 
Private Sub ComboBox1_Change()

Me.TextBox1.Value = ""
Me.TextBox2.Value = ""

Dim x As Long

Dim lastrow As Long

'I declare a variable named lastrow to get the last row in the range
lastrow = Workbooks("Customers List").Worksheets("Sheet1").Cells(Rows.count, "c").End(xlUp).Row


For x = 1 To lastrow


Select Case Me.ComboBox1

Case [CustomerName].Cells(x, 1)

[CustomerName].Cells(x, 1).Activate

Me.TextBox1.Value = ActiveCell.Offset(0, 1)
Me.TextBox2.Value = ActiveCell.Offset(0, 2)

End Select
Next x

End Sub

CustomerName是我在工作簿(“客户列表”)中命名的动态范围,该范围的右边有客户的“地址”和“ ID”之类的值 然后我让textbox1&textbox2充满了客户的地址和ID 取决于客户名,即组合框的值。

我遇到的问题是“ 下标超出范围”,当我按debug时,以下代码突出显示:

lastrow = Workbooks("Customers List").Worksheets("Sheet1").Cells(Rows.count, "c").End(xlUp).Row

我已经检查了工作簿,工作表和路径的名称,所有内容都是正确的,我想指出的是,当我尝试更改组合框的值时会发生此错误。组合框已采用范围的值。但是由于某种原因,该代码无法正常工作。 我已经尝试删除该变量并输入一个数字,例如x = 1到80 而且有效。

抱歉,您花了太多时间,我是VBA的初学者。我也为我英语不佳表示歉意。

1 个答案:

答案 0 :(得分:0)

您必须在名称中添加扩展名,因此将行更改为

lastrow = Workbooks("Customers List.xlsx").Worksheets("Sheet1").Cells(Rows.count, "c").End(xlUp).Row

但是对于早期版本的Excel来说已经是正确的,因此我怀疑这段代码是否有效。

但是,更好的解决方案是在打开工作簿时将其分配给变量,并在访问工作簿时使用该变量。

Dim wb as workbook
Private Sub UserForm_Initialize()
    'opening the workbook "Customers List"
    set wb = Workbooks.Open("C:\Users\Watex\Desktop\Experiment Invoice\Customers List.xlsx")
    ...
End Sub

Private Sub ComboBox1_Change()
    ...
    lastrow = wb.Worksheets("Sheet1").Cells(Rows.count, "c").End(xlUp).Row
    ...
end sub