Здравствуйте, помогите пожалуйста написать код, нужно также что то вроде цикла построить, при нажатии кнопки заполнялось "приложение" информацию для этого нужно брать из "карточки".
В "приложении" дисциплины повторятся не могут, следовательно если в "карточки" несколько в столбце попадаются то запись должна идти только одного.
Еще нужно чтобы часы считал сложением всех повторяющихся дисциплин:)
А Оценка ставилась по последнему семестру, ну если идет несколько дисциплин подряд по семестрам и у всех разные оценки, то запись в "приложение" шла последнего семестра.
Т.е. предыдущие макросы ничему не научили... Алгоритм тут примерно такой же - предметы в словарь, в Item словаря индекс массива, в массиве в одном столбце суммируем часы, в другом пишем текущую оценку по предмету (останется последняя, как и требуется). Ну и в один из столбцов можно писать сам предмет. В итоге чуть подшаманить с выгрузкой, если предметов будет больше, чем строк на первом листе приложения. Но это всё несложно - можно тупо выгружать циклом по массиву. Два цикла - первый с начала массива на первый лист, второй (если значения ещё остались) с середины массива на второй. Не хотите хотя бы начать?
К сожалению полностью разобраться не удалось, завтра, послезавтра последний день сдачи начальству:) нашел ссылку по VBA http://www.on-line-teaching.com/vba/lsn0116.html со сл. недели только начну его изучение с самого начала, если не сложно помогите пожалуйста справится с этой задачей:) буду очень признателен.
Хотя начало сделал. Т.к. оценок нет - то пока беру пустоту из a(i, 14)...
Sub to_pril() Dim a(), i&, ii&, t$, n&
a = Sheets("Карточка").UsedRange.Value ReDim b(1 To UBound(a), 1 To 3)
With CreateObject("Scripting.Dictionary") .CompareMode = 1 For i = 1 To UBound(a) t = a(i, 3) If Len(t) Then If Len(a(i, 13)) Then If IsNumeric(a(i, 13)) Then If Not .exists(t) Then ii = ii + 1 .Item(t) = ii b(ii, 1) = t b(ii, 2) = a(i, 13) b(ii, 3) = a(i, 14) Else n = .Item(t) b(n, 2) = b(n, 2) + a(i, 13) b(n, 3) = a(i, 14) End If End If End If End If Next
End With
'осталось выгрузить массив b 'ну и разобраться с оценками...
Ну если оценки копировать не нужно - тогда препоследней строкой запишите Sheets(3).[b8].Resize(ii, 2) = b А в коде можно убрать импорт оценок. А можно оставить - не мешает. Это так, вариант для примера (только сперва вручную очистите диапазон). А вообще нужно добавить условие, что если ii>чем строк на первом листе, то выгружать по количеству строк, а далее на второй лист циклом остальное. Ну а если меньше - тогда как я написал.
А связи с CommandButton2 никакой нет - тут Вы что-то путаете.. :)
'последний bb(iii, 1) = a(ii, 7) - Fix(cs) * (oDict.Item(Trim(a(ii, 2))) - 1) Else 'не последний bb(iii, 1) = Fix(cs) End If
Else bb(iii, 1) = cs End If '=====================
Next Cells(i, 2).Resize(59, 1) = b Cells(i, 3).Resize(59, 1) = bb Next
End Sub
Работает он ужасно, в столбик огромное количество дисциплин пишет с их же повторением.
Помогите пожалуйста с каким нибудь их двух вариантов:) какой будет по проще:) если первым то хорошо:) если тем что я щас пытаюсь пол дня и ночи сделать но пускай уж сами руками оценки выставляют и в "карте" и в "Приложении":)
60% - это много... Тогда попробуйте понять последний код, от 18.04.2012, 23:50 Там используется всего лишь цикл, массивы (один из данных диапазона и один созданный в коде - используется в паре с словарём), словарь, проверки на длину строки и на число. Ну и выгрузка массива потом ниже отдельно дописана.
Про кнопку: была мысль добавить код на кнопку - но я не нашёл подходящей, поэтому написал код без привязки к кнопке. Можете сами всё, что между Sub to_pril() и End Sub скопировать в код любой кнопки. Или же в коде кнопки написать одну строку: to_pril А код как есть поместить в стандартный модуль (там как раз один пустой заготовлен, хотя код можно добавить в любой модуль).
Ну и перед проверкой работы - очистите место выгрузки (или добавьте этот функционал в начало кода, там что-то похожее помнится уже где-то есть), иначе можете не заметить результат работы.
Пример кода за 19.04.2012, 02:52 сейчас проверить не на чем, так что не прокомментирую. Детали исходного кода уже не помню.
Нечего не могу понять, сделал все как вы описали и в кнопку вставлял и в чистый модуль, пошагово выполнял, отследить смыла прыжка в определенные моменты через весь текст не удалось:( сам же код не на одном из листов не каких действий не выполнял
Ну давайте опять свой файл куда-нить на обменник или мне на мыло (внизу замаскировано) - посмотрю. Только что-то мыло испортилось - мигрировало на яндекс и работает сегодня никак... кое-как...
Так Вы сразу из "плана" хотите заполнить "приложение"? Вероятно можно и так, но разбираться сейчас неохота и некогда. Я код написал для импорта данных из листа "Карточка" там уже будут проставлены оценки, вот оттуда и берём данные сразу с оценками (из поля "за экзамен") Добавил очистку листа, обработку ошибки если нечего выгружать, и выгрузку на оба листа формы (может можно сделать элегантнее, но работает и так):
Private Sub CommandButton1_Click() Dim a(), i&, ii&, t$, n&
a = Sheets("Карточка").UsedRange.Value ReDim b(1 To UBound(a), 1 To 3)
With CreateObject("Scripting.Dictionary") .CompareMode = 1 For i = 1 To UBound(a) t = a(i, 3) If Len(t) Then If Len(a(i, 13)) Then If IsNumeric(a(i, 13)) Then If Not .exists(t) Then ii = ii + 1 .Item(t) = ii b(ii, 1) = t b(ii, 2) = a(i, 13) b(ii, 3) = a(i, 14) Else n = .Item(t) b(n, 2) = b(n, 2) + a(i, 13) b(n, 3) = a(i, 14) End If End If End If End If Next
End With
If ii > 0 Then Sheets(3).UsedRange.ClearContents Sheets(3).[b8].Resize(60, 3) = b If ii > 60 Then For i = 60 To ii Cells(i + 19, 2) = b(i, 1) Cells(i + 19, 3) = b(i, 2) Cells(i + 19, 4) = b(i, 3) Next End If End If End Sub