Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.11.2009, 14:36   #21
Сергей И.
Пользователь
 
Регистрация: 30.03.2009
Сообщений: 20
По умолчанию

Я немного изменил макрос, чтобы он работал на любом листе, а не только на первом
Код:
    iLastRow = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
На втором листе все нормально разбивается.
А вот на третьем да, есть проблемка.
Посмотри на выделенные ячейки на втором и третьем листах.
На 3 листе перед словом "(диагональ)" есть пробел.
Макрос разбивает содержимое ячейки по разделителю " (" "пробел и скобка", и забирает следующее слово до пробела.
Для решения проблемы нужно изменить строку на 3 листе.
Или удалить пробел перед скобкой у слова "(диагональ)" или заменить его на другой знак(тире, подчеркивание)
Вложения
Тип файла: rar обработки_2.rar (21.9 Кб, 26 просмотров)
Сергей И. вне форума Ответить с цитированием
Старый 13.11.2009, 15:21   #22
maksvas
Пользователь
 
Регистрация: 10.11.2009
Сообщений: 28
По умолчанию

Огромное спасибо Сергею!!!
Я все понял, в следующий раз буду менять вместо пробела ставить знак "_" и будет проблема меньше. Еще раз вам спасибо!!!

Можно так писать в строке: 7201_Туфли_размер44 52 и будет легко разбить текст по столбцам из меню Данные. Чтобы оператору легко разбить текст по проще, потому что он почти не знает о макросе.
maksvas вне форума Ответить с цитированием
Старый 19.04.2011, 11:33   #23
моль
 
Регистрация: 19.04.2011
Сообщений: 5
По умолчанию

Подскажите пл3 как решить схожую задачку.

Имеется таблица с формулой:

Фартук_размер46 1 2 5 10
Фартук_размер42 1 4 1 4
Шапка_вязальная 1 5 1 5
Фартук_размер46 1 2 5 10
Фартук_размер42 1 4 1 4
Итого: 33

(где второй столбец – количество однотипных изделий)

Требуется объединить и просуммировать ячейки с однотипными издельями, у которых все параметры совпадают.

Должно быть:

Фартук_размер46 2 2 5 20
Фартук_размер42 2 4 1 8
Шапка_вязальная 1 5 1 5
Итого: 33

В таком стиле нужно переработать сотни страниц Excel. Буду признателен за помощь.
моль вне форума Ответить с цитированием
Старый 19.04.2011, 12:09   #24
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Пример в файле очень желателен.
И непонятно, например такое может быть, или нет?
Фартук_размер46 1 2 5
Фартук_размер46 1 3 4
И можно ли как уникальное значение брать Фартук_размер46 2 5 - в таком случае Фартук_размер46 3 4 уже будет суммироваться отдельно.

Пока так:
Код:
Option Explicit


Sub Otbor()
    Dim a(), oDict As Object, i As Long, temp As String, kk
    
    With Application
    .DisplayAlerts = False
    .ScreenUpdating = False
    
    a = Range("A1:E" & Range("A" & Rows.Count).End(xlUp).Row).Value

    Set oDict = CreateObject("Scripting.Dictionary")
    oDict.CompareMode = vbTextCompare
    
    For i = 1 To UBound(a)
        temp = Application.Trim(a(i, 1) & "|" & a(i, 3) & "|" & a(i, 4))
        If Not oDict.Exists(temp) Then
            ReDim b(1 To 2)
            b(1) = a(i, 2): b(2) = a(i, 5)
            oDict.Add temp, b
        Else
            b = oDict.Item(temp)
            b(1) = b(1) + a(i, 2): b(2) = b(2) + a(i, 5)
            oDict.Item(temp) = b
        End If
    Next

    
    With Workbooks.Add
        i = 0
        For Each kk In oDict.keys
        i = i + 1
        .Worksheets(1).Range("A" & i) = Split(kk, "|")(0)
        .Worksheets(1).Range("B" & i) = oDict.Item(kk)(1)
        .Worksheets(1).Range("C" & i) = Split(kk, "|")(1)
        .Worksheets(1).Range("D" & i) = Split(kk, "|")(2)
        .Worksheets(1).Range("E" & i) = oDict.Item(kk)(2)
        Next
    End With
    

    .DisplayAlerts = True
    .ScreenUpdating = True
    End With
End Sub
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 19.04.2011 в 13:13.
Hugo121 вне форума Ответить с цитированием
Старый 19.04.2011, 13:34   #25
моль
 
Регистрация: 19.04.2011
Сообщений: 5
По умолчанию

Вот пример.
Касательно фартука:
Фартук_размер46 имеет параметры всегда 2 и 5, как и все изделия имеют свои единственные неизменные параметры.

Hugo121, можешь оставить аську в личку, не знаю как пользоваться макросами.
Вложения
Тип файла: rar Пример.rar (1.6 Кб, 14 просмотров)

Последний раз редактировалось моль; 19.04.2011 в 13:37.
моль вне форума Ответить с цитированием
Старый 19.04.2011, 13:43   #26
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Моль, аськи у меня нет - пишите в личку.
Вам написать не получилось.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 19.04.2011, 16:06   #27
моль
 
Регистрация: 19.04.2011
Сообщений: 5
По умолчанию

Hugo121, спасибо, макрос работает на том примере. Но вот на самом документе, который придется править отказывается, видимо различное число ячеек. Посему очень прошу подправить макрос.
Прилагаю рабочий вариант документа.

Заранее благодарен, моль.
Вложения
Тип файла: rar Пример 2.rar (12.3 Кб, 21 просмотров)
моль вне форума Ответить с цитированием
Старый 19.04.2011, 16:33   #28
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Вот, под Ваш файл, но с рассчётом, что в файле в А1="№", B1="Модель" и т.д., т.е Вашу таблицу переместите в A1:

Код:
Option Explicit


Sub Otbor()
    Dim a(), oDict As Object, i As Long, temp As String, kk, rr As Range

    With Application
        .DisplayAlerts = False
        .ScreenUpdating = False
        Set rr = [a1:h2]

        a = Range("B3:H" & Range("A" & Rows.Count).End(xlUp).Row).Value

        Set oDict = CreateObject("Scripting.Dictionary")
        oDict.CompareMode = vbTextCompare

        For i = 1 To UBound(a)
            'в массиве a:
            '1=Модель
            '2=Наименование оборудования
            '3=Количество однотипного оборудования
            '4=Уст. мощность, кВт
            '5=Время работы, ч
            '6=Коэф. испол
            '7=Расход, кВт.ч

            temp = Application.Trim(a(i, 1) & "|" & a(i, 2) & "|" & a(i, 4) & "|" & a(i, 5) & "|" & a(i, 6))
            If Not oDict.Exists(temp) Then
                ReDim b(1 To 2)
                b(1) = a(i, 3): b(2) = a(i, 7)
                oDict.Add temp, b
            Else
                b = oDict.Item(temp)
                b(1) = b(1) + a(i, 3): b(2) = b(2) + a(i, 7)
                oDict.Item(temp) = b
            End If
        Next


        With Workbooks.Add.Sheets(1)
            rr.Copy .[a1]
            i = 2
            For Each kk In oDict.keys
                i = i + 1
                .Range("B" & i) = Split(kk, "|")(0)    'Модель
                .Range("C" & i) = Split(kk, "|")(1)    'Наименование оборудования
                .Range("D" & i) = oDict.Item(kk)(1)    'Количество
                .Range("E" & i) = CDbl(Split(kk, "|")(2))    'Уст. мощность
                .Range("F" & i) = CDbl(Split(kk, "|")(3))    'Время работы
                .Range("G" & i) = CDbl(Split(kk, "|")(4))    'Коэф. испол
                .Range("H" & i) = oDict.Item(kk)(2)    'Расход
            Next
            .Cells(i + 1, 8).Formula = "=sum(H3:H" & i & ")"
        End With


        .DisplayAlerts = True
        .ScreenUpdating = True
    End With
End Sub
Да, в итоге нужно вручную поставить формат ячейкам с выгруженными значениями, ну или можно прописать в макрос, если это не разовая работа.

P.S. Добавил макрос в файл.
Ещё немного поправил формат вывода и добавил сумму.
Вложения
Тип файла: zip Моль_Пример 2.zip (16.7 Кб, 20 просмотров)
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 19.04.2011 в 20:12.
Hugo121 вне форума Ответить с цитированием
Старый 22.04.2011, 10:51   #29
моль
 
Регистрация: 19.04.2011
Сообщений: 5
По умолчанию

Благодарю, все работает.
моль вне форума Ответить с цитированием
Старый 17.05.2011, 17:29   #30
моль
 
Регистрация: 19.04.2011
Сообщений: 5
По умолчанию

Hugo121, Вас не затруднит еще раз немного подправить макрос?
В прошлый раз за 15 минут удалось сократить документ со 200 до 150 страниц, однако теперь условия немножко изменились.
Вложения
Тип файла: rar Пример 3.rar (12.7 Кб, 12 просмотров)
моль вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Макрос для объединения одинаковых ячеек Internal2 Microsoft Office Excel 2 05.11.2009 14:00
Выборочное суммирование ячеек pavel.ignatenko Microsoft Office Excel 8 01.11.2009 19:02
суммирование ячеек =) peq Microsoft Office Excel 3 08.05.2009 13:24
Суммирование ячеек с флажками 69angel69 Microsoft Office Excel 2 04.03.2008 18:23
Суммирование ячеек с заданным шагом valerij Microsoft Office Excel 10 10.10.2007 00:22