Страницы: 1
RSS
Обращение к Excel из Word
 
Всем доброго, не могу понять, почему не выходит получить доступ к функции Cells из Word, и узнать номер последней занятой строки, в первом столбце?
Код
Sub Test ()
Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = True
objExcel.Workbooks.Add (1)
For i = 1 To 5
objExcel.Cells(i, 1).Select
objExcel.Cells(i, 1) = 12
objExcel.ActiveCell.Offset(i, 1).Select
Next i
rs = objExcel.Cells(Rows.Count, 1).End(xlUp).Row
objExcel.Quit
Set objExcel = Nothing
End Sub
 
Код
objExcel.Cells(i, 1).Select
objExcel это книга, у неё есть листы, а у листов ячейки, а Вы сразу к ячейкам пытаетесь обратиться.
И вообще Вам точно нужны эти "select"?!
Код
Option Explicit

Sub Test()
    Dim objExcel As Object
    Dim shX As Object
    
    Set objExcel = CreateObject("Excel.Application")
    objExcel.Visible = True
    
    Set shX = objExcel.Workbooks.Add.worksheets(1)
    
    shX.Cells(1, 5).Resize(5).Value = 12
    
    objExcel.Quit
    Set objExcel = Nothing
End Sub
Изменено: Wiss - 27.01.2020 12:49:49
Я не волшебник, я только учусь.
 
Спасибо, Select-ы не нужны, забыл убрать,  но я пробовал и по-разному, не получается:
Код
rs = objExcel.ActiveWorkbook.Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row
rs = objExcel.ActiveWorkbook.ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row

Wiss,Спасибо, но заполнение циклов просто для примера, чтобы руками не заполнять столбец, там не суть, мне важно узнать номер последней непустой строки первого столбца. Может и другие есть способы, но прям интересно почему не получается извне?
 
1. У меня Ворд не знает константы xlUp (я библиотеки специально не подключал) вместо этого можно написать (-4162)
2. Cells(Rows.Count, 1) не работает за счёт того, что Вы Эксель запускаете из макроса Ворда. Нужно прямо указать полный путь objExcel.ActiveWorkbook.ActiveSheet.Rows.Count.
Ну или если как у меня лист сразу в объектную переменную загнать, то shX.Rows.Count
3. А правильнее всего, наверное вообще через With.
Код
Sub Test()
    Dim objExcel As Object
    Dim rs
    
    Set objExcel = CreateObject("Excel.Application")
    objExcel.Visible = True
    
    With objExcel.Workbooks.Add.worksheets(1)
        .Cells(1, 5).Resize(5).Value = 12
        rs = .Cells(.Rows.Count, 1).End(-4162).Row
    End With
    
    objExcel.Quit
    Set objExcel = Nothing
End Sub

Изменено: Wiss - 27.01.2020 13:05:33
Я не волшебник, я только учусь.
 
Цитата
Дмитрий_DimAs написал:
почему не получается извне?
потому что делать надо правильно, а не как Вы хотите.
Rows.Count - это к чему по-Вашему относится, если не указываете, что это в какой-то книге Excel?
либо
Код
rs = objExcel.ActiveWorkbook.Sheets(1).Cells(objExcel.ActiveWorkbook.Sheets(1).Rows.Count, 1).End(xlUp).Row

либо
Код
With objExcel.ActiveWorkbook.Sheets(1)
rs = .Cells(.Rows.Count, 1).End(xlUp).Row
end with

так же надо объявить константу:
Код
const xlUp& = -4162

либо использовать это число напрямую, т.к. в Word нет такой в объектной модели.
Ознакомьтесь на досуге: Как из Excel обратиться к другому приложению
Основные принципы применимы к любым приложениям.
Изменено: Дмитрий(The_Prist) Щербаков - 27.01.2020 13:05:25
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Wiss, Дмитрий(The_Prist) Щербаков,  Спасибо, понял!
 
Wiss, Дмитрий(The_Prist) Щербаков, немного поэкспериментировал, создал несколько книг(две руками, две этим же макросом), наполнил первый столбец разным количество данных, и обратился к Exсel без персонализации книги и страницы вот так:
Код
x = objExcel.Cells(objExcel.Rows.Count, 1).End(-4162).Row

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

 
И? Я же не утверждал обратного. Я обратил Ваше внимание на то, что Вы вообще не указали в своем первоначальном коде тот факт, что Rows из Excel берется :)
И возвращение значения активной книги нормальное и правильное явление, т.к. если для Cells и Range не указывать родителя, то по умолчанию они относятся к активному листу активной на момент выполнения кода книге. Только надо быть внимательным в этом случае, чтобы случайно не попытаться получить данные ячеек из листа диаграмм.
А т.к. у Вас при этом еще и несколько экземпляров Excel - то так же логично, что данные берутся из последнего, т.к. objExcel скорее всего получаете методом GetObject.
Изменено: Дмитрий(The_Prist) Щербаков - 27.01.2020 20:03:40
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Страницы: 1
Наверх