![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы
![]() |
Поиск в этой теме
![]() |
![]() |
#1 |
Регистрация: 05.05.2009
Сообщений: 7
|
![]()
Всем привет. Нужна ваша помощь.
Есть скрипт со следующим кодом: Option Explicit Private sh As Worksheet 'лист на котором происходит подсчёт 'Основная процедура Private Sub CommandButton1_Click() Set sh = ActiveSheet 'лист на котором происходит подсчёт Application.ScreenUpdating = False 'временно отрубаем обновление экрана Call DeleteEmptyRows 'Удаляем все пустые записи Call Sortirovka 'Сортируем по названию Call Summiruem 'Находим одинаковые записи и суммируем их значения Application.ScreenUpdating = True 'надо бы снова включить обновление экрана... End Sub 'Удаляем все пустые записи Private Sub DeleteEmptyRows() 'LastRow - последняя используемая строка, количество строк 'r - очередная строка Dim LastRow As Long, r As Long With sh.UsedRange LastRow = .Rows.Count 'количество строк в используемом диапазоне For r = LastRow To 3 Step -1 'от последней строки и до третьей If .Cells(r, 1) = "" Then .Rows(r).Delete 'нет названия - удаляем всю строку!!! Next End With End Sub 'Сортируем записи по названию Private Sub Sortirovka() Dim endRow As Long 'номер последней строки With sh.UsedRange .Cells(3, 1).End(xlDown).Select 'выделяем - от первой записи и до последней endRow = ActiveCell.Row 'сортируем от первой записи и до последней по названиям .Range(Cells(3, 1), Cells(endRow, 3)).Sort key1:=Columns(1) End With End Sub 'Находим одинаковые записи и суммируем их значения 'Напоминаю, что записи уже отсортированы по названиям 'У записей есть НАЗВАНИЯ (1-й столбец) и ЗНАЧЕНИЯ (2-й столбец) Private Sub Summiruem() Dim i As Long 'номер строки текущей записи Dim sum As Double 'общая сумма 'строковые переменные для названий текущей записи и не-числа в значениях записей Dim tek, tek2, brak As String i = 3: sum = 0: brak = "" 'начинаем с 3-й строчки, пока всё по нулям 'Итак, поехали! Do With sh tek = .Cells(i, 1) 'название очередной записи tek2 = .Cells(i + 1, 1) 'название записи строкой ниже If Not IsNumeric(.Cells(i, 2)) And .Cells(i, 2) <> "" Then 'Если значение записи не-число, то кидаем в "брак" brak = brak & " [" & .Cells(i, 2) & "]" Else sum = sum + .Cells(i, 2) 'приплюсовали к общей сумме - если это было число End If If tek = tek2 Then 'если две подряд записи с одинаковыми названиями 'то первую удаляем - так как её значение к сумме уже приплюсовали .Rows(i).Delete Else 'ну а если названия разные... .Cells(i, 2) = sum 'записываем для текущей записи всё что подсчитали 'если были нечисловые значения - сообщаем об этом в той же строке If brak <> "" Then .Cells(i, 3) = "БРАК - " & brak sum = 0 'обнуляем сумму brak = "" 'очищаем корзинку для "брака" i = i + 1 'переходим к записи строкой ниже с другим названием! End If End With Loop Until tek = "" 'и так до тех пор пока не закончатся записи End Sub Но он привязан к определенному документу excel. Можно как-нибудь его унифицировать, чтобы он запускался с панели инструментов и его можно было применить к другим документам с одинаковым расположением строк и колонок? |
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 05.12.2007
Сообщений: 4,180
|
![]()
Во-первых, макросы написаны очень не рационально.
Во-вторых, если требуется, чтобы эта процедура всегда была доступна? Тогда нужно создать надстройку.
Чем шире угол зрения, тем он тупее.
|
![]() |
![]() |
![]() |
#3 |
Регистрация: 05.05.2009
Сообщений: 7
|
![]()
Гут. Объясните плиз как это делать. На счет рациональности - согласен, но писал не я, да и мне главное, чтобы работал.
|
![]() |
![]() |
![]() |
#4 |
Программист VBA
СуперМодератор
Регистрация: 13.07.2008
Сообщений: 6,858
|
![]()
Скопируйте файл из вложения куда-нибудь к себе на компьютер, и подключите его как надстройку (меню Сервис - Надстройки)
В главном меню увидите кнопку Обработать данные, которая и будет запускать Ваш макрос. |
![]() |
![]() |
![]() |
#5 |
Регистрация: 05.05.2009
Сообщений: 7
|
![]()
Добавил, но он работает неправильно. Изначально он искал в первой колонке совпадение значений (имен) и суммировал их значения из второй. Если имя в первой колонке было уникальным, то он его просто переписывал с его значением.
|
![]() |
![]() |
![]() |
#6 | ||
Программист VBA
СуперМодератор
Регистрация: 13.07.2008
Сообщений: 6,858
|
![]() Цитата:
Вы просили сделать этот скрипт независимым от файла: Цитата:
К тому же SAS888 уже дал Вам понять, что макросы написаны не лучшим образом. Если бы Вы написали, чего Вы хотели добиться этим кодом, и прикрепили бы пример обрабатываемого файла, - другое дело, можно было бы что-то подправить в коде. |
||
![]() |
![]() |
![]() |
#7 |
Регистрация: 05.05.2009
Сообщений: 7
|
![]()
Тогда объясняю: есть ежемесячный отчет активности пользователей на форуме в формате excel (http://depositfiles.com/files/7z7vejfny). Такой отчет формируется каждый месяц. В отчете на одном листе несколько разделов=разделы форума. Пользователь может отвечать в разных разделах на разное количество вопросов. Это фиксируется в колонке Answer. Нужно, чтобы скрипт суммировал значения Answer для каждого пользователя во всех разделах.
Последний раз редактировалось skia; 06.05.2009 в 10:53. |
![]() |
![]() |
![]() |
#8 |
Регистрация: 05.05.2009
Сообщений: 7
|
![]()
Сможете помочь?
|
![]() |
![]() |
![]() |
#9 |
Программист VBA
СуперМодератор
Регистрация: 13.07.2008
Сообщений: 6,858
|
![]()
Возможно, вам достаточно будет такого макроса:
Код:
|
![]() |
![]() |
![]() |
#10 |
Регистрация: 05.05.2009
Сообщений: 7
|
![]() |
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
2 задачи на паскале, нужен код. "горю на зачете" | NIcque | Помощь студентам | 6 | 15.05.2009 05:59 |
Кнопка "поверх всех окон" как в палитре инструментов | AvAlex | Общие вопросы Delphi | 11 | 16.04.2009 01:04 |
Как "ПОДВЯЗАТЬ" скрипт КО ВРЕМЕНИ ??? | gagagogo | PHP | 5 | 13.02.2009 00:25 |
Как узнать ширину панели "Пуск" | Port 111 | Win Api | 6 | 01.02.2009 23:05 |
"Суммирование рядов смешанного типа" Найти ошибку! | maliyusha | Паскаль, Turbo Pascal, PascalABC.NET | 4 | 25.12.2008 20:19 |