Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Использовании ИНДЕКС и ПОИСКПОЗ в VBA - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Использовании ИНДЕКС и ПОИСКПОЗ в VBA
ИльяШ Дата: Суббота, 27.08.2022, 21:29 | Сообщение № 1
Группа: Пользователи
Ранг: Прохожий
Сообщений: 2
Репутация: 0 ±
Замечаний: 0% ±

Добрый день!
Проблема такая
Я делаю график отпусков в экселе. Необходимо создать рейтинговую систему, по которой будет определяться, кто имеет право в "горячее" время имеет право брать отпуск.
Каждому дню в году был присвоен свой вес.
Коэффициент будет рассчитываться как"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]
К сообщению приложен файл: 5036030.xlsx (39.0 Kb)
 
Ответить
СообщениеДобрый день!
Проблема такая
Я делаю график отпусков в экселе. Необходимо создать рейтинговую систему, по которой будет определяться, кто имеет право в "горячее" время имеет право брать отпуск.
Каждому дню в году был присвоен свой вес.
Коэффициент будет рассчитываться как"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]

Автор - ИльяШ
Дата добавления - 27.08.2022 в 21:29
ZetMenChavo Дата: Суббота, 27.08.2022, 22:27 | Сообщение № 2
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 165
Репутация: 7 ±
Замечаний: 0% ±

Excel 2010
Здравствуйте ИльяШ.
Из описания не доконца понял какой именно результат вам нужен.
Очевидные ошибки в когде я подправил, а дальше нужны ваши детали чтоб понять как его доделать
[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 - Суббота, 27.08.2022, 22:31
 
Ответить
СообщениеЗдравствуйте ИльяШ.
Из описания не доконца понял какой именно результат вам нужен.
Очевидные ошибки в когде я подправил, а дальше нужны ваши детали чтоб понять как его доделать
[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
Дата добавления - 27.08.2022 в 22:27
gling Дата: Суббота, 27.08.2022, 23:34 | Сообщение № 3
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2563
Репутация: 706 ±
Замечаний: 0% ±

2010
Вариант без ПОИСКПОЗ()[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]


ЯД-41001506838083
 
Ответить
СообщениеВариант без ПОИСКПОЗ()[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]

Автор - gling
Дата добавления - 27.08.2022 в 23:34
ZetMenChavo Дата: Воскресенье, 28.08.2022, 01:37 | Сообщение № 4
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 165
Репутация: 7 ±
Замечаний: 0% ±

Excel 2010
ИльяШ, попробовал ещё раз разобраться в вашем коде, вроде получилось сделать рабочий.
Пишите, то ли он делает что вам нужно
[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]
К сообщению приложен файл: 5036030.xlsm (48.4 Kb)


Сообщение отредактировал ZetMenChavo - Воскресенье, 28.08.2022, 06:41
 
Ответить
СообщениеИльяШ, попробовал ещё раз разобраться в вашем коде, вроде получилось сделать рабочий.
Пишите, то ли он делает что вам нужно
[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]

Автор - ZetMenChavo
Дата добавления - 28.08.2022 в 01:37
ИльяШ Дата: Воскресенье, 28.08.2022, 14:24 | Сообщение № 5
Группа: Пользователи
Ранг: Прохожий
Сообщений: 2
Репутация: 0 ±
Замечаний: 0% ±

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

Автор - ИльяШ
Дата добавления - 28.08.2022 в 14:24
ZetMenChavo Дата: Воскресенье, 28.08.2022, 18:27 | Сообщение № 6
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 165
Репутация: 7 ±
Замечаний: 0% ±

Excel 2010
ИльяШ, спасиб за разъяснение. Смог набрасать тот код который вам нужен. Если будут вопросы по какой то его части, пишите, всё объясню :)
К сообщению приложен файл: 111111.xlsm (52.5 Kb)


Сообщение отредактировал ZetMenChavo - Воскресенье, 28.08.2022, 19:47
 
Ответить
СообщениеИльяШ, спасиб за разъяснение. Смог набрасать тот код который вам нужен. Если будут вопросы по какой то его части, пишите, всё объясню :)

Автор - ZetMenChavo
Дата добавления - 28.08.2022 в 18:27
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!