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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.05.2010, 20:12   #1
ShamanK
Пользователь
 
Регистрация: 16.10.2009
Сообщений: 90
По умолчанию простая сортировка с заранее неизвестным количеством строк

Парни прошу помощь!

на этом форуме нашел массу примеров сортировки и все равно никак не догоню

что есть
есть несколько листов с заказами которые макрос собирает в одну большую сводную таблицу в отдельном листе.
в этой сводной таблице известно количество столбцов и заранее не известно количество строк.
после формирования этой таблицы необходимо отсортировать ее по номеру заказа по возрастанию...
споткнулся в том, что все примеры даются с заранее известным количеством строк (((
ShamanK вне форума Ответить с цитированием
Старый 03.05.2010, 20:17   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Где пример файла?

Если есть строка заголовка:
Код:
ActiveSheet.UsedRange.Sort [b1], xlAscending, , , , , , xlYes
Если нет строки заголовка (данные начинаются с первой строки):
Код:
ActiveSheet.UsedRange.Sort [b1], xlAscending, , , , , , xlNo
[b1] - первая ячейка столбца, по которому осуществляется сортировка
EducatedFool вне форума Ответить с цитированием
Старый 03.05.2010, 20:31   #3
ShamanK
Пользователь
 
Регистрация: 16.10.2009
Сообщений: 90
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Где пример файла?

Если есть строка заголовка:
Код:
ActiveSheet.UsedRange.Sort [b1], xlAscending, , , , , , xlYes
Если нет строки заголовка (данные начинаются с первой строки):
Код:
ActiveSheet.UsedRange.Sort [b1], xlAscending, , , , , , xlNo
[b1] - первая ячейка столбца, по которому осуществляется сортировка
вот функция которая "шерстит" листы и собирает данные на один лист

Код:
Function Form()
Dim kolTr As Integer
 Set wksh1 = Worksheets("Главная")
 Set wksh3 = Worksheets("Рабочая")
 Set wksh10 = Worksheets("LLZ")
wksh10.Range("A:T") = ""
nchC = 11
konC = Sheets.Count
Col = 0

        For i = nchC To konC
            Set sht = Sheets(i)
            y = 10
                If sht.Cells(y, "B") <> "" Then
                    Do While sht.Cells(y, "B") <> ""
                        Col = Col + 1
                        wksh10.Cells(Col, "A").Value = sht.Cells(y, "B")
                        wksh10.Cells(Col, "B").Value = sht.Cells(y, "F")
                        wksh10.Cells(Col, "C").Value = sht.Cells(y, "G")
                        wksh10.Cells(Col, "D").Value = sht.Cells(y, "D")
                        wksh10.Cells(Col, "E").Value = i - 10
                        y = y + 1
                    DoEvents
                    Loop
                
                
                End If
                
        DoEvents
        Next i

'    wksh10.Columns("A:A").Select
'    wksh10.Sort.SortFields.Clear
'    wksh10.Sort.SortFields.Add Key:=Range("A1"), _
'        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
'    With wksh10.Sort
'        .SetRange wksh10.Range(Cells(1, "A"), Cells(Col, "E"))
'        .Header = xlNo
'        .MatchCase = False
'        .Orientation = xlTopToBottom
'        .SortMethod = xlPinYin
'        .Apply
'    End With

End Function
внизу закомментирована попытка отсортировать по столбцу А ((((
сделать ActiveSheet нельзя... необходимо сортировать без выделения этого листа..
ShamanK вне форума Ответить с цитированием
Старый 04.05.2010, 08:00   #4
ShamanK
Пользователь
 
Регистрация: 16.10.2009
Сообщений: 90
По умолчанию

сам допер )))
оказалось все очень банально и просто..
ответ крылся в самом вопросе.
вопрос начинался со слова ПРОСТАЯ.. )))
следовательно чем проще тем лучше..
а потому вместо конструкции:
PHP код:
            Do While sht.Cells(y"B") <> ""
                        
Col Col 1
                        wksh10
.Cells(Col"A").Value sht.Cells(y"B")
                        
wksh10.Cells(Col"B").Value sht.Cells(y"F")
                        
wksh10.Cells(Col"C").Value sht.Cells(y"G")
                        
wksh10.Cells(Col"D").Value sht.Cells(y"D")
                        
wksh10.Cells(Col"E").Value 10
                        y 
1
                    DoEvents
                    Loop 
использовал следующее :
в ячейку А записывается номер заказа. их всегда не больше 1000 и этот номер всегда уникальный, следовательно
PHP код:
wksh10.Cells(Col"A").Value sht.Cells(y"B"
можно изменить на
PHP код:
строка sht.Cells(y"B"
и получится:
PHP код:
             Do While sht.Cells(y"B") <> ""
                        
строка sht.Cells(y"B")
                        
wksh10.Cells(строка "A").Value sht.Cells(y"B")
                        
wksh10.Cells(строка "B").Value sht.Cells(y"F")
                        
wksh10.Cells(строка "C").Value sht.Cells(y"G")
                        
wksh10.Cells(строка "D").Value sht.Cells(y"D")
                        
wksh10.Cells(строка "E").Value 10
                        y 
1
                    DoEvents
                    Loop 
и следующим циклом удалить все пустые строки если таковые будут место быть )))
ShamanK вне форума Ответить с цитированием
Старый 05.05.2010, 16:50   #5
ShamanK
Пользователь
 
Регистрация: 16.10.2009
Сообщений: 90
По умолчанию

Все таки не могу уйти от сортировки...
нижеприведенный код в двух листах формирует определенные данные.
и в самом конце оба эти листа необходимо отсортировать
по первому столбцу... никак не догоню как это сделать ((
Код:
Function FormBidAsk()
Dim i, cntBid, cntAsk, u, x, n  As Integer
 Set wksh1 = Worksheets("Главная")
 Set wksh2 = Worksheets("Игроки")
 Set wksh3 = Worksheets("Рабочая")
 Set wksh4 = Worksheets("STAK")
 Set wksh5 = Worksheets("BID")
 Set wksh6 = Worksheets("ASK")
 Set wksh7 = Worksheets("CPS")
 Set wksh8 = Worksheets("LP")
 Set wksh9 = Worksheets("LZ")
 Set wksh10 = Worksheets("LLZ")

  wksh5.Range("A:T") = ""
  wksh6.Range("A:T") = ""

        For i = 1 To wksh3.Cells(2, "B")
                If wksh10.Cells(i, "A") <> "" Then
                ''''''''''''''''''''''''''''''''''''''''''''''''''''''
                '''''''''Если ордер на продажу заносим его в Аски
                    If wksh10.Cells(i, "D") = "SELL" Then
                        x = 0
                        For u = 1 To wksh4.Cells(2, "K") + 3
                              If wksh10.Cells(i, "B") = wksh6.Cells(u, "A") Then
                                 x = 1
                                 wksh6.Cells(u, "A") = wksh10.Cells(i, "B")
                                 wksh6.Cells(u, Columns.Count).End(xlToLeft).Offset(, 1).Value = wksh10.Cells(i, "A")
                              End If
                        DoEvents
                        Next u
                        
                        If x = 0 Then
                           wksh6.Cells(Rows.Count, "A").End(xlUp).Offset(1).Value = wksh10.Cells(i, "B")
                           iRow = wksh6.Columns("A").Find(What:="*", LookIn:=xlValues, SearchDirection:=xlPrevious, SearchOrder:=xlByRows).Row
                           wksh6.Cells(iRow, Columns.Count).End(xlToLeft).Offset(, 1).Value = wksh10.Cells(i, "A")
                        End If
                    End If

                ''''''''''''''''''''''''''''''''''''''''''''''''''''''
                '''''''''Если ордер на покупку заносим его в Биды
                    If wksh10.Cells(i, "D") = "BUY" Then
                        n = 0
                        For u = 1 To wksh4.Cells(2, "J") + 3
                              If wksh10.Cells(i, "B") = wksh5.Cells(u, "A") Then
                                 n = 1
                                 wksh5.Cells(u, "A") = wksh10.Cells(i, "B")
                                 wksh5.Cells(u, Columns.Count).End(xlToLeft).Offset(, 1).Value = wksh10.Cells(i, "A")
                              End If
                        DoEvents
                        Next u
                        
                        If n = 0 Then
                           wksh5.Cells(Rows.Count, "A").End(xlUp).Offset(1).Value = wksh10.Cells(i, "B")
                           iRow = wksh5.Columns("A").Find(What:="*", LookIn:=xlValues, SearchDirection:=xlPrevious, SearchOrder:=xlByRows).Row
                           wksh5.Cells(iRow, Columns.Count).End(xlToLeft).Offset(, 1).Value = wksh10.Cells(i, "A")
                        End If
                    End If
                End If
        DoEvents
        Next i

'wksh5.UsedRange.Sort [a1], xlAscending, , , , , , xlNo
'wksh6.UsedRange.Sort [a1], xlAscending, , , , , , xlNo

End Function
ShamanK вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Циклы с неизвестным количеством повторений. vihlyaev Помощь студентам 1 19.03.2010 11:24
Сортировка строк Anarki Общие вопросы C/C++ 2 19.09.2009 20:06
Как разделить таблицу на много таблиц с количеством строк = 65535? Тупой SQL, базы данных 8 27.08.2009 12:35
Массив структур с заранее неизвестным количеством элементов, С++ PersonaGrata Общие вопросы C/C++ 8 24.02.2008 16:34
массив с заранее неизвестным числом элементов Var17 Общие вопросы Delphi 4 29.12.2007 08:20