#vba #excel
#vba #excel
Вопрос:
У меня есть рабочий лист, содержащий несколько страниц, и каждая страница содержит имя и некоторую другую информацию, я использую этот код :
Dim Area as String
For i=1 to 10000
If worksheets(1).cells(i,4)=name then
Area=worksheets(1).cells(i,4).CurrentRegion.Address
End If
Next i
код работает, однако он выбирает только область, рядом с которой находится имя, и я хочу, чтобы он выбирал всю страницу (на листе несколько страниц) вместо небольшой области вокруг имени, есть ли способ сделать это с помощью CurrentRegion? или, возможно, есть другое свойство, которое я могу использовать вместо этого?
Я повсюду искал ответ на аналогичный вопрос и, однако, безуспешно, благодаря всем ответам.
Комментарии:
1. Что вы подразумеваете под «страницей» в рабочих листах?
2. Что-то вроде разрывов страниц между несколькими разделами на одном листе (что-то вроде той же концепции MSWord)
3. Что вы хотите сделать со страницей, содержащей имя? Выбор диапазона, а затем выполнение чего-либо с выделением неэффективно. Гораздо лучше использовать диапазон непосредственно внутри свойства или метода, который вы хотите применить.
Ответ №1:
Ваши комментарии показывают, что вы знаете, что разрывы страниц будут играть определенную роль в ответе.
Приведенный ниже код отобразит предварительный просмотр страницы, на которой находится диапазон, анализируемый в Name. Если лист содержит более одной страницы, определяемой WS.HPageBreaks.Count
, то выполняйте цикл через HPageBreaks
, пока HPageBreak
строка меньше строки с именем анализируемого диапазона.
Sub PrintSheetContainingTarget(Name As String)
'assumes sheet containing Name has no VPageBreaks
'(i.e. sheet is one printed page wide)
Dim WS As Worksheet
Dim Break As HPageBreak
Dim Page As Long
Page = 1 'initialise Page in case only one page on sheet
Set WS = Range(Name).Worksheet
If WS.HPageBreaks.Count > 0 Then
For Each Break In WS.HPageBreaks
If Break.Location.Row < Range(Name).Row Then
Page = Page 1
End If
Next
End If
'display print preview of Page
WS.PrintOut Page, Page, 1, True
End Sub
Sub PrintWrapper()
Call PrintSheetContainingTarget("Target")
End Sub
Я предполагаю, что вы хотите распечатать страницу, содержащую Name
но если вы хотите сделать что-то другое, замените WS.PrintOut Page, Page, 1, True
кодом для достижения вашей цели.
Ответ №2:
Измените свой код, чтобы
If worksheets(1).cells(i,4)=name then
Area = WorkSheets(1).Name amp; "!" amp; "A1:XFD1048576"
' You may modify this line to dynamically get max rows @ 65k for Excel 2003, etc.
End If
Комментарии:
1. Этот код будет выбирать только статические страницы, мне вроде как нужно что-то, что зависит от разрывов страниц вместо статического адреса, поскольку размер страниц будет меняться.
2. Как насчет того, чтобы попробовать
Area = ActiveSheet.PageSetup.PrintArea
3. По-прежнему безуспешно, я нашел кое-что на веб-сайте Microsoft, касающееся свойств разрыва страницы, я попробую поработать с этим, в любом случае, спасибо за ваши ответы и время, приятель, высоко ценится!