ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Программирование > PHP, PERL, MySQL, JavaScript
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

Макрос в эксел или PHP обработчик данных для формата .xls
  #1  
Старый 07.09.2009, 15:53
satana-fu
Moderator - Level 7
Регистрация: 06.02.2009
Сообщений: 195
Провел на форуме:
2485155

Репутация: 719
Отправить сообщение для satana-fu с помощью ICQ
По умолчанию Макрос в эксел или PHP обработчик данных для формата .xls

у меня в экселе таблица, данные, в таком порядке

код - страна - цена



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


За скрипт, макрос, или совет, который мне поможет реализовать данную операцию, готов заплатить. (цена ваша, в разумных пределах)
 
Ответить с цитированием

  #2  
Старый 07.09.2009, 17:08
Pashkela
Динозавр
Регистрация: 10.01.2008
Сообщений: 2,841
Провел на форуме:
9220514

Репутация: 3338


Отправить сообщение для Pashkela с помощью ICQ
По умолчанию

максрос:

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 

Последний раз редактировалось Pashkela; 07.09.2009 в 17:18..
 
Ответить с цитированием

  #3  
Старый 07.09.2009, 20:33
satana-fu
Moderator - Level 7
Регистрация: 06.02.2009
Сообщений: 195
Провел на форуме:
2485155

Репутация: 719
Отправить сообщение для satana-fu с помощью ICQ
По умолчанию

Пашкела, что то он у меня не заработал , вроде правильно вживил в эксел.
если тебе не сложно, не мог бы ты вживить макрос в эксел:???


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

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


Буду очень признателен, в долгу не останусь.
 
Ответить с цитированием

  #4  
Старый 08.09.2009, 00:33
Pashkela
Динозавр
Регистрация: 10.01.2008
Сообщений: 2,841
Провел на форуме:
9220514

Репутация: 3338


Отправить сообщение для Pashkela с помощью ICQ
По умолчанию

Да, вариант выше работал только на маленьком кол-ве записей. Или хз. В общем не стал дожидаться и переписал на более наглядный, невиснущий, позволяющий отследить результаты работы макрос:

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

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

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

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

Последний раз редактировалось Pashkela; 08.09.2009 в 01:15..
 
Ответить с цитированием

  #5  
Старый 08.09.2009, 11:43
SQLHACK
Голос разума
Регистрация: 27.09.2006
Сообщений: 529
Провел на форуме:
1607210

Репутация: 1617


Отправить сообщение для SQLHACK с помощью ICQ
По умолчанию

Цитата:
Сообщение от Pashkela  
Да, вариант выше работал только на маленьком кол-ве записей. Или хз. В общем не стал дожидаться и переписал на более наглядный, невиснущий, позволяющий отследить результаты работы макрос:

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

Во время работы макроса лучше ничего не трогать, а тупо наслаждаться результатом
Сделаю небольшой совет.
Чтобы все не висло, считывайте все данные в массив сразу, перед обработкой, потом обрабатывайте массив, потом чистите таблицу и вставляйте все заново на неё. Прирост скорости будет в десятки раз.
(Тупит из за доступа к данным в таблице)

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

...О-о-о-о, ушами не услышать, глазами не понять!
 
Ответить с цитированием

  #6  
Старый 09.09.2009, 21:14
satana-fu
Moderator - Level 7
Регистрация: 06.02.2009
Сообщений: 195
Провел на форуме:
2485155

Репутация: 719
Отправить сообщение для satana-fu с помощью ICQ
По умолчанию

Пашкела, спасибо большое за макрос, только щас появилась возможность проверить, была проблема что макрос удаляет строки где цена ниже, с этим разобрался, заменил символ < в сравнении полей 3 и 4 на символ >.

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

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

Если есть возможность, исправь, пожалуйста, буду очень благодарен

Последний раз редактировалось satana-fu; 09.09.2009 в 21:36..
 
Ответить с цитированием

  #7  
Старый 09.09.2009, 22:19
Pashkela
Динозавр
Регистрация: 10.01.2008
Сообщений: 2,841
Провел на форуме:
9220514

Репутация: 3338


Отправить сообщение для Pashkela с помощью ICQ
По умолчанию

Одну строчку сам не мог догадаться вставить чтоли?

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 
 
Ответить с цитированием

  #8  
Старый 11.09.2009, 16:42
satana-fu
Moderator - Level 7
Регистрация: 06.02.2009
Сообщений: 195
Провел на форуме:
2485155

Репутация: 719
Отправить сообщение для satana-fu с помощью ICQ
По умолчанию

Пашкела, все заработал на отлично. спасибо большое, жду в личку номер вебмани
 
Ответить с цитированием

  #9  
Старый 11.09.2009, 16:57
Pashkela
Динозавр
Регистрация: 10.01.2008
Сообщений: 2,841
Провел на форуме:
9220514

Репутация: 3338


Отправить сообщение для Pashkela с помощью ICQ
По умолчанию

оставь себе на пиво, просто интересно было
 
Ответить с цитированием

  #10  
Старый 30.10.2009, 18:22
satana-fu
Moderator - Level 7
Регистрация: 06.02.2009
Сообщений: 195
Провел на форуме:
2485155

Репутация: 719
Отправить сообщение для satana-fu с помощью ICQ
По умолчанию

Цитата:
Сообщение от Pashkela  
оставь себе на пиво, просто интересно было
Пашкела, наверное опять просьба к тебе , нужен макрос, который оставлял бы одинаковые строки и удалял бы строки, которые в файле не повторяются.

например


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

31
31610
31611

Последний раз редактировалось satana-fu; 30.10.2009 в 18:30..
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Books PSalm69 Избранное 248 27.10.2009 04:52
Создание сети: обжимка проводов petrovich-lamer Windows 13 02.07.2007 13:18
Редактирование содежимого прошивок для Самсунгов Digimortal Схемы и программы 3 28.02.2007 14:22
10 вещей, которые вам нужно знать про Vista Firewall ground_zero Мировые новости 2 11.02.2007 19:02



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ