【发布时间】:2020-01-27 14:00:07
【问题描述】:
爆炸线:
Size_1_Orig = WorksheetFunction.CountA(Worksheets("Vo").Columns(Column_Name_1_Orig)) - 1
代码的目的是比较两个具有相似信息的相似电子表格,一个是去年的,另一个是今年的。我预计这是每年都会发生的事情,所以我试图以一种方式来编写它,以预测我将来可能会遇到不同文件名、文件类型和用户输入的任何问题,但我离题了。
电子表格会过滤相关的列,以减少数组的大小。过滤后,它会获取两个比较列(“Mon From Bus Num”和“Con1 From Bus Num”)并从上一年提取 cmets 并将这些 cmets 粘贴到当前年份的电子表格中。 我也不确定数组中的过滤/可见信息是否正常工作,还没有测试它
我正在尝试调整动态数组的大小。我在一个更简单的设置上工作,但是当我将代码转换为使用更复杂的电子表格时,它给了我类型不匹配错误。我正处于调试阶段,所以代码中可能还有更多我尚未解决的错误。
任何帮助将不胜感激。在编码方面,我是一个新手,并且还会采取任何指针来提高我的代码效率。
完整代码(到目前为止)
Option Explicit
Global Username As String
Global ComboBox1 As String
Global ComboBox2 As String
Global WorkSh As Worksheet
Global FilterRow As Variant
Private Sub Test_Array()
'
' Test_Array Macro
'
Dim Size_1_Orig As Integer
Dim Size_2_Orig As Integer
Dim Size_3_Orig As Integer
Dim Size_1_Comp As Integer
Dim Size_2_Comp As Integer
Dim Size_3_Comp As Integer
Dim i_Orig As Integer
Dim i_Comp As Integer
Dim Column_Name_1_Orig As String
Dim Column_Name_2_Orig As String
Dim Column_Name_3_Orig As String
Dim Column_Name_1_Comp As String
Dim Column_Name_2_Comp As String
Dim Column_Name_3_Comp As String
Dim Array_1_Orig() As String
Dim Array_2_Orig() As String
Dim Array_3_Orig() As String
Dim Array_1_Comp() As String
Dim Array_2_Comp() As String
Dim Array_3_Comp() As String
Dim path As String
Column_Name_1_Orig = "Mon From Bus Num"
Column_Name_2_Orig = "Con1 From Bus Num"
Column_Name_3_Orig = "TP Comments"
Column_Name_1_Comp = "Mon From Bus Num"
Column_Name_2_Comp = "Con1 From Bus Num"
Column_Name_3_Comp = "TP Comments"
'Get the window username so that the program can be installed on any users desktop
Username = Environ$("username")
''''KEEP''''
''''KEEP'''' ComboBox1 = Compare.ComboBox1.Value
''''KEEP'''' ComboBox2 = Compare.ComboBox2.Value
''''KEEP''''
''''KEEP'''' 'close Userform
''''KEEP'''' Unload Compare_ITP_P3_Files
'----------------------------------------------------------------------------------------------------------------------
''''' FOR TESTING PURPOSES TO BYPASS THE USERFORM '''''
ComboBox1 = "2019.xlsx"
ComboBox2 = "2020.xlsx"
''''' FOR TESTING PURPOSES TO BYPASS THE USERFORM '''''
'----------------------------------------------------------------------------------------------------------------------
'----Open Wordbook-----
Call Open_Workbook_Orig
Sheets("Vo").Select
Range("A1").Select
'------------------------------ Find Original spreadsheet values & place them in an array ----------------------------------
'Arrays start counting at 0
Size_1_Orig = WorksheetFunction.CountA(Worksheets("Vo").Columns(Column_Name_1_Orig)) - 1
Size_2_Orig = WorksheetFunction.CountA(Worksheets("Vo").Columns(Column_Name_2_Orig)) - 1
Size_3_Orig = WorksheetFunction.CountA(Worksheets("Vo").Columns(Column_Name_3_Orig)) - 1
ReDim Array_1_Orig(Size_1_Orig)
ReDim Array_2_Orig(Size_2_Orig)
ReDim Array_3_Orig(Size_3_Orig)
For i_Orig = 0 To Size_1_Orig
Array_1_Orig(i_Orig) = Cells(i_Orig + 1, Column_Name_1_Orig).Value
' Debug.Print Array_1_Orig(i_Orig)
Next i_Orig
For i_Orig = 0 To Size_2_Orig
Array_2_Orig(i_Orig) = Cells(i_Orig + 1, Column_Name_2_Orig).Value
' Debug.Print Array_2_Orig(i_Orig)
Next i_Orig
For i_Orig = 0 To Size_3_Orig
Array_3_Orig(i_Orig) = Cells(i_Orig + 1, Column_Name_3_Orig).Value
' Debug.Print Array_3_Orig(i_Orig)
Next i_Orig
'------------------------------ Find Compare spreadsheet values & place them in an array ----------------------------------
Call Open_Workbook_Comp
Sheets("Vo").Select
Range("A1").Select
Size_1_Comp = WorksheetFunction.CountA(Worksheets("Vo").Columns(Column_Name_1_Comp)) - 1
Size_2_Comp = WorksheetFunction.CountA(Worksheets("Vo").Columns(Column_Name_2_Comp)) - 1
Size_3_Comp = WorksheetFunction.CountA(Worksheets("Vo").Columns(Column_Name_3_Comp)) - 1
ReDim Array_1_Comp(Size_1_Comp)
ReDim Array_2_Comp(Size_2_Comp)
ReDim Array_3_Comp(Size_3_Comp)
For i_Comp = 0 To Size_1_Comp
Array_1_Comp(i_Comp) = Cells(i_Comp + 1, Column_Name_1_Comp).Value
' Debug.Print Array_1_Comp(i_Comp)
Next i_Comp
For i_Comp = 0 To Size_2_Comp
Array_2_Comp(i_Comp) = Cells(i_Comp + 1, Column_Name_2_Comp).Value
' Debug.Print Array_2_Comp(i_Comp)
Next i_Comp
For i_Comp = 0 To Size_3_Comp
Array_3_Comp(i_Comp) = Cells(i_Comp + 1, Column_Name_3_Comp).Value
' Debug.Print Array_3_Comp(i_Comp)
Next i_Comp
'------------------------------ Compare both arrays ----------------------------------
Sheets("Vo").Select
Range("A2").Select
For i_Orig = 0 To Size_1_Comp
If Array_1_Orig(i_Orig) = Array_1_Comp(i_Orig) And Array_2_Orig(i_Orig) = Array_2_Comp(i_Orig) Then
Cells(i_Orig + 1, Column_Name_3_Comp).Value = Array_3_Orig(i_Orig)
End If
On Error Resume Next
Next i_Orig
'
End Sub
Private Sub Open_Workbook_Orig()
Dim strBookName As String
Dim wb As String
Dim path As String
path = "C:\Users\" & Username & "\Desktop\P3 output\"
wb = ComboBox1
strBookName = ComboBox1
If BookOpen(strBookName) Then
Application.WindowState = xlNormal
Windows(ComboBox1).Activate
Application.WindowState = xlMaximized
Set WorkSh = Sheets("Vo")
WorkSh.Activate
''''
''''
'''' ----------**************** The line below might bomb out if all filters are already open, haven't tested ****************----------
''''
''''
ActiveSheet.ShowAllData ' --------- opens all the filters
FilterRow = Rows("1:1").Find(What:="Run Type", lookat:=xlWhole).Column ' --------- Filter Columns
WorkSh.UsedRange.AutoFilter Field:=FilterRow, Criteria1:="P3" ' --------- Filter Columns
FilterRow = Rows("1:1").Find(What:="TP Comments", lookat:=xlWhole).Column ' --------- Filter Columns
WorkSh.UsedRange.AutoFilter Field:=FilterRow, Criteria1:="<>" ' --------- Filter Columns
Else
Workbooks.Open path & wb
Application.WindowState = xlMaximized
Sheets("Vo").Select
ActiveSheet.ShowAllData ' --------- opens all the filters
FilterRow = Rows("1:1").Find(What:="Run Type", lookat:=xlWhole).Column ' --------- Filter Columns
WorkSh.UsedRange.AutoFilter Field:=FilterRow, Criteria1:="P3" ' --------- Filter Columns
FilterRow = Rows("1:1").Find(What:="TP Comments", lookat:=xlWhole).Column ' --------- Filter Columns
WorkSh.UsedRange.AutoFilter Field:=FilterRow, Criteria1:="<>" ' --------- Filter Columns
End If
End Sub
Private Sub Open_Workbook_Comp()
Dim strBookName As String
Dim wb As String
Dim path As String
path = "C:\Users\" & Username & "\Desktop\P3\"
wb = ComboBox2
strBookName = ComboBox2
If BookOpen(strBookName) Then
Application.WindowState = xlNormal
Windows(ComboBox2).Activate
Application.WindowState = xlMaximized
Sheets("Vo").Select
ActiveSheet.ShowAllData ' --------- opens all the filters
FilterRow = Rows("1:1").Find(What:="Run Type", lookat:=xlWhole).Column ' --------- Filter Columns
WorkSh.UsedRange.AutoFilter Field:=FilterRow, Criteria1:="P3"
FilterRow = Rows("1:1").Find(What:="TP Comments", lookat:=xlWhole).Column
WorkSh.UsedRange.AutoFilter Field:=FilterRow, Criteria1:="<>"
Else
Workbooks.Open path & wb
Application.WindowState = xlMaximized
Sheets("Vo").Select
ActiveSheet.ShowAllData ' --------- opens all the filters
FilterRow = Rows("1:1").Find(What:="Run Type", lookat:=xlWhole).Column ' --------- Filter Columns
WorkSh.UsedRange.AutoFilter Field:=FilterRow, Criteria1:="P3" ' --------- Filter Columns
FilterRow = Rows("1:1").Find(What:="TP Comments", lookat:=xlWhole).Column ' --------- Filter Columns
WorkSh.UsedRange.AutoFilter Field:=FilterRow, Criteria1:="<>" ' --------- Filter Columns
End If
End Sub
Function BookOpen(strBookName As String) As Boolean
Dim oBk As Workbook
On Error Resume Next
Set oBk = Workbooks(strBookName)
On Error GoTo 0
If oBk Is Nothing Then
BookOpen = False
Else
BookOpen = True
End If
End Function
【问题讨论】:
-
该列是命名范围吗?使用
Range而不是Columns。 -
另外,不要使用
Integer、useLong。
标签: excel vba type-mismatch