Добрый день! Проблема такая Я делаю график отпусков в экселе. Необходимо создать рейтинговую систему, по которой будет определяться, кто имеет право в "горячее" время имеет право брать отпуск. Каждому дню в году был присвоен свой вес. Коэффициент будет рассчитываться как"10 - сумма коэффициентов дней, в которые человек брал отпуск"
я написал такого рода код, но он не работает.
Люди добрые, помогите пожалуйста. В чем ошибки?
Код выглядит так: [vba]
Код
Sub test2() Dim i1 As Single Dim i2 As Single Dim a1 As Single For i1 = 10 To Cells(5, "B") Step 1 For i2 = 0 To Cells(i1, "D") Step 1 a1 = (WorksheetFunction.Index(Works heets("Лист2").Range("I5:NI5") , WorksheetFunction.Match(Cells( i1, C) + i2, Worksheets("Лист2").Range("I4: NI4"), [1])) + a1) Next Cells(i1, "B") = a1 Next
End Sub
[/vba]
Добрый день! Проблема такая Я делаю график отпусков в экселе. Необходимо создать рейтинговую систему, по которой будет определяться, кто имеет право в "горячее" время имеет право брать отпуск. Каждому дню в году был присвоен свой вес. Коэффициент будет рассчитываться как"10 - сумма коэффициентов дней, в которые человек брал отпуск"
я написал такого рода код, но он не работает.
Люди добрые, помогите пожалуйста. В чем ошибки?
Код выглядит так: [vba]
Код
Sub test2() Dim i1 As Single Dim i2 As Single Dim a1 As Single For i1 = 10 To Cells(5, "B") Step 1 For i2 = 0 To Cells(i1, "D") Step 1 a1 = (WorksheetFunction.Index(Works heets("Лист2").Range("I5:NI5") , WorksheetFunction.Match(Cells( i1, C) + i2, Worksheets("Лист2").Range("I4: NI4"), [1])) + a1) Next Cells(i1, "B") = a1 Next
Здравствуйте ИльяШ. Из описания не доконца понял какой именно результат вам нужен. Очевидные ошибки в когде я подправил, а дальше нужны ваши детали чтоб понять как его доделать [vba]
Код
Sub test2() Dim i1 As Single Dim i2 As Single Dim a1 As Single For i1 = 10 To Cells(5, "B") Step 1 For i2 = 0 To Cells(i1, "D") Step 1 a1 = (WorksheetFunction.Index(Works heets("Лист2").Range("I5:NI5") , _ WorksheetFunction.Match(Cells( i1, C) + i2, Worksheets("Лист2").Range("I4: NI4"), [1])) + a1) Next Cells(i1, "B") = a1 Next End Sub Sub test2_ver2() Dim i1&, i2&, a1! Dim Wk As WorksheetFunction '========================= Set Wk = WorksheetFunction For i1 = 10 To [B5] For i2 = 0 To Cells(i1, "D") a1 = Wk.Index(Sheets("Лист2").Range("I5:NI5"), _ Wk.Match(Cells(i1, "C") + i2, Sheets("Лист2").Range("I4: NI4"), 1) + a1) Next i2 Cells(i1, "B") = a1 Next i1 End Sub
[/vba]
1. В поискпоз третий параметр вы записали [1], это неправильно. Квадратные скобки в VBA тоже самое что двссыл в эксель - преобразует в ссылку адрес записанный текстом 2. В индекс во втором параметре вы прибаляете к поискпоз переменную a1, которая вычесляется этим же индексом в предыдущей петле и является десятичной дробью, а задавать позицию в массиве для индекса можно только целыми числами.
Если не трудно опишите поэтапно, что откуда нужно доставать и какие действия с этой инфой проварачивать
Здравствуйте ИльяШ. Из описания не доконца понял какой именно результат вам нужен. Очевидные ошибки в когде я подправил, а дальше нужны ваши детали чтоб понять как его доделать [vba]
Код
Sub test2() Dim i1 As Single Dim i2 As Single Dim a1 As Single For i1 = 10 To Cells(5, "B") Step 1 For i2 = 0 To Cells(i1, "D") Step 1 a1 = (WorksheetFunction.Index(Works heets("Лист2").Range("I5:NI5") , _ WorksheetFunction.Match(Cells( i1, C) + i2, Worksheets("Лист2").Range("I4: NI4"), [1])) + a1) Next Cells(i1, "B") = a1 Next End Sub Sub test2_ver2() Dim i1&, i2&, a1! Dim Wk As WorksheetFunction '========================= Set Wk = WorksheetFunction For i1 = 10 To [B5] For i2 = 0 To Cells(i1, "D") a1 = Wk.Index(Sheets("Лист2").Range("I5:NI5"), _ Wk.Match(Cells(i1, "C") + i2, Sheets("Лист2").Range("I4: NI4"), 1) + a1) Next i2 Cells(i1, "B") = a1 Next i1 End Sub
[/vba]
1. В поискпоз третий параметр вы записали [1], это неправильно. Квадратные скобки в VBA тоже самое что двссыл в эксель - преобразует в ссылку адрес записанный текстом 2. В индекс во втором параметре вы прибаляете к поискпоз переменную a1, которая вычесляется этим же индексом в предыдущей петле и является десятичной дробью, а задавать позицию в массиве для индекса можно только целыми числами.
Если не трудно опишите поэтапно, что откуда нужно доставать и какие действия с этой инфой проварачиватьZetMenChavo
Сообщение отредактировал ZetMenChavo - Суббота, 27.08.2022, 22:31
Sub test2() Dim i1 As Single Dim i2 As Single Dim a1 As Single For i1 = 10 To Cells(5, "B") If Cells(i1, "C").Value > 0 Then For i2 = 0 To Cells(i1, "D") a1 = WorksheetFunction.Index(Worksheets("Лист2").Range("I5:NI5"), _ Cells(i1, "C") - Worksheets("Лист2").Range("I4") + 1 + i2) + a1 Next Cells(i1, "B") = a1 End If Next End Sub
[/vba]
Вариант без ПОИСКПОЗ()[vba]
Код
Sub test2() Dim i1 As Single Dim i2 As Single Dim a1 As Single For i1 = 10 To Cells(5, "B") If Cells(i1, "C").Value > 0 Then For i2 = 0 To Cells(i1, "D") a1 = WorksheetFunction.Index(Worksheets("Лист2").Range("I5:NI5"), _ Cells(i1, "C") - Worksheets("Лист2").Range("I4") + 1 + i2) + a1 Next Cells(i1, "B") = a1 End If Next End Sub
ИльяШ, попробовал ещё раз разобраться в вашем коде, вроде получилось сделать рабочий. Пишите, то ли он делает что вам нужно [vba]
Код
Sub test2_ver2() Dim i1!, i2!, a1 As Single Dim rn(2) As Range Dim Wk As WorksheetFunction '========================= Set Wk = WorksheetFunction Set rn(1) = Sheets("Лист2").Range("I5:NI5") Set rn(2) = Sheets("Лист2").Range("I4:NI4") On Error GoTo metka '-------------------- For i1 = 10 To Cells(5, "B") a1 = 0 For i2 = 0 To Cells(i1, "D") Set rn(0) = Cells(i1, "C") '---------- a1 = a1 + rn(1).Cells(Wk.Match(rn(0) * 1 + i2, rn(2), 1)) '---------- DoEvents Next i2 Cells(i1, "B") = a1 Next i1 Exit Sub metka: MsgBox "Ошибка" End Sub
[/vba]
ИльяШ, попробовал ещё раз разобраться в вашем коде, вроде получилось сделать рабочий. Пишите, то ли он делает что вам нужно [vba]
Код
Sub test2_ver2() Dim i1!, i2!, a1 As Single Dim rn(2) As Range Dim Wk As WorksheetFunction '========================= Set Wk = WorksheetFunction Set rn(1) = Sheets("Лист2").Range("I5:NI5") Set rn(2) = Sheets("Лист2").Range("I4:NI4") On Error GoTo metka '-------------------- For i1 = 10 To Cells(5, "B") a1 = 0 For i2 = 0 To Cells(i1, "D") Set rn(0) = Cells(i1, "C") '---------- a1 = a1 + rn(1).Cells(Wk.Match(rn(0) * 1 + i2, rn(2), 1)) '---------- DoEvents Next i2 Cells(i1, "B") = a1 Next i1 Exit Sub metka: MsgBox "Ошибка" End Sub
ZetMenChavo, я даже и подумать не мог, что кто-то отзовется. Спасибо большое вам! Я хотел сделать следующее: 1) идет обращение к строке первого сотрудника (лист 1), из которой берется дата начала отпуска. Далее находится эта дата (в 4 строке второго листа) листе и прибавляется ценность этого дня (значение из 5-ой строки второго листа) в значение a1. 2) К дате из предыдущего пункта прибавляется +1 день, и повторяется пункт 1. 3) цикл будет повторяться до тех пор пока количество добавленных дней к дате начала отпуска не совпадет со значением из столбца D (первый лист) 4) по окончанию работы внутреннего цикла, значение a1 записывается в соответствующий столбец B (1 лист) 5) по внешнему циклу происходит переход на строчку ниже к следующему сотруднику до тех пор пока число сотрудников не совпадет со значением в ячейке B5
ZetMenChavo, я даже и подумать не мог, что кто-то отзовется. Спасибо большое вам! Я хотел сделать следующее: 1) идет обращение к строке первого сотрудника (лист 1), из которой берется дата начала отпуска. Далее находится эта дата (в 4 строке второго листа) листе и прибавляется ценность этого дня (значение из 5-ой строки второго листа) в значение a1. 2) К дате из предыдущего пункта прибавляется +1 день, и повторяется пункт 1. 3) цикл будет повторяться до тех пор пока количество добавленных дней к дате начала отпуска не совпадет со значением из столбца D (первый лист) 4) по окончанию работы внутреннего цикла, значение a1 записывается в соответствующий столбец B (1 лист) 5) по внешнему циклу происходит переход на строчку ниже к следующему сотруднику до тех пор пока число сотрудников не совпадет со значением в ячейке B5ИльяШ