Как я могу уменьшить / сжать этот повторяющийся код VBA? - PullRequest
1 голос
/ 06 июля 2019

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

Я понимаю основы циклов, но не понимаю, как применить это к моему коду.Это может быть из-за того, что я не понимаю продвинутую логику или из-за того, что мне трудно определить шаблоны в моем коде, которые помогут мне понять, как написать цикл.

Вот два примера изчасть очень, очень длинного кода).

Пример 1: Использование COUNTIFS из рабочей книги (datafile17) для заполнения значений в ячейках другой рабочей книги / рабочего листа (Raw17).

Dim datafile17 As Workbook
Set datafile17 = Workbooks("WorkbookName")

'First Set
 Dim EU3 As Range, EU4 As Range, EU5 As Range, EU6 As Range, EU7 As Range, EU8 As Range
    Set EU3 = Raw17.Range("F2")
    Set EU4 = Raw17.Range("F3")
    Set EU5 = Raw17.Range("F4")
    Set EU6 = Raw17.Range("F5")
    Set EU7 = Raw17.Range("F6")
    Set EU8 = Raw17.Range("F7")

    datafile17.Activate
       EU3 = Application.WorksheetFunction.CountIfs(Range("X:X"), "U", Range("C:C"), school, Range("J:J"), 3)
       EU4 = Application.WorksheetFunction.CountIfs(Range("X:X"), "U", Range("C:C"), school, Range("J:J"), 4)
       EU5 = Application.WorksheetFunction.CountIfs(Range("X:X"), "U", Range("C:C"), school, Range("J:J"), 5)
       EU6 = Application.WorksheetFunction.CountIfs(Range("X:X"), "U", Range("C:C"), school, Range("J:J"), 6)
       EU7 = Application.WorksheetFunction.CountIfs(Range("X:X"), "U", Range("C:C"), school, Range("J:J"), 7)
       EU8 = Application.WorksheetFunction.CountIfs(Range("X:X"), "U", Range("C:C"), school, Range("J:J"), 8)

'Second Set
 Dim EAB3 As Range, EAB4 As Range, EAB5 As Range, EAB6 As Range, EAB7 As Range, EAB8 As Range
    Set EAB3 = Raw17.Range("E2")
    Set EAB4 = Raw17.Range("E3")
    Set EAB5 = Raw17.Range("E4")
    Set EAB6 = Raw17.Range("E5")
    Set EAB7 = Raw17.Range("E6")
    Set EAB8 = Raw17.Range("E7")

     datafile17.Activate
       EAB3 = Application.WorksheetFunction.CountIfs(Range("X:X"), "AB", Range("C:C"), school, Range("J:J"), 3)
       EAB4 = Application.WorksheetFunction.CountIfs(Range("X:X"), "AB", Range("C:C"), school, Range("J:J"), 4)
       EAB5 = Application.WorksheetFunction.CountIfs(Range("X:X"), "AB", Range("C:C"), school, Range("J:J"), 5)
       EAB6 = Application.WorksheetFunction.CountIfs(Range("X:X"), "AB", Range("C:C"), school, Range("J:J"), 6)
       EAB7 = Application.WorksheetFunction.CountIfs(Range("X:X"), "AB", Range("C:C"), school, Range("J:J"), 7)
       EAB8 = Application.WorksheetFunction.CountIfs(Range("X:X"), "AB", Range("C:C"), school, Range("J:J"), 8)

'I have 18 more of these sets. Then I repeat the whole thing twice more with datafile18/Raw18 and datafile19/Raw19 respectively. 

Пример 2 : Каждый блок циклически переходит по вкладкам в другой рабочей книге (data17), вставляя значение определенной ячейки в другую рабочую книгу / рабочую таблицу (обзор).

data17.Activate
'For Column D(4)
Overview.Range("B3") = Application.VLookup(fullschcode, G3.Range("A1:AA150"), 4, False)
Overview.Range("B7") = Application.VLookup(fullschcode, G4.Range("A1:AA150"), 4, False)
Overview.Range("B11") = Application.VLookup(fullschcode, G5.Range("A1:AA150"), 4, False)
Overview.Range("B15") = Application.VLookup(fullschcode, G6.Range("A1:AA150"), 4, False)
Overview.Range("B19") = Application.VLookup(fullschcode, G7.Range("A1:AA150"), 4, False)
Overview.Range("B23") = Application.VLookup(fullschcode, G8.Range("A1:AA150"), 4, False)


'For column J (10)
Overview.Range("E3") = Application.VLookup(fullschcode, G3.Range("A1:AA150"), 10, False)
Overview.Range("E7") = Application.VLookup(fullschcode, G4.Range("A1:AA150"), 10, False)
Overview.Range("E11") = Application.VLookup(fullschcode, G5.Range("A1:AA150"), 10, False)
Overview.Range("E15") = Application.VLookup(fullschcode, G6.Range("A1:AA150"), 10, False)
Overview.Range("E19") = Application.VLookup(fullschcode, G7.Range("A1:AA150"), 10, False)
Overview.Range("E23") = Application.VLookup(fullschcode, G8.Range("A1:AA150"), 10, False)

'This one has way less repetition than my first example, but I still have 8 total sets of this type.

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

Другие примечания:

  1. "fullschcode" и "school" - это переменные, которые я назначаю ранее в коде, используя поле ввода в зависимости от школы, для которойМне нужны данные.
  2. Я заметил на форуме, что многие из вас могут подумать, что использование COUNTIFS и VLOOKUP - плохой способ решения некоторых задач.Хотя я открыт для предложений по улучшению этих функций, сейчас меня больше всего беспокоит повторение.Я пошел с функциями COUNTIFS и VLOOKUP, потому что я их понимаю.Кто-то ранее предлагал мне запустить все эти данные через Access, и, хотя я ценю это предложение и хочу учиться, мне приходится сопоставлять кривую обучения с тем, когда мне нужны данные.Мой отдел ранее делал все это вручную, используя печатные сводные таблицы и вручную вводя числа. Сравнительно, я стараюсь сделать эти процессы более эффективными.

1 Ответ

3 голосов
/ 06 июля 2019

Вот один из способов для вашего первого сета:

С учетом этих деклараций:

Dim datafile17 As Workbook, datafile17WS As Worksheet
Dim myWB As Workbook, myWS As Worksheet
Dim I As Long

Set datafile17 = Workbooks("workbookName")
Set datafile17WS = datafile17.Worksheets("worksheetname")
Set myWB = ThisWorkbook
Set myWS = myWB.Worksheets("Raw17")

Вы можете уменьшить свой первый набор до цикла.

'First Set
With datafile17WS
    For I = 2 To 7
        myWS.Cells(I, 6) = Application.WorksheetFunction.CountIfs(.Range("X:X"), "U", .Range("C:C"), school, .Range("J:J"), I + 1)
    Next I
End With

Обратите внимание, что, как уже неоднократно упоминалось, метод Activate не нужен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...