Страницы: 1
RSS
из excel в word variable not set, ошибка в строке .Range.End
 
Макросом переносится в ворд таблица. Таблицы формируются разной высоты по автофильтру.
Поэтому количество строк для выделения всегда разное.
Вылетает ошибка. смысл ее ясен, где исправить - нет знаний.
Кстати, ошибка вылетает даже если прописать прямо 10 строку
re = appWD.ActiveDocument.Tables(1).Cell(10, 1).Range.End

Сам макрос

Sub В_DOC()
Dim appWD As Word.Application
Dim NamFil, strOutFileName As String
Dim rs, re As Range
Dim str As Double

'   имя файла
NamFil = "Приложение " & Split(Range("E7"), Chr(34))(1) & " " & Range("E6") & " " & Range("I7")

'  строк в ворде

str = Range("A1152")

Set appWD = CreateObject("Word.Application")
   
  Range("A4:B1167").Copy
   
   appWD.Documents.Add
   
   appWD.ActiveDocument.Range.PasteExcelTable False, False, False
       
   appWD.Visible = True
 
With appWD

  .Selection.WholeStory
  .Selection.Font.Name = "Times New Roman"
  .Selection.Font.Size = 8
  .Selection.Tables(1).Select
  .Selection.Tables(1).AutoFitBehavior wdAutoFitWindow
  '.Selection.Tables(1).Rows.HeightRule = wdRowHeightAuto
 
End With
 
With appWD.ActiveDocument.PageSetup
 
  .LeftMargin = 25  
  .RightMargin = 25
  .TopMargin = 25  
  .BottomMargin = 25
 End With
 
' выделить нужные строки в ворде и задать их высоту
 
   rs = appWD.ActiveDocument.Tables(1).Cell(6, 1).Range.Start

   re = appWD.ActiveDocument.Tables(1).Cell(str + 6, 1).Range.End ' ошибка Object variable or With block variable not set

  ' здесь могу ошибаться
  appWD.ActiveDocument.Range(rs, re).Select
  appWD.ActiveDocument.Selection.Tables(1).Rows.HeightRule = wdRowHeightExactly
  appWD.ActiveDocument.Selection.Tables(1).Rows.Height = 20

' сохраняем и закрываем

  strOutFileName = "R:\" & NamFil & ".doc"
  appWD.ActiveDocument.SaveAs Filename:=strOutFileName
  appWD.ActiveDocument.Close
 

End Sub
 
Похоже никто не помогает. Казанский, где ты? :))
 
Тут объявляются переменные rs (универсальный тип Variant) и re (тип Range):
Код
Dim rs, re As Range
Тут переменной re (тип Range) пытаются присвоить значение типа Long - возникает ошибка:
Код
re = appWD.ActiveDocument.Tables(1).cell(str + 6, 1).Range.End
Удалите в объявлении re "As Range" и ошибка исчезнет.
Далее, будут ошибки в строках (не определена константа wdRowHeightExactly и отсутствует свойство Selection):
Код
appWD.ActiveDocument.Selection.Tables(1).Rows.HeightRule = wdRowHeightExactly
appWD.ActiveDocument.Selection.Tables(1).Rows.Height = 20
У меня заработало в таком варианте:
Код
appWD.ActiveDocument.Tables(1).Rows.HeightRule = 2 'wdRowHeightExactly
appWD.ActiveDocument.Tables(1).Rows.Height = 20
Ну и в конце не забываем закрывать приложение Word:
Код
appWD.Quit
 
Ну у меня option explicit там .надо объявлять. Можно снять конечно. Попробую разумеется.
А как так : rs, re as range и один range  а другой variant? Если объявлять то

Dim rs as range

Dim re as range

Двумя строками?
Или dim re as range, rs as range? Объявлялся всегда через запятую одним типом.
 
Цитата
vral написал:
Казанский, где ты? )
А  посмотрите , когда он был тут в последний раз. Как думаете он ответит?

Код нужно корректно оформлятть, <,,,>  в меню окна сообщения
Цитата
vral написал:
Объявлялся всегда через запятую одним типом.
просто повезло ибо если поменять местами rs  и  re, то текущая ошибка пропадет, а вот в строке перед ней появится.
По вопросам из тем форума, личку не читаю.
 
Цитата
написал:
Dim rs as range
Dim re as range
Или
dim re as range, rs as range
Оба способа правильные.
Объявление типов для списка переменных не работает - для каждой переменной свой As Type писать нужно.
 
резюмируем.
Тип  rs и re - Variant

Код
    rs = appWD.ActiveDocument.Tables(1).Cell(6, 1).Range.Start
    re = appWD.ActiveDocument.Tables(1).Cell(str + 6, 1).Range.End

    appWD.ActiveDocument.Range(rs, re).Select
    appWD.Selection.Rows.HeightRule = wdRowHeightExactly
    appWD.Selection.Rows.Height = 10

Работает в таком виде. Смысл:  Selection -  это не все строки а выбранные.
поэтому
Код
 appWD.Selection.Rows.HeightRule
И наконец скажите - какой именно тип у rs и re? Не Range а именно Variant ? Или что-то чего я опять не знаю?
PS. После этого тему можно закрывать.
 
Цитата
vral написал:
какой именно тип у rs и re?
Long.
Типы можно смотреть самостоятельно через окно Watches, перенеся туда переменную после получения ей значения.
Так же можно еще и справку использовать(F1 или вбить свойство в поисковик).

P.S. Так-то вся тема к Word относится, а не к Excel...
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Поскольку appWD.ActiveDocument.Tables(1).Cell(6, 1).Range.Start (и .... .End) имеют тип Long (подсмотрел в отладчике), то его и нужно присваивать либо переменным типа Long, либо Variant (которому всё можно присваивать). Поэтому оба случая объявлений отработают без ошибок:
Код
Dim rs, re
или
Dim rs As Long, re As Long
Ошибка возникала из-за того, что переменной явно заданного типа Range присваивалось значение типа Long.
 
Всем спасибо. Ответы исчерпывающие.
Ещё раз благодарю
Страницы: 1
Наверх