Страницы: Пред. 1 2
RSS
Разделить прайс на разные листы
 
Цитата
Nordheim написал:
Удалите все столбцы кроме того на основании которого формируются листы.  
Оставила только столб В.
Цитата
Nordheim написал:
Удалите дубликаты из оставшегося столбца
Дубликаты оставила сознательно: надо основательно проверить алгоритм!  :D  
 
Nordheim, ну да, не посмотрел, что у Вас ikey потом снова используется. Тогда, разумеется,
Код
Dim Bads(1 To 7) As String, Buff As String, Bad As Variant
    
   Bads(1) = ":"
   Bads(2) = "/"
   Bads(3) = "\"
   Bads(4) = "?"
   Bads(5) = "*"
   Bads(6) = "["
   Bads(7) = "]"
   Buff=ikey
   For Each Bad In Bads
      Buff = Replace(Buff, Bad, " ", 1, -1, vbTextCompare)
   Next Bad
   .Name = Left(Buff, 31)
Изменено: StoTisteg - 06.09.2018 12:49:31
 
Мотя, Попробуйте так:

Скрытый текст
Изменено: Nordheim - 06.09.2018 13:25:54
"Все гениальное просто, а все простое гениально!!!"
 
Nordheim!
Ваш макрос при повторном запуске - "вываливается": см. картинку.
А еще у Deaviarat, похоже, Export - штатно регулярен.
По-моему, имеет смысл сделать запрос файла-Export.
 
Цитата
Мотя написал:
Ваш макрос при повторном запуске - "вываливается": см. картинку.
Любой макрос при повторном запуске будет "вываливать" эту ошибку, на сколько я знаю Excel не поддерживает одинаковые названия нескольких листов.
Если одну и ту же таблицу разбивать таким образом несколько раз, нужно ставить обработчик который будет проверять совпадения листов и в зависимости от этого вставлять новый лист, либо заменять стары, но это совершенно другая история  :D . Или как вариант (что проще предыдущего), удаляем все листы кроме листа источника и формируем все листы заново.
"Все гениальное просто, а все простое гениально!!!"
 
Nordheim, где-то так, да. То есть в начале макроса пишем
Код
   Application.DisplayAlerts = False
   Do While Err.Number = 0
      On Error Resume Next
      Worksheets(2).Delete
   Loop
раз уж первый лист меняется всё время. А ещё лучше —
Код
Private Sub Worksheet_Change(ByVal Target As Range)

   Application.DisplayAlerts = False
   Do While Err.Number = 0
      On Error Resume Next
      Worksheets(2).Delete
   Loop
   Application.DisplayAlerts = True
   Call test

End Sub
в модуль общего прайса. Заодно отобьёт охоту всякие мелочи ручками править :D  8)
Изменено: StoTisteg - 06.09.2018 14:21:36
 
Есть форумчанин...
Изменено: Мотя - 06.09.2018 14:29:07
 
Цитата
Мотя написал:
      Sch = Sch + 1      
      ReDim Preserve GR_LST(1 To Sch)
Кошмар какой... Вот до чего людей нелюбовь к словарям и коллекциям доводит...
Изменено: StoTisteg - 06.09.2018 14:25:07
 
Цитата
Мотя написал:
Конечно, у него профессионально объявлены переменные!
Мотя, этот код ужасен со всех сторон... Переменные Lst и GR_LST — вообще без типа...
 
Цитата
StoTisteg написал:
Вот до чего людей нелюбовь к словарям и коллекциям доводит...
Вы - профессионал: Вам и "Карты в руки"!
Я - не профессионал.
В данном случае Ваше замечание звучит, как оскорбление!
 
Дык можно и без массива удалять.

Код
Sub test()
    Dim sht As Worksheet
    With Application
        .ScreenUpdating = False: .DisplayAlerts = False
        For Each sht In Worksheets
            If sht.Name <> "Лист1" Then sht.Delete
        Next sht
        .ScreenUpdating = True: .DisplayAlerts = True
    End With
End Sub
"Все гениальное просто, а все простое гениально!!!"
 
Этот код удаляет все листы, кроме того, который называется "Лист1". И такие танцы с бубном не нужны:
Код
Dim Sh As Worksheet
Dim Lst As String

Lst="Лист1"
Application.DisplayAlerts = False
For Each Sh In Worksheets
    If Sh.Name <> Lst Then Sh.Delete
Next Sh
Изменено: StoTisteg - 06.09.2018 14:38:36
 
Мотя, я, пардон, не больший профессионал, чем Вы или Виктор...
 
Цитата
StoTisteg написал:
Nordheim , где-то так, да. То есть в начале макроса пишем
т.к. я больше предпочитаю цикл For ....Next, то циклом удалялбы листы так
Код
Sub test()
    Dim i%
    Application.DisplayAlerts = False
        For i = Worksheets.Count To 2 Step -1
            Worksheets(i).Delete
        Next i
    Application.DisplayAlerts = True
    Call test
End Sub

Но это работает только если лист с основной таблицей имеет индекс = 1, если плавающий то нужно сделать проверку на имя листа.
"Все гениальное просто, а все простое гениально!!!"
 
Nordheim, дело вкуса :)
Цитата
Nordheim написал:
Но это работает только если лист с основной таблицей имеет индекс = 1, если плавающий то нужно сделать проверку на имя листа.
Это само собой. Но в нашем-то случае мы именно от этого и строимся.
 
Цитата
StoTisteg написал:
. А ещё лучше
Так бы делать не стал, потому что привведении в таблицу значения каждый раз будет запускаться макрос по удалению и формированию листов, а это не так быстро делается как хотелось бы с кодом в котором есть SQL запросы.
Изменено: Nordheim - 06.09.2018 14:46:23
"Все гениальное просто, а все простое гениально!!!"
 
Nordheim, это шутка же.
Цитата
StoTisteg написал:
Заодно отобьёт охоту всякие мелочи ручками править  :D 8)  
 
А как же еще в таблицу данные вносить если не руками править? Только если таблицы выгружена из БД, но в рамках данной темы такое не оговаривалось.
Изменено: Nordheim - 06.09.2018 14:53:31
"Все гениальное просто, а все простое гениально!!!"
 
Цитата
StoTisteg написал:
Nordheim , это шутка же.
Блин, наверно заработался, и все воспринимаю серьезно  ;)
"Все гениальное просто, а все простое гениально!!!"
Страницы: Пред. 1 2
Наверх