2017-02-28 65 views
1

利用职位here,我能够构建一个VBA宏来比较工作表之间的单元格以适应我的目的。但是,到目前为止,我没有测试它的范围不是从A1开始的。比较工作表之间的单元格,范围不在A1上开始

当给出像B1:X50这样的范围时,我遇到一个问题,即在给定范围的开始处的列为2(B)时,表单数组的列维的LBound为1。这里是我正在使用一个代码的部分:

'Define the range to be checked 
strRangeToCheck = Summary_ws.Range("I2").Value 

'Store the range to be checked on each sheet in an array 
varSheetA = New_Data_ws.Range(strRangeToCheck) 
varSheetB = Old_Data_ws.Range(strRangeToCheck) 

'Clear current highlighted cells on data tabs 
New_Data_ws.Cells.Interior.Color = xlNone 
Old_Data_ws.Cells.Interior.Color = xlNone 

'Initialize counter 
Counter = 0 
Counter_rng.Value = Counter 

For iRow = LBound(varSheetA, 1) To UBound(varSheetA, 1) 
    For iCol = LBound(varSheetA, 2) To UBound(varSheetA, 2) 
     On Error GoTo Err_Handler 
     If IsError(New_Data_ws.Cells(iRow, iCol).Value) Or IsError(Old_Data_ws.Cells(iRow, iCol).Value) Then 
      Counter = Counter + 1 
      Error_Flag = True 
      Call Flag_Changes 
     ElseIf varSheetA(iRow, iCol) = varSheetB(iRow, iCol) And _ 
       Len(varSheetA(iRow, iCol)) = Len(varSheetB(iRow, iCol)) Then 
       'Cells are identical and lengths match 
       'Do Nothing 
     Else 'Cells are different 
      Counter = Counter + 1 'increment counter 
      Error_Flag = False 
      Call Flag_Changes 
     End If 
    Next iCol 
Next iRow 

我能够评估strRangeToCheck以确定它是否开始于列A或不是。根据这一决定,是否可以手动设置工作表的LBound以匹配strRangeToCheck中的起始列?

+0

这行会为你创建一个问题,因为它只有一个单元格strRangeToCheck = Summary_ws.Range(“I2”)。Value你的范围总是一个单元格,或者它可能不止一个单元格? – Ibo

+0

该单元格包含用户提供的字符串,如A1:Z100。如果他们提供的范围无效,则会引发错误。 – kschindl

回答

1

在回答“是否可以手动设置工作表的LBound以匹配起始栏”的问题时,答案是否定的。 Range.Value将总是返回一个下限为1的数组 - Excel负责创建返回的数组,并且不能通过VBA更改该行为(即使出于各种其他原因也不希望这样做)。

的解决方案是建立在通过地址作为一个中间步骤Range你拉前.Value的到你的数组:

'Store the range to be checked on each sheet in an array 
Dim newRange As Range 
Dim oldRange As Range 
Set newRange = New_Data_ws.Range(strRangeToCheck) 
Set oldRange = Old_Data_ws.Range(strRangeToCheck) 
varSheetA = newRange.Value 
varSheetB = oldRange.Value 

然后,而不是在循环使用Worksheet.Cells,使用Range.Cells。如果您需要将其转换为工作表编址,则可以从中的,Range中找到A1的偏移量。使用的B1:X50您的例子:

Dim example As Range 
Set example = Sheet1.Range("B1:X50") 
Debug.Print example.Columns(1).Column '<-- column 2 
Debug.Print example.Rows(1).Row   '<-- row 1 

注意,上面的代码,你只使用在同一行的工作表的索引(虽然我不知道你在Call Flag_Changes做什么):

If IsError(New_Data_ws.Cells(iRow, iCol).Value) Or IsError(Old_Data_ws.Cells(iRow, iCol).Value) Then 

根本不需要这样做。 New_Data_ws.Cells(iRow, iCol).ValuevarSheetA(iRow, iCol)完全相同。这就是为什么你把它拉到一个数组中,对吧?只是这种替换该行:

If IsError(varSheetA(iRow, iCol)) Or IsError(varSheetB(iRow, iCol)) Then 

最后,你没有包括iRowiCol的声明,而是由匈牙利命名法判断,如果他们声明为Integer你需要将其更改为Long避免溢出错误。如果他们声明为Long,这又对不使用匈牙利命名法开始与...

+1

感谢您的帮助!我能够得到它的工作。另外,我对匈牙利符号完全无知。也就是说,'iRow'和'iCol'被定义为'Long',但我会更新代码以符合命名标准。我会发布我的更新代码。 – kschindl

0

我不知道这是贯彻落实意见最优雅的方式,另一种说法,但这里的工作码,由于共产国际:

'Store the range to be checked on each sheet in an array 
Set newRange = New_Data_ws.Range(strRangeToCheck) 
Set oldRange = Old_Data_ws.Range(strRangeToCheck) 
varSheetA = newRange.Value 
varSheetB = oldRange.Value 

'Variables used to track difference between array start and given range start 
row_diff = newRange.Rows(1).Row - 1 
col_diff = newRange.Columns(1).Column - 1 

'Loop through given range 
For rngRow = newRange.Rows(1).Row To newRange.Rows.Count + row_diff 
    arrRow = rngRow - row_diff 'increment row of array being evaluated 
    For rngCol = newRange.Columns(1).Column To newRange.Columns.Count + col_diff 
     arrCol = rngCol - col_diff 'increment column of array being evaluated 
     On Error GoTo Err_Handler 
     If IsError(varSheetA(arrRow, arrCol)) Or IsError(varSheetB(arrRow, arrCol)) Then 
      Counter = Counter + 1 
      Error_Flag = True 
      Call Flag_Changes 
     ElseIf varSheetA(arrRow, arrCol) = varSheetB(arrRow, arrCol) And _ 
       Len(varSheetA(arrRow, arrCol)) = Len(varSheetB(arrRow, arrCol)) Then 
       'Cells are identical and lengths match 
       'Do Nothing 
     Else 'Cells are different 
      Counter = Counter + 1 'increment counter 
      Error_Flag = False 
      Call Flag_Changes 
     End If 
    Next rngCol 
Next rngRow 

在我Flag_Changes子,我只是在做这样的事情无论是高亮纸张上不同的细胞,打印该单元的地址,打印每个单元格的值,差异(如果单元格是数字的)。

相关问题