Я увлечён решением неких вопросов связанных с грамматикой, морфологией, семантикой и т.д русского языка. И мне понадобилось обрабатывать в 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-а, Большого Человека, аки тварь дрожащая, трепетно и внимательно прочитал, и скудным своим умишком посчитал что могу рискнуть задать вопросы. Господи спаси и помилуй мя, грешного!
С позитивом ко всем!