Помогите с сортировкой. Ламер

Программирование на Visual Basic for Applications
Георгий2
Обычный пользователь
Обычный пользователь
 
Сообщения: 64
Зарегистрирован: 23.03.2006 (Чт) 21:29
Откуда: Тбилиси, Грузия

Помогите с сортировкой. Ламер

Сообщение Георгий2 » 17.07.2007 (Вт) 18:08

Я увлечён решением неких вопросов связанных с грамматикой, морфологией, семантикой и т.д русского языка. И мне понадобилось обрабатывать в Excel весь массив слов великого и могучего. Я начал изучать VBA и конечно, как у всех новичков у меня возникают вопросы которые всем кажутся идиотскими. Но прошу быть снисходительными и помочь, тем более что речь идёт об 1-2 строках.
1й вопрос:
Как узнать количество непустых строк в данном столбце? Чтоб не делать в цикле каждый раз сравнение «если ячейка пустая, то…», а заранее задавать For i=1 To … Ячейки заполнены подряд, без пропусков. Наверняка существуют переменные, хранящие об этом информацию.
2й вопрос:
Мне надо сортировать столбцы. Много и во многих листах. В общем почти полтора миллиона слов, все слова русского языка со всеми словоформами, и со служебной информацией-более 20 ячеек на каждое слово, распихиваются по листам в зависимости от первой буквы,длины слова и тому подобное. После этого распихивания все столбцы во всех листах должны быть отсортированы.
Естественно, как все новички записал макрос и естественно получил это:
Columns("A:A").Select
ActiveWorkbook.Worksheets("Лист1").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Лист1").Sort.SortFields.Add Key:=Range("A1"), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Лист1").Sort
.SetRange Range("A1:A6")
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With

Использовав алгоритм Ламера-Лохштейна , метод исключения Тыка-Пальцева и тайные мантры «нах» и «сцуко», смог кардинально улучшить майкрософтовскую разработку и убрать лишние строки, уменьшив до:
ActiveWorkbook.Worksheets("Лист1").Sort.SortFields.Add Key:=Range("A1")
With ActiveWorkbook.Worksheets("Лист1").Sort
.SetRange Range("A1:A5")
.Apply
End With
Гениально, согласен, попрошу без оваций, но все же недостаточно!
Во-первых, наверняка есть более краткие формы с тем же результатом, каков их синтаксис ? во-вторых как сделать чтоб эти ("A:A"),("A1:A6"),("A1") можно было адресовать как переменные, ну типа Cells(i,j) чтоб блок сортировки поместить в цикл и переменными цикла задавались столбцы.

Теперь о том, что сперва надо не полениться и почитать то-то, то-то и неплохо было бы ещё и вот это.
Прочитано:
1. У.Орвис. Visual Basic for applications на примерах
2. И.Фролов . Энциклопедия Microsoft Office 2003
3. В.Кузьменко. Программирование на VBA 2002
4. В.Хорев . Самоучитель программирования на VBA в Microsoft Office
5. Уокенбах. Профессиональное программирование на VBA 2002
6. К.Фрай. Хитрости Excel
Не понято ни хрена - см. те же вышеизложенные 6 пунктов. Ну, а где не понято, там и не найдено!

Плюс недельное копание на Инет-просторах и почти полностью просмотренные 3 форума, включая этот.

Теперь насчёт надёжи и опоры- Хелпа, будь он неладен.

Из этого:
Range Object
Represents a cell, a row, a column, a selection of cells containing one or more contiguous blocks of cells, or a 3-D range.
Remarks
The following properties and methods for returning a Range object are described in the examples section:
Range property
Cells property
Range and Cells
Offset property
Union method
Example
Use Range(arg), where arg names the range, to return a Range object that represents a single cell or a range of cells. The following example places the value of cell A1 in cell A5.
Visual Basic for Applications
Worksheets("Sheet1").Range("A5").Value = _
Worksheets("Sheet1").Range("A1").Value
И т.д.

и этого:
Range.Sort Method
Sorts a range of values.
Syntax
expression.Sort(Key1, Order1, Key2, Type, Order2, Key3, Order3, Header, OrderCustom, MatchCase, Orientation, SortMethod, DataOption1, DataOption2, DataOption3)
expression A variable that represents a Range object.
И т.д.

составить осмысленную для компилятора фразу мне, ботанику, не удалось
На все варианты один ответ:
Run-time error ‘1004’
Невозможно получить свойство Sort класса Range
Такой же ответ на пример приведёный в Range.SortSpecial Method:
Sub SpecialSort()
Application.Range("A1:A5").SortSpecial SortMethod:=xlPinYin
End Sub


Я смутно осознаю, что диагноз иной, чем «даун» мне поставить нельзя, но это меня даже радует так как есть шанс что вы пожалеете имбецила и просто напишете то, что он просит, так как из его же поста ясно что втолковывать ему типа: «самоученье-свет, а спрашивать готовые ответы-тьма» просто бессмысленно! Ну, тупой! (С)

ЗЫ
Требования alibek-а, Большого Человека, аки тварь дрожащая, трепетно и внимательно прочитал, и скудным своим умишком посчитал что могу рискнуть задать вопросы. Господи спаси и помилуй мя, грешного!

:lol: :lol: :lol:

С позитивом ко всем!

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 17.07.2007 (Вт) 18:16

0) юзай тег [code]
1) WorksheetFunction.CountA
2) поскольку не понял, что нужно, то вот прототипчик
Код: Выделить всё

Sub Macro()
Dim i As Long
For i = 1 To 10
   Columns(i).Sort Columns(i)
Next
End Sub
Изображение

KL
Microsoft MVP
 
Сообщения: 483
Зарегистрирован: 30.10.2005 (Вс) 0:31
Откуда: Madrid

Re: Помогите с сортировкой. Ламер

Сообщение KL » 17.07.2007 (Вт) 18:29

Георгий2 писал(а):...Как узнать количество непустых строк в данном столбце?...


Код: Выделить всё
n=Application.CountA(Range("B:B"))
Привет,
KL

Георгий2
Обычный пользователь
Обычный пользователь
 
Сообщения: 64
Зарегистрирован: 23.03.2006 (Чт) 21:29
Откуда: Тбилиси, Грузия

Сообщение Георгий2 » 17.07.2007 (Вт) 18:39

Спасибо!!! Так сразу, ребята! вот я вам благодарен!

KL


Ещё один глупый вопрос:
вот так не работает
n = Sheets("Лист1").CountA(Range("A:A"))

чтоб контролировать лист, на котором должна происходить сортировка я сделал так:
Sheets("Лист1").Select
n = Application.CountA(Range("A:A"))

уродство!

А без этого Select как можно?

Спасибо!

KL
Microsoft MVP
 
Сообщения: 483
Зарегистрирован: 30.10.2005 (Вс) 0:31
Откуда: Madrid

Сообщение KL » 17.07.2007 (Вт) 19:18

Георгий2 писал(а):Спасибо!!! Так сразу, ребята! вот я вам благодарен!

KL


Ещё один глупый вопрос:
вот так не работает
n = Sheets("Лист1").CountA(Range("A:A"))

чтоб контролировать лист, на котором должна происходить сортировка я сделал так:
Sheets("Лист1").Select
n = Application.CountA(Range("A:A"))

уродство!

А без этого Select как можно?

Спасибо!



Код: Выделить всё
n = Application.CountA(Sheets("Лист1").Range("A:A"))
Привет,
KL

Георгий2
Обычный пользователь
Обычный пользователь
 
Сообщения: 64
Зарегистрирован: 23.03.2006 (Чт) 21:29
Откуда: Тбилиси, Грузия

Сообщение Георгий2 » 17.07.2007 (Вт) 19:19

Огромное спасибо!

Георгий2
Обычный пользователь
Обычный пользователь
 
Сообщения: 64
Зарегистрирован: 23.03.2006 (Чт) 21:29
Откуда: Тбилиси, Грузия

Сообщение Георгий2 » 17.07.2007 (Вт) 19:33

tyomitch
знаете, только на первом листе работает

Sheets("Лист1").Columns(j).Sort Columns(j)

а вот так - нет

Sheets("Лист2").Columns(j).Sort Columns(j)


и ни на каком другом, кроме 1го листа не работает

что же я неправильно делаю?

Георгий2
Обычный пользователь
Обычный пользователь
 
Сообщения: 64
Зарегистрирован: 23.03.2006 (Чт) 21:29
Откуда: Тбилиси, Грузия

Сообщение Георгий2 » 17.07.2007 (Вт) 19:40

а-а-а! вот что получается:
макрос должен быть на том же листе с которым он работает. То есть я перенес этот же макрос на 2 лист-он отсортировал 2лист а другие отказался, на 3 лист перенёс-сработал только с третьим

есть ли выход? подскажите пожалуйста

Георгий2
Обычный пользователь
Обычный пользователь
 
Сообщения: 64
Зарегистрирован: 23.03.2006 (Чт) 21:29
Откуда: Тбилиси, Грузия

Сообщение Георгий2 » 17.07.2007 (Вт) 21:28

KL, я понимаю что забодал, но не работает нормально, доведите благое дело помощи до конца, прошу вас!

в такой форме работает безотказно:
n = Application.CountA(Sheets("Лист3").Range("B:B"))


а в такой-только в пределах того листа, на котором макрос записан
n = Application.CountA(Sheets("Лист3").Range(Cells(1, 2), Cells(100, 2)))

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 17.07.2007 (Вт) 21:33

Sheets("Лист2").Columns(j).Sort Sheets("Лист2").Columns(j)
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 17.07.2007 (Вт) 21:35

и, соответственно, CountA(Sheets("Лист3").Range(Sheets("Лист3").Cells(1, 2), Sheets("Лист3").Cells(100, 2)))
Изображение

KL
Microsoft MVP
 
Сообщения: 483
Зарегистрирован: 30.10.2005 (Вс) 0:31
Откуда: Madrid

Сообщение KL » 17.07.2007 (Вт) 21:36

Георгий2 писал(а):KL, я понимаю что забодал, но не работает нормально, доведите благое дело помощи до конца, прошу вас!

в такой форме работает безотказно:
n = Application.CountA(Sheets("Лист3").Range("B:B"))


а в такой-только в пределах того листа, на котором макрос записан
n = Application.CountA(Sheets("Лист3").Range(Cells(1, 2), Cells(100, 2)))


Код: Выделить всё
Sub test()
    Dim i As Long
    For i = 1 To ThisWorkbook.Worksheets.Count
        With ThisWorkbook.Worksheets(i)
            MsgBox Application.CountA(.Range(.Cells(1, 2), .Cells(100, 2)))
        End With
    Next i
End Sub
Привет,
KL

Георгий2
Обычный пользователь
Обычный пользователь
 
Сообщения: 64
Зарегистрирован: 23.03.2006 (Чт) 21:29
Откуда: Тбилиси, Грузия

Сообщение Георгий2 » 17.07.2007 (Вт) 23:55

Не знаю как благодарить! Очень, очень помогли! Спасибо!


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 117

    TopList  
cron