Excel activecell specialcells 11

 +3 

   

Распечатать

Узнать последнюю строку можно следующими примерами:
1.

Код 1C v 8.х

 Сообщить(appExcel.WorkSheets(1).UsedRange.Row);   

2. метод определяет, когда закончились данные на листе:
SpecialCells(11) — «последняя» ячейка
Например, если нужен номер строки последней ячейки,

Код 1C v 8.х

 LastRow=ExcelApp.Cells(1,1).SpecialCells(11).Row;   

Для проверки нажмите в проверяемом файле ctrl+end. Посмотрите на какой строке остановится курсор.

Узнать последнюю колонку можно следующими примерами:
1.

Код 1C v 8.х

 Сообщить(appExcel.WorkSheets(1).UsedRange.Columns);   

2.

Код 1C v 8.х

 LastCol=ExcelApp.Cells(1,1).SpecialCells(11).Columns;   

Я
   Adecvator

13.11.12 — 18:15

Функция возвращает последнюю активную строку в последнем листе, а как сделать что бы получил из нужного мне листа, как сделать?

   Adecvator

1 — 13.11.12 — 18:16

Эксель    = СоздатьОбъект(«Excel.Application»);   //создаем объект

ЛистЭксел = Эксель.Workbooks.Open(СокрЛП(ИФ)).Sheets(2); //Открываем файл

// Чтобы знать размер листа, т.е. количество строк и количество

// столбцов, мы активируем его последнюю непустую ячейку

Эксель.Cells.SpecialCells(11).Activate();

КоличествоСтрок = Эксель.ActiveCell.Row;

  

ADirks

2 — 14.11.12 — 08:09

не в последнем, а в активном

nRows = Sheets(name).Cells.SpecialCells(11).Row

выражение Cells.SpecialCells(11).Row эквивалентно ActiveSheet.Cells.SpecialCells(11).Row  или ActiveWorkbook.ActiveSheet.Cells.SpecialCells(11).Row

Узнать последнюю строку можно следующими примерами:

1.

Код 1C v 8.х

 Сообщить(appExcel.WorkSheets(1).UsedRange.Row); 

2. метод определяет, когда закончились данные на листе:

SpecialCells(11) — «последняя» ячейка

Например, если нужен номер строки последней ячейки,

Код 1C v 8.х

 LastRow=ExcelApp.Cells(1,1).SpecialCells(11).Row; 

Для проверки нажмите в проверяемом файле ctrl+end. Посмотрите на какой строке остановится курсор.

Узнать последнюю колонку можно следующими примерами:

1.

Код 1C v 8.х

 Сообщить(appExcel.WorkSheets(1).UsedRange.Columns); 

2.

Код 1C v 8.х

 LastCol=ExcelApp.Cells(1,1).SpecialCells(11).Columns; 

Информация взята с сайта http://helpf.pro

Подпишитесь на нашу рассылку новостей

Хотите узнать больше по этому вопросу?

Подпишитесь на нашу рассылку новостей

Подписаться

Чтобы задать вопрос или предложить тему статьи, нажмите на кнопку ниже:

Предложить статью

Загрузка данных из табличных документов, созданных в редакторе Microsoft Excel – довольно часто встречающаяся задача в работе любого программиста 1С. Программа эта широко распространена, любима пользователями и часто используется для хранения и обработки различного рода информации, будь то прайс-лист или данные по продажам за период.

Существует несколько различных методов работы с файлами Excel при загрузке данных в 1С, в том числе:

1. загрузка с помощью свойства Cells;

2. загрузка с помощью метода Range и последующим обращением к данным через метод GetValue();

3. загрузка с помощью метода Range и последующим обращением к данным через свойство Value;

4. загрузка с помощью технологии ADO [2] и использованием компоненты GameWithFire [3].

Рассмотрим вышеперечисленные методы подробнее.

1. Загрузка данных с помощью свойства Cells

Этот метод используется в обработке «ЗагрузкаДанныхИзТабличногоДокумента.epf», которая присутствует на диске ИТС, и основан он на обращении к объекту Excel.Application через технологию COM с последующим последовательным чтением данных в ячейках обращением к свойству Cells.

Значение = ExcelЛист.Cells(Row,Column).Text;

Собственно, здесь все достаточно просто:

а) подключаемся к Excel

Попытка

Excel = Новый COMОбъект("Excel.Application");

Excel.WorkBooks.Open(ИмяФайла);

ExcelЛист = Excel.Sheets(1);

Исключение

Сообщить("Ошибка. Возможно, неверно указан номер листа книги Excel.");

Возврат Неопределено;

КонецПопытки;​

б) получаем диапазон данных на листе:

ActiveCell = Excel.ActiveCell.SpecialCells(11);

RowCount = ActiveCell.Row;

ColumnCount = ActiveCell.Column;​

в) последовательно считываем данные из файла:

Для Row = 1 По RowCount-1 Цикл

Для Column = 0 По ColumnCount-1 Цикл

Значение = Я.item(Row,Column+1).Value;

// здесь код, который использует данное значение

КонецЦикла;

КонецЦикла;​

 

Несомненно, такой способ гарантирует получение всех данных, содержащихся на листе Excel, однако он имеет весьма существенный недостаток – большую длительность работы при загрузке файлов больших объемов.

2. Загрузка данных с помощью метода Range и последующим обращением к данным через метод GetValue()

Этот метод так же основан на возможностях объекта Excel.Application, но, в отличие от загрузки с использованием свойства Cells, позволяет получить сразу все значения в виде двумерного массива. Работает следующим образом:

а) подключаемся к Excel (аналогично методу 1);

б) определяем диапазон используемых ячеек (аналогично методу 1)

в) считываем данные с помощью метода Range(начальнаяЯчейка, конечнаяЯчейка). Здесь начальная и конечная ячейки – это элементы свойства Cells, о котором шла речь выше.

Диапазон = ExcelЛист.Range(Я.item(1,1), Я.item(RowCount,ColumnCount)).Value;

В результате, в переменной Диапазон мы получим значение типа COMSafeArray, который представляет собой объектную оболочку над многомерным массивом SAFEARRAY. Иначе говоря, мы получаем массив, который, как известно, является областью памяти. А с областью в оперативной памяти работа всегда быстрее.

При этом надо учитывать, что массив этот многомерный. Для нашего случая это будет двумерный массив.

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

Для Row = 1 По RowCount-1 Цикл

Для Column = 0 По ColumnCount-1 Цикл

Значение = Диапазон.getValue(Column+1, Row);

// здесь код, который использует данное значение

КонецЦикла;

КонецЦикла;​

Данный метод работает значительно быстрее, чем чтение с помощью свойства Cells.

3. Загрузка данных с помощью метода Range и последующим обращением к данным через свойство Value

Этот метод отличается от предыдущего только тем, что вместо работы с объектом типа COMSafeArray мы сразу получаем набор значений в виде стандартного массива 1С (тип Массив).

Также, в приведенном листинге вместо метода Range используется свойство UsedRange, которое, по сути, идентично значению, возвращаемому методом Range для всей используемой области листа (это свойство не годится, если нужно прочитать только какую-то часть ячеек, в отличие от метода Range).

а) подключаемся к Excel (как и в предыдущих случаях)

б) считываем данные используя свойство UsedRange и метод Выгрузить()

Данные = ExcelЛист.UsedRange.Value.Выгрузить();

В результате, получаем двумерный массив типа Массив

в) последовательно получаем значения из массива

Для Row = 1 По RowCount-1 Цикл

Для Column = 0 По ColumnCount-1 Цикл

Значение = Данные[Column], [Row];

// здесь код, который использует данное значение

КонецЦикла;

КонецЦикла;​

Еще одним преимуществом данного метода является то, что каждый элемент массива Данные представляет собой массив, содержащий значение одной колонки считанного файла. Тем самым, мы можем сразу получить все возможные значения определенной колонки в виде массива, просто обратившись к соответствующему элементу переменной Данные.

 4. Загрузка данных с помощью технологии ADO и использованием компоненты GameWithFire

Данный способ использует технологию ADO [2], которая реализуется с помощью библиотеки ADOdb [4] и позволяет получать доступ к любым СУБД, реализующим технологию ODBC. Собственно, Excel попадает в данный список и, следовательно, мы можем получить данные, используя указанную технологию.

Также, для указанного метода используется компонента с оригинальным названием GameWithFire, которая перекладывает результат запроса через ADO в привычную таблицу значений.

Ниже приведен листинг части кода, который демонстрирует данную возможность. Пример во многом использует материал, описанный в источнике [1].

Запрос = "SEL ECT * FR OM [Лист1$]";

Попытка

ПодключитьВнешнююКомпоненту("GameWithFire.ADOUtils");

Исключение

ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Компонента GameWithFire не подключена!");

КонецПопытки;

ADOUtils = Новый ("AddIn.ADOUtils");

Connection = Новый COMОбъект("ADODB.Connection");

СтрокаПодключения="Provider=Microsoft.Jet.OLEDB.4.0; Data Source = "+ИмяФайла;

СтрокаПодключения=СтрокаПодключения+"; Extended Properties = "+"""Excel 8.0"+";HDR=NO;IMEX=1"";";

Попытка

Connection.Open(СтрокаПодключения);

Исключение

Сообщить(ОписаниеОшибки());

КонецПопытки;

Command =Новый COMОбъект("ADODB.Command");

//Создание объекта набора записей

RecordSet =Новый COMОбъект("ADODB.RecordSet");

//Указание активного соединения

Command.ActiveConnection = Connection;

//передает текст запроса

Command.CommandText = Запрос;

//определение типа команды

Command.CommandType =1;

//Выполнение и получение набора данных

RecordSet = Command.Execute();

ТЗ = ADOUtils.ADORecordsetToValueTable(Recordset);

// После того, как набор записей уже не нужен, его нужно закрыть

RecordSet.Close();

Connection.Close();​

В результате, получаем таблицу значений ТЗ, которую можем обойти любым известным образом.

Заключение

В заключение, мы хотели бы привести таблицу сравнения скорости работы вышеописанных методов и рекомендации для использования.

Замеры производились на файле Excel с числом строк 16 000 и числом колонок 20. Таким образом, общее число ячеек в области составило 320 000. Значения в таблице говорят сами за себя.

Таблица 1. Время загрузки данных из Excel в 1С при использовании различных методов

Метод загрузки

Длительность, с

С помощью Cells

996

С помощью Range() и GetValue()

38

С помощью Range() и свойство Value

32

С помощью ADO

3,3

Рекомендации по использованию:

1. Чтение с помощью Cells – когда нужно прочитать значения конкретных ячеек или небольших, несмежных областей.

2. Чтение с помощью Range – всегда, кроме случаев с очень большими файлами (сотни тысяч строк), так как в этом случае не нужно ничего, кроме Excel.

3. В случае, когда файлы очень большие, либо требуется особая выборка (связано это с тем, что технология ADO позволяет выполнять запрос на языке SQL к СУБД, а это весьма расширяет круг задач), так как требуется дополнительная компонента, да и строка соединения будет зависеть от версии используемого ПО.

You have no rights to post comments

Home / VBA / How to use Special Cells Method in VBA in Excel

In VBA, the Special Cells method you can select a cell or range of cells that are of a specific type and have a specific sort of value. Let’s say you want to know that in the range A1:A10 which cells have a formula and have numbered as a value? Well, you can get this result with the SpecialCells method.

Here we are writing code to know the address of the cell which is used last from the range A1:A10. Note that, in the special cell method there are two arguments out of which one is required and the other is optional.

  1. First, declare a variable as range to store that cell address returned by the code.
    2-declare-a-variable-as-range
  2. After that, refer to the range and use the “SpecialCells” method where you need to specify the “Type” argument with “xlCellTypeLastCell”.
  3. Next, set that special cell line of code to the variable that you have defined in the first step.
    3-use-the-specialcells-method
  4. From here, you need to use a VBA message box to get the address of the cells returns by the special cell method.
  5. In the end, use the address property with the variable to the get the address of the last type cell.
    4-vba-message-box-to-get-the-address

Here’s the full code.

Dim myRng As Range
Set myRng = Range("A1:A10").SpecialCells(xlCellTypeLastCell)
MsgBox myRng.Address

Now when you run this code, it will show you a message box with the address of the cell that has been used last (typed). So here in my case, I have used cell A10 and the same I got in the message box.

Select Cells with Notes

In Excel, old “Comments” are now “Notes”. When you write a code to select comments it will select the notes that you have in the range specified. Consider the following code.

Dim myRng As Range

Set myRng = _
Range("A1:A10").SpecialCells(xlCellTypeComments)

myRng.Select

Using Both of the Arguments

As I said earlier that you have two arguments in the SpecialCells method. Now, let’s see how you can use both arguments to select cells that have a formula, and that value that formula returns are a logical value.

Dim myRng As Range

Set myRng = Range("A1:A11").SpecialCells(xlCellTypeFormulas, xlLogical)

myRng.Select

Now when I run the above code, it selects the cells from the range A1 to A11 where I have formulas and a logical value.

Select Cells with Conditional Formatting

Range("A1:A11").SpecialCells(xlCellTypeSameFormatConditions)
Range("A1:A11").SpecialCells(xlCellTypeAllFormatConditions)

Select Visible Cells

And you can also select the visible using the “xlCellTypeVisible” constant. Consider the following code.

Dim myRng As Range

Set myRng = Range("A1:A11").SpecialCells(xlCellTypeVisible)

myRng.Select

Or you can also use the “12” as the argument value.

Dim myRng As Range

Set myRng = Range("A1:A11").SpecialCells(12)

myRng.Select

Cells with the Data Validation

Range("A1:A11").SpecialCells(xlCellTypeAllValidation)
Range("A1:A11").SpecialCells(xlCellTypeSameValidation)

More Tutorials

    • Count Rows using VBA in Excel
    • Excel VBA Font (Color, Size, Type, and Bold)
    • Excel VBA Hide and Unhide a Column or a Row
    • Excel VBA Range – Working with Range and Cells in VBA
    • Apply Borders on a Cell using VBA in Excel
    • Find Last Row, Column, and Cell using VBA in Excel
    • Insert a Row using VBA in Excel
    • Merge Cells in Excel using a VBA Code
    • Select a Range/Cell using VBA in Excel
    • SELECT ALL the Cells in a Worksheet using a VBA Code
    • ActiveCell in VBA in Excel
    • UsedRange Property in VBA in Excel
    • VBA AutoFit (Rows, Column, or the Entire Worksheet)
    • VBA ClearContents (from a Cell, Range, or Entire Worksheet)
    • VBA Copy Range to Another Sheet + Workbook
    • VBA Enter Value in a Cell (Set, Get and Change)
    • VBA Insert Column (Single and Multiple)
    • VBA Named Range | (Static + from Selection + Dynamic)
    • VBA Range Offset
    • VBA Sort Range | (Descending, Multiple Columns, Sort Orientation
    • VBA Wrap Text (Cell, Range, and Entire Worksheet)
    • VBA Check IF a Cell is Empty + Multiple Cells

    ⇠ Back to What is VBA in Excel

    Helpful Links – Developer Tab – Visual Basic Editor – Run a Macro – Personal Macro Workbook – Excel Macro Recorder – VBA Interview Questions – VBA Codes

    Like this post? Please share to your friends:
  • Excel active directory query
  • Excel active cells vba
  • Excel active cell column
  • Excel activate cell if
  • Excel access and sql