2014-01-28 2 views
0

Я хочу выполнить валидацию по итоговым значениям на основной листе. Различные итоговые значения должны совпадать с итогами каждого листа в рабочей книге (сопроводительная документация). Ниже приведен код, в котором я определил переменные для рабочих листов и назвал диапазоны, в которых находится каждая общая сумма. Я хочу построить код, чтобы сделать следующее: Есть ли RecAR = ARbal? Если «Да», то условно форматируйте «ОК» в «Зеленый»; Если нет, то «Разница» и условно формат в Красной Это должно быть сделано для всех сравнений, как так:Подтверждение итоговых итоговых итогов на главном листе для поддержки рабочих листов

RecAR = ARbal 
    RecTB1 = TBbal1 
    RecJE1 = JEnb1 
    RecPP = PPbal 
    RecTB2 = TBbal2 
    RecJE2 = JEnb2 

Мастер листа является «Примирение» лист. Итоговые значения перечислены в столбцах D, E, F, H, I, J и будут находиться в той же строке, где «Grand Total» заполняется в столбце A. В этом примере он расположен на строке 15386, но это будет отличаться от месяца до месяца. Я бы хотел, чтобы валидация была ниже итогов на главной странице сверки.

Sub RecValidation() 
'Goal is to create a validation check to ensure all data transfered from supporting docs to 
'recon template 
' 
'Set up worksheet variables for supporting tabs 
Dim Aged As Worksheet 
Dim TB1 As Worksheet 
Dim TB2 As Worksheet 
Dim JEAR As Worksheet 
Dim JEPP As Worksheet 

Set Aged = Sheets("Aged AR") 
Set TB1 = Sheets("TB 1260 AR") 
Set TB2 = Sheets("TB 2255 Prepaid") 
Set JEAR = Sheets("JEs 1260 AR") 
Set JEPP = Sheets("JEs 2255 Prepaid") 

    'Set up Range variables for the grandtotals for each column with amounts on recon template that come from supporting docs 
    Dim RecAR As Range 
    Dim RecTB1 As Range 
    Dim RecJE1 As Range 
    Dim RecPP As Range 
    Dim RecTB2 As Range 
    Dim RecJE2 As Range 

    Set RecAR = Columns("A").Find("Grand Total", LookAt:=xlPart).Offset(0, 3) 
    Set RecTB1 = RecAR.Offset(0, 1) 
    Set RecJE1 = RecAR.Offset(0, 2) 
    Set RecPP = RecAR.Offset(0, 4) 
    Set RecTB2 = RecAR.Offset(0, 5) 
    Set RecJE2 = RecAR.Offset(0, 6) 

'Set up Range variables for the grandtotals for each supporting document 
Dim ARbal As Range 
Dim PPbal As Range 
Dim TBbal1 As Range 
Dim TBbal2 As Range 
Dim JEnb1 As Range 
Dim JEnb2 As Range 

'The headers may be in a merged cell therefore I'm offsetting a few rows down then using xlDown 
'to get to the row with the total. All supporting documentation will have the totals the next 
'row below the last row of data 
Set ARbal = Aged.Cells.Find("Charges", LookAt:=xlPart).Offset(5, 0).End(xlDown) 
Set PPbal = Aged.Cells.Find("Prepays", LookAt:=xlPart).Offset(5, 0).End(xlDown) 
Set TBbal1 = TB1.Cells.Find("Tenant", LookAt:=xlPart).Offset(5, 0).End(xlDown) 
Set TBbal2 = TB2.Cells.Find("Tenant", LookAt:=xlPart).Offset(5, 0).End(xlDown) 
Set JEnb1 = JEAR.Cells.Find("Net Activity", LookAt:=xlPart).End(xlDown) 
Set JEnb2 = JEPP.Cells.Find("Net Activity", LookAt:=xlPart).End(xlDown) 

ответ

0

Хорошо, я думаю, у меня есть голова, обернутая вокруг того, что вы пытаетесь сделать. Моим первым предложением было бы создать цикл. Я думаю, что это может быть намного более чистым. Чтобы настроить цикл, вы должны использовать Enum, который имеет ending, чтобы определить каждый из ваших диапазонов. Enums просто будут действовать как маска для нашего места в массиве, чтобы код был легче читать, отлаживать и изменять. Это будет выглядеть примерно так ...

Public Enum rangeNames 
    AR = 1 
    TB1 = 2 
    JE1 = 3 
    PP = 4 
    TB2 = 5 
    JE2 = 6 
    [_EndPlaceholder] 
    finalValue = [_EndPlaceholder] - 1 
End Enum 

Итак, теперь вы определяете оба диапазона как диапазон массива. Это станет очевидным, почему, когда мы добираемся до петли. Подумайте о rangeNames.Xs, используемых здесь как маски для чисел. Set recRanges(rangeNames.JE1) - это то же самое, что и у Set recRanges(3).

Dim recRanges() as Range 
Dim balRanges() as Range 
ReDim recRanges(rangeNames.finalValue) 
ReDim balRanges(rangeNames.finalValue) 
Set recRanges(rangeNames.AR) = Columns("A").Find("Grand Total", LookAt:=xlPart).Offset(0,3) 
Set recRanges(rangeNames.TB1) = recRange(rangeNames.AR).Offset(,1) 
Set recRanges(rangeNames.JE1) = recRange(rangeNames.AR).Offset(,2) 
Set recRanges(rangeNames.PP) = recRange(rangeNames.AR).Offset(,4) 
Set recRanges(rangeNames.TB2) = recRange(rangeNames.AR).Offset(,5) 
Set recRanges(rangeNames.JE2) = recRange(rangeNames.AR).Offset(,6) 
Set balRanges(rangeNames.AR) = Aged.Cells.Find("Charges", LookAt:=xlPart).Offset(5, 0).End(xlDown) 
Set balRanges(rangeNames.PP) = Aged.Cells.Find("Prepays", LookAt:=xlPart).Offset(5, 0).End(xlDown) 
Set balRanges(rangeNames.TB1) = TB1.Cells.Find("Tenant", LookAt:=xlPart).Offset(5, 0).End(xlDown) 
Set balRanges(rangeNames.TB2) = TB2.Cells.Find("Tenant", LookAt:=xlPart).Offset(5, 0).End(xlDown) 
Set balRanges(rangeNames.JE1) = JEAR.Cells.Find("Net Activity", LookAt:=xlPart).End(xlDown) 
Set balRanges(rangeNames.JE2) = JEPP.Cells.Find("Net Activity", LookAt:=xlPart).End(xlDown) 

Теперь для магии. Давайте петля эти плохие парни, и сделать наше сравнение

Dim x as Integer 
For x = 1 to rangeNames.finalValue 
    'Let's do a quick check to make sure we haven't missed a range 
    If (recRanges(x) Is Nothing) Or (balRanges(x) Is Nothing) Then 
      MsgBox "Error on the rangeNames Enum with value " + CStr(x) + "." 
      Exit Sub 
    End If 
    'I am just assuming you want your OK/Difference at the following range. 
    'You may have to adjust it if you want it elsewhere 
    Dim resultRange as Range 
    Set resultRange = recRanges(x).Offset(1) 
    If recRanges(x) = balRanges(x) Then 
      resultRange.Value = "OK" 
      resultRange.Interior.Color = RGB(0,255,0) 
    Else 
      resultRange.Value = "Difference" 
      resultRange.Interior.Color = RGB(255,0,0) 
    End If 
Next x 

EDIT в ответ на вопрос в комментариях

Если один из значений является негативом другого, есть два способа справиться с этим. Если ни один из других сравнений не может быть точным отрицательным, то вы бы просто заменить эту линию

If recRanges(x) = balRanges(x) Then 

С этой

If Abs(recRanges(x)) = Abs(balRanges(x)) Then 

Abs() только функция абсолютного значения; он игнорирует отрицательные признаки. Если есть вероятность того, что одна из recRanges и balRanges будет аддитивной, взаимно противоположной, то да, вам нужно будет создать инструкцию IF.

If x = rangeNames.TB2 Then 
     'Let's make sure recRanges and balRanges contain a number 
     If ((IsNumeric(recRanges(x).Value) = False) Or _ 
      (IsNumeric(balRanges(x).Value) = False)) Then 
      MsgBox "Error in TB2 ranges, either the recRange or balRange is not a number." 
      Exit Sub 
     End If 
     If recRanges(x).Value = (-1 * CDbl(balRanges(x).Value)) Then 
      resultRange.Value = "OK" 
      resultRange.Interior.Color = RGB(0,255,0) 
     Else 
      resultRange.Value = "Difference" 
      resultRange.Interior.Color = RGB(255,0,0)   
     End If 
Else 
     If recRanges(x) = balRanges(x) Then 
      resultRange.Value = "OK" 
      resultRange.Interior.Color = RGB(0,255,0) 
     Else 
      resultRange.Value = "Difference" 
      resultRange.Interior.Color = RGB(255,0,0) 
     End If 
End If 
+0

Благодарим за внимание. Это мой первый опыт работы с перечислением, поэтому я не уверен, что мне нужно сделать для выполнения. Нужно ли мне менять свой суб, как частный или публичный, или мне нужно позвонить что-то? – fonzy16

+0

Жаль, что я не был чист. Относитесь к определению Enum как к его новой функции или к югу. Вы должны буквально просто вставить «Public Enum ... End Enum», который у меня выше или ниже существующего Sub. Обычно я использую 'Public Enum ... End Enum'. У меня нет проблем с определением Enum как общего. – DeanBDean

+0

Извиняюсь, но я не уверен в порядке работы. Я предполагаю, что я размещаю Public Enum ...End Enum в начале модуля, тогда у меня должен быть под ним ниже, и я положу определение диапазонов и цикла. Я получаю сообщение об ошибке «sub or function», которое не определяется, когда оно считывает настройки разных диапазонов. Все, что я узнал, было проведено через мое собственное исследование, поэтому такие вещи появятся, и я не уверен, с чего начать. – fonzy16

Смежные вопросы