Макрос в эксел или PHP обработчик данных для формата .xls

Discussion in 'PHP' started by Uex Urgent, 7 Sep 2009.

  1. Uex Urgent

    Uex Urgent Злостный Смайлик

    Joined:
    6 Feb 2009
    Messages:
    236
    Likes Received:
    463
    Reputations:
    452
    у меня в экселе таблица, данные, в таком порядке

    код - страна - цена
    [​IMG]


    и в поле КОД встречаются поля с одинаковыми кодами, но с разной ценой, надо убрать оттуда одинаковые коды, но чтоб скрипт из двух одинаковых кодов убрал то поле, в котором цена кода выше.


    За скрипт, макрос, или совет, который мне поможет реализовать данную операцию, готов заплатить. (цена ваша, в разумных пределах)
     
    _________________________
    8 people like this.
  2. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    максрос:

    PHP:
    Sub Макрос1()
    Const 
    intDataCol1 ' Номер столбца с кодами
    Const intDataCol2 = 3 ' 
    Номер столбца с ценами
    Const intDataCol3 ' Номер столбца со странами
    Const intMaxRow = 6 ' 
    Номер последней строки в таблице
        Dim i
    %, j%
        
    Dim strValue1$, strValue2$, strValue3$, strValue4$, strValue5$, strValue6$
        For 
    2 To intMaxRow 1
            strValue1 
    Trim(Cells(iintDataCol1))
            
    strValue3 Trim(Cells(iintDataCol2))
            For 
    1 To intMaxRow
                strValue2 
    Trim(Cells(jintDataCol1))
                
    strValue4 Trim(Cells(jintDataCol2))
                If 
    StrComp(strValue1strValue2vbTextCompare) = 0 Then
                    
    If strValue3 strValue4 Then
                        Cells
    (jintDataCol1).Delete shift:=xlUp
                        Cells
    (jintDataCol2).Delete shift:=xlUp
                        Cells
    (jintDataCol3).Delete shift:=xlUp
                    
    Else
                        
    Cells(iintDataCol1).Delete shift:=xlUp
                        Cells
    (iintDataCol2).Delete shift:=xlUp
                        Cells
    (iintDataCol3).Delete shift:=xlUp
                    End 
    If
                
    End If
            
    Next
        Next
    End Sub
     
    #2 Pashkela, 7 Sep 2009
    Last edited: 7 Sep 2009
  3. Uex Urgent

    Uex Urgent Злостный Смайлик

    Joined:
    6 Feb 2009
    Messages:
    236
    Likes Received:
    463
    Reputations:
    452
    Пашкела, что то он у меня не заработал :rolleyes: , вроде правильно вживил в эксел.
    если тебе не сложно, не мог бы ты вживить макрос в эксел:??? :rolleyes:


    Сам пытался вживить, то ли неправильно прописал, то ли в макросе ошибка проскользнула, не получилось у меня.

    Вот сам файл в который его надо прописать
    http://www.filehoster.ru/files/dk2057


    Буду очень признателен, в долгу не останусь.:rolleyes:
     
    _________________________
    1 person likes this.
  4. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    Да, вариант выше работал только на маленьком кол-ве записей. Или хз. В общем не стал дожидаться и переписал на более наглядный, невиснущий, позволяющий отследить результаты работы макрос:

    PHP:
    Sub Макрос1()

    Const 
    intDataCol1 ' Номер столбца с кодами
    Const intDataCol2 = 3 ' 
    Номер столбца с ценами
    Const intMaxRow 12700 ' Номер последней строки в таблице
        Dim i%, j%
        Dim strValue1$, strValue2$, strValue3$, strValue4$
        For i = 2 To intMaxRow - 1
            strValue1 = Trim(Cells(i, intDataCol1))
            strValue3 = Trim(Cells(i, intDataCol2))
            For j = i + 1 To intMaxRow
                strValue2 = Trim(Cells(j, intDataCol1))
                strValue4 = Trim(Cells(j, intDataCol2))
                If StrComp(strValue1, strValue2, vbTextCompare) = 0 Then
                    If strValue3 > strValue4 Then
                        Rows(j & ":" & j).Select
                        Selection.Delete Shift:=xlUp
                    Else
                        Rows(i & ":" & i).Select
                        Selection.Delete Shift:=xlUp
                    End If
                End If
            Next
        Next

    End Sub
    ну и рабочий вариант можно скачать здесь вместе с файлом:

    типо тут

    Просто зайти в Сервис->Макрос->Макросы->Макрос1->Выполнить

    PS: Ждать придется долго, на то оно и vba

    Если что, пищи:)

    ------------------

    Во время работы макроса лучше ничего не трогать, а тупо наслаждаться результатом
     
    #4 Pashkela, 8 Sep 2009
    Last edited: 8 Sep 2009
  5. SQLHACK

    SQLHACK Остались только слоны

    Joined:
    27 Sep 2006
    Messages:
    437
    Likes Received:
    372
    Reputations:
    407
    Сделаю небольшой совет.
    Чтобы все не висло, считывайте все данные в массив сразу, перед обработкой, потом обрабатывайте массив, потом чистите таблицу и вставляйте все заново на неё. Прирост скорости будет в десятки раз.
    (Тупит из за доступа к данным в таблице)

    И ище когда производятся операции в цикле и цикл может быть долгим, вставляйте оператор DoEvents. Это разблокирует интерфейс во время выполения ресурсоемких задач.
     
    _________________________
  6. Uex Urgent

    Uex Urgent Злостный Смайлик

    Joined:
    6 Feb 2009
    Messages:
    236
    Likes Received:
    463
    Reputations:
    452
    Пашкела, спасибо большое за макрос, только щас появилась возможность проверить, была проблема что макрос удаляет строки где цена ниже, с этим разобрался, заменил символ < в сравнении полей 3 и 4 на символ >.

    Но по окончанию процесса выявилась другая проблема. Когда макрос начинает сравнение полей, то полей 12 тысяч (задаются в теле макроса в поле "Номер последней строки в таблице"), после проверки макроса и удаления полей где цена выше, общее количество полей бывает примерно 9500, но тут Макрос зависает, потому что после последней строки под номером 9500, данных для обработки нет, а макрос должен обработать 12 тысяч полей.

    Можно ли сделать так, чтоб не надо было писать в макрос номер последней строки и он сам останавливался как только закончит обработку последнего поля вне зависимости от его номера???

    Если есть возможность, исправь, пожалуйста, буду очень благодарен :rolleyes:
     
    _________________________
    #6 Uex Urgent, 9 Sep 2009
    Last edited: 9 Sep 2009
  7. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    Одну строчку сам не мог догадаться вставить чтоли?

    PHP:
    Const intDataCol1 1       ' Номер столбца с кодами
    Const intDataCol2 = 3       ' 
    Номер столбца с ценами
    Const intMaxRow 12700    '  Номер последней строки в таблице
        Dim i%, j%
        Dim strValue1$, strValue2$, strValue3$, strValue4$
        For i = 2 To intMaxRow - 1
            strValue1 = Trim(Cells(i, intDataCol1))
            strValue3 = Trim(Cells(i, intDataCol2))
            If strValue1 = "" Then i = intMaxRow ' 
    Волшебная строчка
              
    For 1 To intMaxRow
                  strValue2 
    Trim(Cells(jintDataCol1))
                  
    strValue4 Trim(Cells(jintDataCol2))
                  If 
    StrComp(strValue1strValue2vbTextCompare) = 0 Then
                      
    If strValue3 strValue4 Then
                          Rows
    (":" j).Select
                          Selection
    .Delete Shift:=xlUp
                      
    Else
                          
    Rows(":" i).Select
                          Selection
    .Delete Shift:=xlUp
                      End 
    If
                  
    End If
              
    Next
        Next
     
    2 people like this.
  8. Uex Urgent

    Uex Urgent Злостный Смайлик

    Joined:
    6 Feb 2009
    Messages:
    236
    Likes Received:
    463
    Reputations:
    452
    Пашкела, все заработал на отлично. спасибо большое, жду в личку номер вебмани
     
    _________________________
  9. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    оставь себе на пиво, просто интересно было
     
  10. Uex Urgent

    Uex Urgent Злостный Смайлик

    Joined:
    6 Feb 2009
    Messages:
    236
    Likes Received:
    463
    Reputations:
    452
    Пашкела, наверное опять просьба к тебе :rolleyes: , нужен макрос, который оставлял бы одинаковые строки и удалял бы строки, которые в файле не повторяются.

    например
    [​IMG]

    Тут нужно, чтоб макрос убрал код 316 и 31612 в первом столбце, который в файле один, и оставил повторяющиеся коды

    31
    31610
    31611
     
    _________________________
    #10 Uex Urgent, 30 Oct 2009
    Last edited: 30 Oct 2009
  11. login999

    login999 Elder - Старейшина

    Joined:
    12 Jun 2008
    Messages:
    491
    Likes Received:
    280
    Reputations:
    92
    Вообще, если не важны формулы, то намного проще экселевский файлик экспортировать в .csv , а дальше над ним можно извращаться практически на любом языке программирования так, как твоей душе угодно...
    ^^^^^^^^^^^^^^^^^^^^^^^^^
    Это написано из-за того, что синтаксис Excel VBA мну раздражает ну прям ужос как
     
    #11 login999, 30 Oct 2009
    Last edited by a moderator: 13 Dec 2009
  12. Uex Urgent

    Uex Urgent Злостный Смайлик

    Joined:
    6 Feb 2009
    Messages:
    236
    Likes Received:
    463
    Reputations:
    452

    Кодеры, помогите плиз, кто с макросами разбирается???? Срочняк нужен макрос, оплату гарантирую :rolleyes:
     
    _________________________
  13. Uex Urgent

    Uex Urgent Злостный Смайлик

    Joined:
    6 Feb 2009
    Messages:
    236
    Likes Received:
    463
    Reputations:
    452
    уже готово, всем спасибо. Если кому надо, выкладываю на всякий случай


    Вот весь код:
    Code:
    [color=darkblue]Sub[/color] test()
        [color=darkblue]Dim[/color] cell [color=darkblue]As[/color] Range, ra [color=darkblue]As[/color] Range, delra [color=darkblue]As[/color] Range
        Application.ScreenUpdating = [color=darkblue]False[/color]
        [color=darkblue]Set[/color] ra = Range([A1], Range("A" & Rows.Count).End(xlUp))
        [color=darkblue]For[/color] [color=darkblue]Each[/color] cell [color=darkblue]In[/color] ra.Cells
            [color=darkblue]If[/color] WorksheetFunction.CountIf(ra, cell) = 1 [color=darkblue]Then[/color]
                [color=darkblue]If[/color] delra [color=darkblue]Is[/color] [color=darkblue]Nothing[/color] [color=darkblue]Then[/color] [color=darkblue]Set[/color] delra = cell [color=darkblue]Else[/color] [color=darkblue]Set[/color] delra = Union(delra, cell)
            [color=darkblue]End[/color] [color=darkblue]If[/color]
        [color=darkblue]Next[/color] cell
        [color=darkblue]If[/color] delra [color=darkblue]Is[/color] [color=darkblue]Nothing[/color] [color=darkblue]Then[/color] MsgBox "На листе остались только повторяющиеся строки", 64: [color=darkblue]Exit[/color] [color=darkblue]Sub[/color]
        delra.EntireRow.Delete
        Application.ScreenUpdating = [color=darkblue]True[/color]
    [color=darkblue]End[/color] [color=darkblue]Sub[/color]
    
    А вот - пример файла с макросом:

    [​IMG]


    Отдельное спасибо за макрос EducatedFool
     
    _________________________
  14. Flanker48

    Flanker48 Member

    Joined:
    9 Mar 2009
    Messages:
    74
    Likes Received:
    33
    Reputations:
    0
    Не знаю куда написать, нашёл тему по поиску, напишу тут )

    В общем у меня есть документ Excel, мне нужно в определённом столбце отобрать те строки, в которых значение больше 0. А которые с 0 удалить... Или сделать, где больше 0 чтобы были вверху, документ большой и искать в какой строке 1, а где 3 ручками не возможно. Как сделать? Хелп
     
  15. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    Данные-фильтр-автофильтр

    PS: ппц:)
     
    1 person likes this.