Форум "Visual Basic"
Все о Бейсике
Функции или макросы для ExcelВ последнее время стоит передо мной цель по автоматизации некоторых действий в экселе. Рыться и опытным путём проверять работу каждой функции у меня нет особого расположения, поэтому если кто пользовался и знает, то будет быстрее спросить здесь. Есть тескст и цифра. Они записаны в одной ячейке и не разнесены в разные столбцы. Текст предшествует цифре. Задача: отсортировать ячейки по цифре. Надо добавить, что разрядность цифр не единообразная, то есть не 0001 и 1000, а 1, 30, 1000 и т. д. Есть ли возможность как-то отсортировать такой столбец по цифре, или отделить такую цифру в отдельный столбец? Сортировка нужна для корректного поиска по таблице. Чтобы цифра находилась в столбце с первого же Ctrl+F Иначе, если мы будем искать допустим 14, мы сначала получим 1401, потом 1402 и т. д. если они будут стоять раньше четырнадцати. Может быть известен какой-то особый способ поиска? ВАРИАНТ. Ну и ещё, если б это был текстовый файл, а не ячейка, то можно было бы написать программу, которая считывает символы, проверяет цифра это или буква, и буквы откидывает, а затем выдаёт только цифру. Если бы взять писать такой макрос, то как это можно было бы осуществить для ячейки? Скажем цикл такого рода. Пока не достигнут конец ячейки делать Если код символа находится в пределах цифровых значений, То запомнить символ. Конец цикла. Создать из запомненных символов слово. (как-то их соединить) Вот не знаю какие функции в Visual Basice это могут сделать и как это сделать применительно к ячейке. Есть вариант, конечно привести все цифры к единому виду, потом обрезать лишни буквы специальной функцией возвращающей значения определённого количества символов от правого края ячейки. Но это надо перелопачивать большой список и делать много редакторской работы. Может быть, можно автоматизировать её? Но, не знаю как. Если макросом, то наверное проще мой первый вариант.
|
|
Тебе нужно пробежаться по ячейкам в цикле по указаному в скрипте диапазону и произвести над данными некоторые манипуляции. Цыклы описаны ниже: When using Visual Basic, you often need to run the same block of statements on each cell in a range of cells. To do this, you combine a looping statement and one or more methods to identify each cell, one at a time, and run the operation. One way to loop through a range is to use the For...Next loop with the Cells property. Using the Cells property, you can substitute the loop counter (or other variables or expressions) for the cell index numbers. In the following example, the variable counter is substituted for the row index. The procedure loops through the range C1:C20, setting to 0 (zero) any number whose absolute value is less than 0.01. Another easy way to loop through a range is to use a For Each...Next loop with the collection of cells specified in the Range property. Visual Basic automatically sets an object variable for the next cell each time the loop runs. The following procedure loops through the range A1:D10, setting to 0 (zero) any number whose absolute value is less than 0.01. If you don't know the boundaries of the range you want to loop through, you can use the CurrentRegion property to return the range that surrounds the active cell. For example, the following procedure, when run from a worksheet, loops through the range that surrounds the active cell, setting to 0 (zero) any number whose absolute value is less than 0.01. Теперь насчет манипуляций над данными. Насколько я понял структура данных такова: текст(пробел)...текст(пробел)числоb>. Если это так, то чтоб вырезать число - тебе нужно вырезать текст начиная с последнего пробела до конца строки. для этого я бы 1)воспользовался функцией StrReverse (перевернул порядок следования символов строки на обратный) 2)удалил изначальные(те, что шли ПОСЛЕ числа) пробелы - функция LTrim (это необязательно 3)нашел бы позицию первого пробела - функция InStr (и это необязательно 4)скопировал бы в новую ячейку текст от начала до первого пробела - функции CInt, CDbl, Val MyValue = Val("2457") ' Returns 2457. MyValue = Val(" 2 45 7") ' Returns 2457. MyValue = Val("24 and 57") ' Returns 24. как видим замечательная функция Val перевоит в число все цифры в строке до первой буквы (при этом пробелы упускаются). Именно благодаря этому пункты 2 и 3 можно не выполнять, они автоматически выполняться в п.4. В конечном счете твой скрипт будет выглядеть примерно так: Private Sub CommandButton1_Click() Dim I As Integer I = 1 For Each c In ActiveCell.CurrentRegion.Cells c.Cells(1, 2).Value = StrReverse(Val(StrReverse(c.Value))) Next End Sub есть вот такая колонка цифр fdg fd 346 fdsgsdf gd 4536563 5dbd dgf56 gdh gfh5647567 t hegf hfgh56 57534 делаем активной любую из этих ячеек и жмем кнопку (или комбинацию горячих клавиш) по которой выпонится наш скрипт.... в соседней колонке получаем 346 4536563 56 5647567 5657534 Правда крута? Три строчки кода и сэкономлено вагон времени P.S. Гален с тебя пиво за то что я ночью смотрел в хелп Экселя. Кто его знает, еще кошмары будут снится. |
Написать ответ |
|
