#excel #vba
Вопрос:
Пожалуйста, помогите решить мою проблему. Я использую приведенный ниже сценарий, но ничего не получаю в таблице активов..
Sub Dutylist()
Dim dutyTable(1 To 2, 1 To 4) As String
Dim Cyc As Integer, Team As Integer
Dim Svalue As Range, Srange As Range
Dim Result() As String
//Cycle 1
dutyTable(1, 1) = "A,B,C,D,E,F,G"
dutyTable(1, 2) = "D,C,A,B,A,E,D"
dutyTable(1, 3) = "B,A,E,C,B,D,E"
dutyTable(1, 4) = "C,B,C,D,C,A,A"
//Cycle 2
dutyTable(2, 1) = "B,E,D,A,D,B,A"
dutyTable(2, 2) = "B,A,E,C,C,D,B"
dutyTable(2, 3) = "D,C,A,B,B,E,B"
dutyTable(2, 4) = "E,A,B,D,A,C,D"
Cyc = 1
Set Srange = ActiveSheet.Range("a:a")
For Team = 1 To 4
Result = Split(dutyTable(Cyc, Team), ",")
For Each Svalue In Srange
If Svalue = "Team " amp; CStr(Team) Then
Svalue.Offset(0, 1).Resize(, UBound(Result) 1).Value = Result
End If
Next Svalue
Next Team
End Sub
Какие — либо проблемы с моим кодом выше?
Комментарии:
1. Работает для меня, когда у вас на самом деле есть такие значения, как
Team 1
и т.д. в столбце «A:A». Но вы можете захотеть оптимизировать свой цикл, для каждого значения от 1 до 4 вы теперь буквально проходите по каждой ячейке во всем столбце >>>>>>>>>>>>>>> Очень Медленно!
Ответ №1:
Мое понимание выполнения вашего кода должно быть следующим: то, что я изменил, — это переставить Looping
с некоторыми изменениями, а также вы должны set range
ссылаться на последнюю использованную строку, а A:A
не для ускорения выполнения.
В основном код будет соответствовать значению Col A
для команды, если он будет найден, то вернет dutyTable1
значение на основе cycle
предоставленного вами,
Sub Dutylist()
Dim dutyTable(1 To 2, 1 To 4) As String
Dim Cyc As Integer, Team As Integer
Dim Svalue As Range, Srange As Range
Dim Result() As String
Dim i As Long
dutyTable(1, 1) = "A,B,C,D,E,F,G"
dutyTable(1, 2) = "D,C,A,B,A,E,D"
dutyTable(1, 3) = "B,A,E,C,B,D,E"
dutyTable(1, 4) = "C,B,C,D,C,A,A"
dutyTable(2, 1) = "B,E,D,A,D,B,A"
dutyTable(2, 2) = "B,A,E,C,C,D,B"
dutyTable(2, 3) = "D,C,A,B,B,E,B"
dutyTable(2, 4) = "E,A,B,D,A,C,D"
Cyc = 1
Set Srange = ActiveSheet.Range("a1:a20")
For Each Svalue In Srange
For Team = 1 To 4
Result = Split(dutyTable(Cyc, Team), ",")
If InStr(Svalue.Value, Team) > 0 Then
Svalue.Offset(0, 1).Resize(, UBound(Result) 1).Value = Result
End If
Next Team
Next Svalue
End Sub
Вывод (тестируются только 3 команды, могут быть расширены)
Комментарии:
1. Спасибо, что ответили и помогли. Мой код-это поиск и поиск «Команды 1″,»Команды 2», «Команды 3», «Команды 4» из таблицы активов и экспорт рабочей смены в нужную команду
2. drive.google.com/file/d/1RWQfwzbNcE-A01IMAz6F_fzeldFWr-pr/…
3. Как получилось, что ваш результат не соответствует ни одной таблице, которую вы создаете, я не могу понять логику, лежащую в основе… Например, как вы попадаете
B,C,A,E...
в команду 1?4. Извините за мой плохой английский и вашего пациента. Я имею в виду, что каждую неделю я должен запускать новый цикл для обеих 4 команд с заданной рабочей сменой каждый день недели. Найдите местоположение «команда 1» и выведите для него значения таблицы массива dutytable(1,1). Затем найдите «Команду 2» и используйте массив обязательных значений(1,2) на листе, И другие команды также выполнят те же процедуры. Если на следующей неделе я буду использовать массив цикла 2 dutytable(2,1)……. И я могу установить еще 5 дежурных массивов в своей программе.
5. Проверьте мой отредактированный ответ, если вы напишете
Team 1
, тоже будет работать, примите ответ, если поможете 🙂