Excel vba переключение между книгами excel

 

Russia

Пользователь

Сообщений: 138
Регистрация: 01.01.1970

Добрый вечер!  
Задаю листы.  
Set wb = ThisWorkbook  
Sheets(a).Select  
Sheets(a(i)).Columns(«E:F»).Cut  
Columns(«A:A»).Select  
Selection.Insert Shift:=xlToRight  
Set nb = Workbooks.Add  
Set ws = nb.Sheets(1)  
With ws  
.Select  
.Name = «Результат»  
.Rows(«1:4»).Select  
ActiveWindow.FreezePanes = True  
End With  
lastrow = sh.Cells(8, 5).End(xlDown).Row  
k = 4 ‘заполнение под «шапкой»  
For RowFind_ll = 8 To lastrow ‘ цикл по ТП  
RowFind_l = RowFind_ll  
n = 1 ‘порядковый номер  
Range(Cells(RowFind_l, 4), Cells(lastrow, 4)).Select ‘ —> Здесь почему то стопорится из-за того что не переключается на другую книгу. Подскажите пжл, как исправить.  
Selection.Find(What:=»», After:=ActiveCell, LookAt:=xlPart).Select  
RowFind_ll = Selection.Row  
next RowFind_ll    

  //  
Пробовал указывать перед этой строчкой sh.select — тоже не переключается  
Windows(«Лист1»).Activate — Можно как-нибудь обойтись без этой строчки, т.к. надо будет вытаскивать имя книг и т.п. Мне казалось что это проще делает.  

  P.S.Заранее спасибо за любой совет, решение.

 

Johny

Пользователь

Сообщений: 2737
Регистрация: 21.12.2012

Я дико извиняюсь, но можно ли узнать, что вообще этот код делает?  
И очень непонятно вот это: Set wb = ThisWorkbook. И где эта «wb» используется?

There is no knowledge that is not power

 

ikki

Пользователь

Сообщений: 9709
Регистрация: 22.12.2012

а вот эта строка у вас нормально срабатывает?  

  lastrow = sh.Cells(8, 5).End(xlDown).Row

фрилансер Excel, VBA — контакты в профиле
«Совершенствоваться не обязательно. Выживание — дело добровольное.» Э.Деминг

 

Johny

Пользователь

Сообщений: 2737
Регистрация: 21.12.2012

lastrow = sh.Cells(8, 5).End(xlDown).Row  

  Что за переменная «sh»?

There is no knowledge that is not power

 

Russia

Пользователь

Сообщений: 138
Регистрация: 01.01.1970

{quote}{login=Johny}{date=05.05.2011 05:06}{thema=Re: VBA Как переключать окна/книги?}{post}Я дико извиняюсь, но можно ли узнать, что вообще этот код делает?  
И очень непонятно вот это: Set wb = ThisWorkbook. И где эта «wb» используется?{/post}{/quote}  
Извиняюсь пару строчек забыл захватить. Я писал. И вся используется. И хотелось бы что бы когда я писал sh.select — становилась активной книга ThisWorkbook, а не получается — не переключается на окно этой книги, остается в новой книге и выдает ошибку.  
lastrow = sh.Cells(8, 5).End(xlDown).Row — это мои опыты, чтобы производил операции с листом sh (книге где находиться макрос). Работает. Но если задавать sh.cells(…)… — то выдает ошибку на подобии вышеописанного.  

    Set wb = ThisWorkbook  
Sheets(a).Select  
Sheets(a(i)).Columns(«E:F»).Cut  
Columns(«A:A»).Select  
Selection.Insert Shift:=xlToRight  
Set nb = Workbooks.Add  
Set ws = nb.Sheets(1)  
With ws  
.Select  
.Name = «Результат»  
.Rows(«1:4»).Select  
ActiveWindow.FreezePanes = True  
End With  

  For Each sh In wb.Worksheets    
Set sh = wb.Sheets(a(i))  
lastrow = sh.Cells(8, 5).End(xlDown).Row  
k = 4 ‘заполнение под «шапкой»  
For RowFind_ll = 8 To lastrow ‘ цикл по ТП  
RowFind_l = RowFind_ll  
n = 1 ‘порядковый номер  
Range(Cells(RowFind_l, 4), Cells(lastrow, 4)).Select ‘ —> Здесь почему то стопорится из-за того что не переключается на другую книгу. Подскажите пжл, как исправить.  
Selection.Find(What:=»», After:=ActiveCell, LookAt:=xlPart).Select  
RowFind_ll = Selection.Row  
next RowFind_ll    
next sh

 

ikki

Пользователь

Сообщений: 9709
Регистрация: 22.12.2012

имхо, здесь имеем довольно дикую смесь результатов работы макрорекодера и каких-то (не очень понятных) попыток их доработки.  
много мусора — те же ActiveWindow.FreezePanes = True, .Rows(«1:4»).Select и др.  

  возможно, проще озвучить саму задачу?

фрилансер Excel, VBA — контакты в профиле
«Совершенствоваться не обязательно. Выживание — дело добровольное.» Э.Деминг

 

Russia

Пользователь

Сообщений: 138
Регистрация: 01.01.1970

{quote}{login=The_Prist}{date=05.05.2011 05:25}{thema=}{post}Вот эта строка:  
ActiveWindow.FreezePanes = True  

  будет работать только с активным листом. Так что если нужно закрепление областей, то активировать лист все равно придется.  
Но самое интересное, что вы спрашиваете про строку Windows(«Лист1»).Activate, которая напрочь отсутствует в коде.{/post}{/quote}  

  Блин. Хорошо. Как сделать активным этот лист? А потом другой лист из другой книги (ThisWorkbook)?

 

Johny

Пользователь

Сообщений: 2737
Регистрация: 21.12.2012

ikki, Согласен полностью.  
russia, попытайтесь ещё раз описать, для чего нужен сей макрос?

There is no knowledge that is not power

 

Johny

Пользователь

Сообщений: 2737
Регистрация: 21.12.2012

{quote}{login=russia}{date=05.05.2011 05:32}{thema=Re: }{post}  
Блин. Хорошо. Как сделать активным этот лист? А потом другой лист из другой книги (ThisWorkbook)?{/post}{/quote}  
Зачем активировать листы? Запиши нужные листы в переменные — и обращайся к ним.

There is no knowledge that is not power

 

Russia

Пользователь

Сообщений: 138
Регистрация: 01.01.1970

{quote}{login=ikki}{date=05.05.2011 05:29}{thema=}{post}имхо, здесь имеем довольно дикую смесь результатов работы макрорекодера и каких-то (не очень понятных) попыток их доработки.  
много мусора — те же ActiveWindow.FreezePanes = True, .Rows(«1:4»).Select и др.  

  возможно, проще озвучить саму задачу?{/post}{/quote}  

  Задача. Мне необходимо создать Новую книгу для помещения туда результатов, переключиться на неё и заполнить в ней Шапку(действие1). Далее переключиться в книгу «This» и выполнить действие2. Результаты действия 2 занести в новую книгу.

 

Russia

Пользователь

Сообщений: 138
Регистрация: 01.01.1970

{quote}{login=Johny}{date=05.05.2011 05:39}{thema=Re: Re: }{post}{quote}{login=russia}{date=05.05.2011 05:32}{thema=Re: }{post}  
Блин. Хорошо. Как сделать активным этот лист? А потом другой лист из другой книги (ThisWorkbook)?{/post}{/quote}  
Зачем активировать листы? Запиши нужные листы в переменные — и обращайся к ним.{/post}{/quote}  
Так и делал! Стопорится на том моменте что указал в теме.

 

Hugo

Пользователь

Сообщений: 23249
Регистрация: 22.12.2012

Так именно в этой строке ссылки на лист нет.  
Если бы было типа так:  
sh.Range(sh.Cells(RowFind_l, 4), sh.Cells(lastrow, 4)).Select  
вот это было бы «так и делал».  
Но тогда селект уже не нужен, разве что как финальное действие — показать юзеру результат.

 

Russia

Пользователь

Сообщений: 138
Регистрация: 01.01.1970

{quote}{login=Hugo}{date=05.05.2011 06:11}{thema=}{post}Так именно в этой строке ссылки на лист нет.  
Если бы было типа так:  
sh.Range(sh.Cells(RowFind_l, 4), sh.Cells(lastrow, 4)).Select  
вот это было бы «так и делал».  
Но тогда селект уже не нужен, разве что как финальное действие — показать юзеру результат.{/post}{/quote}  
Пробовал:  
Range(sh.Cells(RowFind_l, 4), sh.Cells(lastrow, 4)).Select  
и  
sh.Range(Cells(RowFind_l, 4), Cells(lastrow, 4)).Select  
//  
Пойду проверять.

 

Hugo

Пользователь

Сообщений: 23249
Регистрация: 22.12.2012

Ну значит недопробовали:)  
Только я в Вашем примере нигде не видел, где эта sh определяется…

 

Russia

Пользователь

Сообщений: 138
Регистрация: 01.01.1970

{quote}{login=Hugo}{date=05.05.2011 06:21}{thema=}{post}Ну значит недопробовали:)  
Только я в Вашем примере нигде не видел, где эта sh определяется…{/post}{/quote}  
Сообщение от 05.05.2011, 17:28  
в середине указывается.

 

Hugo

Пользователь

Сообщений: 23249
Регистрация: 22.12.2012

Да, там я не вникал.  
Но вот это как понимать?  
For Each sh In wb.Worksheets    
Set sh = wb.Sheets(a(i))

 

Johny

Пользователь

Сообщений: 2737
Регистрация: 21.12.2012

{quote}{login=russia}{date=05.05.2011 06:51}{thema=Re: }  
Range(Cells(RowFind_l, 4), Cells(lastrow, 4)).Select ‘ —> Здесь почему то стопорится из-за того что не переключается.{/post}{/quote}  
Здесь имеется ввиду активный лист.

There is no knowledge that is not power

 

Johny

Пользователь

Сообщений: 2737
Регистрация: 21.12.2012

Range(Cells(RowFind_l, 4), Cells(lastrow, 4)).Select ‘ —> Здесь почему то стопорится из-за того что не переключается

There is no knowledge that is not power

 

{quote}{login=Hugo}{date=05.05.2011 07:28}{thema=}{post}Да, там я не вникал.  
Но вот это как понимать?  
For Each sh In wb.Worksheets    
Set sh = wb.Sheets(a(i)){/post}{/quote}  
Это были эксперименты запустить макрос :)  
А так он должно быть:  
Set sh = wb.Sheet(a)  (наверное)  

  Хотел чтобы этот цикл по листам книги прошелся, поэтому написал это:  
For Each sh In wb.Worksheets  

  Проверил — лист один только берет.  
Может нужно так написать?  
For i = 0 To UBound(a)  
ind = 0  
For Each sh In wb.Worksheets

 

Russia

Пользователь

Сообщений: 138
Регистрация: 01.01.1970

{quote}{login=}{date=05.05.2011 09:01}{thema=Re: }{post}{quote}  
For i = 0 To UBound(a)  
For Each sh In wb.Worksheets{/post}{/quote}

 

Russia

Пользователь

Сообщений: 138
Регистрация: 01.01.1970

хотел написать  
{quote}{login=}{date=05.05.2011 09:01}{thema=Re: }{post}  
For i = 0 To UBound(a)  
For Each sh In wb.Worksheets{/post}{/quote}

 

Hugo

Пользователь

Сообщений: 23249
Регистрация: 22.12.2012

Это уже ближе.  
Но ведь если  
For Each sh In wb.Worksheets  
то в sh уже есть ссылка на лист, и  
Set sh = wb.Sheets(a(i))  
совершенно лишнее, и даже вероятно только мешает.  
Или одно, или другое.

 

Russia

Пользователь

Сообщений: 138
Регистрация: 01.01.1970

{quote}{login=Hugo}{date=05.05.2011 09:08}{thema=}{post}Это уже ближе.  
Но ведь если  
For Each sh In wb.Worksheets  
то в sh уже есть ссылка на лист, и  
Set sh = wb.Sheets(a(i))  
совершенно лишнее, и даже вероятно только мешает.  
Или одно, или другое.{/post}{/quote}  
Да я тоже об этом думал, но просто макрос не работал, вот я и подумал, что может нужно задать.  
Спасибо, Hugo!

 

Юрий М

Модератор

Сообщений: 60570
Регистрация: 14.09.2012

Контакты см. в профиле

#24

05.05.2011 21:40:05

Возвращаясь к переключению между книгами:  
Windows(«Нужная_Книга.xls»).Activate

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

Просто перечислите все открытые книги с VBA
Составьте список всех открытых книг и легко переключитесь на книгу с помощью VBA
Составьте список всех открытых книг и легко переходите к рабочей книге с помощью замечательного инструмента


Просто перечислите все открытые книги с VBA

В этом разделе вы узнаете, как использовать код VBA для вывода списка всех открытых книг в Excel.

1. Нажмите другой + F11 , чтобы открыть Microsoft Visual Basic для приложений окно. в Microsoft Visual Basic для приложений окна, нажмите Вставить > Модули.

2. Затем скопируйте и вставьте приведенный ниже код VBA в редактор кода.

VBA: список всех открытых имен книг в Excel

Sub ListWorkbooks()
	Dim Rng As Range
	Dim WorkRng As Range
	On Error Resume Next
	xTitleId = "KutoolsforExcel"
	Set WorkRng = Application.Selection
	Set WorkRng = Application.InputBox("Out put to (single cell)", xTitleId, WorkRng.Address, Type: = 8)
	Set WorkRng = WorkRng.Range("A1")
	xNum1 = Application.Workbooks.Count
	For i = 1 To xNum1
		xNum2 = Application.Workbooks(i).Sheets.Count
		WorkRng.Offset(i - 1, 0).Value = Application.Workbooks(i).Name
		For j = 1 To xNum2
			WorkRng.Offset(i - 1, j).Value = Application.Workbooks(i).Sheets(j).Name
		Next
	Next
End Sub

3. Запустите код VBA, нажав кнопку F5 ключ. в KutoolsforExcel диалоговом окне укажите ячейку для размещения списка книг, а затем щелкните значок OK кнопка. Смотрите скриншот:

Затем перечисляются все открытые книги с соответствующими листами.

Трудно обрабатывать код VBA? Вы можете добиться этого через третий метод с кликами.


Составьте список всех открытых книг и легко переключитесь на книгу с помощью VBA

Если вы хотите перечислить все книги, чтобы легко переключаться между ними, попробуйте использовать VBA следующим образом:

1. нажмите другой + F11 для открытия Microsoft Visual Basic для приложений окно. в Microsoft Visual Basic для приложений окна, нажмите Вставить > Модули.

2. Скопируйте и вставьте следующий код VBA в открытое окно модуля.

Код VBA: перечислить все открытые книги и перейти к книге

Sub SelectWB()
	Dim xWBName As String
	Dim xWb As Workbook
	Dim xSelect As String
	For Each xWb In Application.Workbooks
		xWBName = xWBName & xWb.Name & vbCrLf
	Next
	xTitleId = "KutoolsforExcel"
	xSelect = Application.InputBox("Enter one of the workbooks below:" & vbCrLf & xWBName, xTitleId, "", Type: = 2)
	Application.Workbooks(xSelect).Activate
End Sub

3. нажмите F5 ключ для запуска кода. Потом KutoolsforExcel появится диалоговое окно со списком всех открытых книг. Если вы хотите перейти к указанной книге, введите имя этой книги в поле и нажмите кнопку OK кнопка. Смотрите скриншот:


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

Для Панель навигации of Kutools for Excel, все открытые книги будут автоматически перечислены на панели, чтобы вы могли легко перемещаться между всеми открытыми книгами. Вам просто нужно щелкнуть одну из открытых книг, и она сразу же перейдет к этой книге.

  Если вы хотите получить бесплатную пробную версию (30-день) этой утилиты, пожалуйста, нажмите, чтобы загрузить это, а затем перейдите к применению операции в соответствии с указанными выше шагами.


Лучшие инструменты для работы в офисе

Kutools for Excel Решит большинство ваших проблем и повысит вашу производительность на 80%

  • Снова использовать: Быстро вставить сложные формулы, диаграммы и все, что вы использовали раньше; Зашифровать ячейки с паролем; Создать список рассылки и отправлять электронные письма …
  • Бар Супер Формулы (легко редактировать несколько строк текста и формул); Макет для чтения (легко читать и редактировать большое количество ячеек); Вставить в отфильтрованный диапазон
  • Объединить ячейки / строки / столбцы без потери данных; Разделить содержимое ячеек; Объединить повторяющиеся строки / столбцы… Предотвращение дублирования ячеек; Сравнить диапазоны
  • Выберите Дубликат или Уникальный Ряды; Выбрать пустые строки (все ячейки пустые); Супер находка и нечеткая находка во многих рабочих тетрадях; Случайный выбор …
  • Точная копия Несколько ячеек без изменения ссылки на формулу; Автоматическое создание ссылок на несколько листов; Вставить пули, Флажки и многое другое …
  • Извлечь текст, Добавить текст, Удалить по позиции, Удалить пробел; Создание и печать промежуточных итогов по страницам; Преобразование содержимого ячеек в комментарии
  • Суперфильтр (сохранять и применять схемы фильтров к другим листам); Расширенная сортировка по месяцам / неделям / дням, периодичности и др .; Специальный фильтр жирным, курсивом …
  • Комбинируйте книги и рабочие листы; Объединить таблицы на основе ключевых столбцов; Разделить данные на несколько листов; Пакетное преобразование xls, xlsx и PDF
  • Более 300 мощных функций. Поддерживает Office/Excel 2007-2021 и 365. Поддерживает все языки. Простое развертывание на вашем предприятии или в организации. Полнофункциональная 30-дневная бесплатная пробная версия. 60-дневная гарантия возврата денег.

вкладка kte 201905


Вкладка Office: интерфейс с вкладками в Office и упрощение работы

  • Включение редактирования и чтения с вкладками в Word, Excel, PowerPoint, Издатель, доступ, Visio и проект.
  • Открывайте и создавайте несколько документов на новых вкладках одного окна, а не в новых окнах.
  • Повышает вашу продуктивность на 50% и сокращает количество щелчков мышью на сотни каждый день!

офисный дно

Формулировка задачи:

Открыты 2 книги. Одна — источник данных (название всегда разное). Другая — приемник. Название всегда «Книга1». Как переключиться с источника на приемник, понятно. А вот как обратно, если неизвестно название книги? Открыты только эти две.

Код к задаче: «Переключение между книгами»

textual

Dim wb As Workbook
For Each wb In Workbooks
    If Not wb Is ActiveWorkbook Then    'не текущая книга
        If wb.Windows(1).Visible Then   'не PERSONAL.XLS и др. скрытые
            wb.Activate
            GoTo 1
        End If
    End If
Next
MsgBox "Другая книга не найдена", vbExclamation
1 'продолжение программы

Полезно ли:

6   голосов , оценка 4.000 из 5

Модератор:Naeel Maqsudov

vint

Сообщения:37
Зарегистрирован:19 мар 2009, 16:53

Не знаю, может вопрос глупый но я в затупе!
Есть база, при открытии книги запускается форма (их там много).
В эти формы по мере необходимости надо заносить (копировать) из различных excel документов данные . Но при активной UserForm нет никакой возможности не то что бы запустить но и даже активировать раннее открытый другой excel файл.
есть ли выход :confused:

Аватара пользователя

EducatedFool

Сообщения:196
Зарегистрирован:06 апр 2008, 14:03
Откуда:Россия, Урал
Контактная информация:

08 май 2009, 14:31

У формы есть свойство ShowModal
Значение этого свойства по умолчанию — TRUE
Установите это свойство в FALSE, и проблема исчезнет.

Макросы для Excel, Word, CorelDRAW. Быстро, профессионально, недорого. http://ExcelVBA.ru/

Благодарности принимаются на кошелёк WebMoney: R318574877619 и Яндекс.Деньги: 41001335672216

vint

Сообщения:37
Зарегистрирован:19 мар 2009, 16:53

08 май 2009, 14:56

Точно !!!
Спасибо большое!- не знал!!
Теперь другая проблема, появился доступ к листам самой базы- а это не хорошо.Я специально поставил на всех формах запрет закрытия по крестику и пароль который убирается со всех листов книги при открытии книги(чтобы не мешал работе макросов) и одновременном запуске главной формы а при закрытии (закрыть можно только с главной) происходит установка пароля на все листы и автозакрытие книги. Таким образом я не давал возможность юзеру попасть на листы этой базы, даже если он в момент запуска отключит макросы можно только полистать листы — пароль снят не будет. Тоесть в Вашем предложенном варианте появляется доступ к листам базы тогда когда уже пароль снят и там можно накуралесить делов тока держись — кладовщицы народ шустрый ;) .
Наверно в таком случае мне надо подумать над другим способом защиты листов базы, чоб макрос работал а ручки нет.

Аватара пользователя

Naeel Maqsudov

Сообщения:2551
Зарегистрирован:20 фев 2004, 19:17
Откуда:Moscow, Russia
Контактная информация:

08 май 2009, 15:11

А как на счет скрытых листов.
На тулбаре «Элементы управления» есть кнопка «Свойства».
Стоя на листе в свойстве Visible можно установить значение 2, и тогда лист нельзя будет сделать видимым даже при помощи Формат/Лист/Показать (только из редактора VBA)
Тогда может и заморочки с паролями не понядобятся?

vint

Сообщения:37
Зарегистрирован:19 мар 2009, 16:53

08 май 2009, 19:55

Спасибо!
Мысль конешно интересная но как это сделать в моём случае?
число листов в базе колеблется в районе 200 и самое интересное их число непрерывно (в процессе работы с базой) изменяется программно, как добавляются так и удаляются, а пользователь видит только первый лист за формой которому я просто поставил зелёный фон и ярлычки от листов которые он не может активировать(поэтому он и не видит что происходит на рабочих листах). Если бы это сделать как с установкой/снятием паролей одновременно на все листы сколько бы их там не было который я использую

Код: Выделить всё

Sub ProtectAllSheets()
'защищаем все листы
Dim Sh As Worksheet
    For Each Sh In ThisWorkbook.Sheets
        Sh.Protect Password:="*****", Contents:=True, Scenarios:=True, UserInterfaceOnly:=True
    Next
    MsgBox "Все листы защищены!", vbInformation, "Защита"
End Sub

Аватара пользователя

Naeel Maqsudov

Сообщения:2551
Зарегистрирован:20 фев 2004, 19:17
Откуда:Moscow, Russia
Контактная информация:

08 май 2009, 23:16

Нет ничего проще

If Sh.Index>1 then Sh.Visible=2

… и спрятали всё, кроме первого

vint

Сообщения:37
Зарегистрирован:19 мар 2009, 16:53

09 май 2009, 14:00

Действительно! Что то я протупил.
но теперь другое, иногда программе надо выбрать лист (например перед загрузкой диапазона в комбобокс из 6 колонок), метод селект завершен неверно, наверно надо перед этим на время делать так Sh.Visible=-1 а потом Sh.Visible=2
Я на верном пути ? Или есть другой выход?
Большой спасибо за помощь!

Аватара пользователя

EducatedFool

Сообщения:196
Зарегистрирован:06 апр 2008, 14:03
Откуда:Россия, Урал
Контактная информация:

09 май 2009, 15:37

Или есть другой выход?

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

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

А чтобы впредь никогда не видеть подобных сообщений:

метод селект завершен неверно

полностью откажитесь от использования методов Select и Activate в своём коде.
В 95 % случаев их использование не требуется, и только замедляет выполнение кода.

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

Макросы для Excel, Word, CorelDRAW. Быстро, профессионально, недорого. http://ExcelVBA.ru/

Благодарности принимаются на кошелёк WebMoney: R318574877619 и Яндекс.Деньги: 41001335672216

vint

Сообщения:37
Зарегистрирован:19 мар 2009, 16:53

09 май 2009, 19:51

Комбобокс из 6 столбцов заполняется методом RowSource, вот например один из кусков кода чтоб на пальцах не объяснять

Код: Выделить всё

Dim posstr As Variant 'переменная для непустого диапазона данных от А1 до F-неизвестно

iRow21 = 1    'начальная строка поиска
iRow22 = 1    'начальная строка если пустая 1-ая строка
While (Application.ActiveWorkbook.Worksheets("ТМЦ").Range("A" & iRow21).Value <> "")
iRow21 = iRow21 + 1
iRow22 = iRow21       'нашли первую пустую строку
Wend                  'значит последняя непустая строка на 1 меньше

iRow23 = iRow22 - 1   'вот она последняя непустая строка для раннее F-неизвестного

posstr = "A1" & ":" & _
Application.ActiveWorkbook.Worksheets("ТМЦ").Range("F" & iRow23).Address(False, False)

cmbNaim2.ColumnCount = 6    'загружаем 6 колонок для комбобокс
'Worksheets("ТМЦ").Select    'активируем необходимый лист перед загрузкой в комбобокс
cmbNaim2.RowSource = posstr 'загружаем комбобокс согласно полученной переменной
Worksheets("База").Select   'возврат на 1-ый лист

и если законспектировать селект как в коде , то соответственно он находит нужные данные а загружает этот диапазон с пустого не скрытого листа «База» и в итоге комба содержит около 200 пустых строк.
Я с Вами полностью согласен

Код: Выделить всё

полностью откажитесь от использования методов Select и Activate

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

Код: Выделить всё

'сортируем лист "КР" по колонке "C" с ФИО
Worksheets("КР").Activate
    Columns("A:A").Select
    Range("A1:IV5000").Sort Key1:=Range("C1"), Order1:=xlAscending, Header:= _
    xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
    DataOption1:=xlSortNormal
    Range("A1").Select      'эстетические операции
Worksheets("База").Activate 'эстетические операции

Аватара пользователя

EducatedFool

Сообщения:196
Зарегистрирован:06 апр 2008, 14:03
Откуда:Россия, Урал
Контактная информация:

09 май 2009, 23:03

Код: Выделить всё

Private Sub UserForm_Initialize()
    cmbNaim2.ColumnCount = 6  
    With Worksheets("ТМЦ")
        Dim ra As Range: Set ra = .Range(.[a1], .Range("A" & .Rows.Count).End(xlUp)).Resize(, 6)
        [B]Me.cmbNaim2.List = ra.Value[/B] ' заносим весь массив в комбобокс
    End With
End Sub

И никаких Select-ов…
Лист «ТМЦ» при этом может быть скрытым.

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

Макросы для Excel, Word, CorelDRAW. Быстро, профессионально, недорого. http://ExcelVBA.ru/

Благодарности принимаются на кошелёк WebMoney: R318574877619 и Яндекс.Деньги: 41001335672216

Часто бывает, что надо получить данные из другой, открытой вместе с используемой, книги Excel.

Данная функция помогает получить ссылку на другую, открытую в текущий момент, книгу:

Sub ПримерИспользования_GetAnotherWorkbook()
    Dim WB As Workbook
    Set WB = GetAnotherWorkbook
    If Not WB Is Nothing Then
        MsgBox "Выбрана книга: " & WB.FullName, vbInformation
    Else
        MsgBox "Книга не выбрана", vbCritical: Exit Sub
    End If
    ' обработка данных из выбранной книги
    x = WB.Worksheets(1).Range("a2")
    ' ...
End Sub
 
Function GetAnotherWorkbook() As Workbook
    ' если в данный момент открыто 2 книги, функция возвратит вторую открытую книгу
    ' если помимо текущей, открыто более одной книги - будет предоставлен выбор
    On Error Resume Next
    Dim coll As New Collection, WB As Workbook
    For Each WB In Workbooks
        If WB.Name <> ThisWorkbook.Name Then
            If Windows(WB.Name).Visible Then coll.Add CStr(WB.Name)
        End If
    Next WB
    Select Case coll.Count
        Case 0    ' нет других открытых книг
            MsgBox "Нет других открытых книг", vbCritical, "Function GetAnotherWorkbook"
        Case 1    ' открыта ещё только одна книга - её и возвращаем
            Set GetAnotherWorkbook = Workbooks(coll(1))
        Case Else    ' открыто несколько книг - предоставляем выбор
            For i = 1 To coll.Count
                txt = txt & i & vbTab & coll(i) & vbNewLine
            Next i
            msg = "Выберите одну из открытых книг, и введите её порядковый номер:" & _
                  vbNewLine & vbNewLine & txt
            res = InputBox(msg, "Открыто более двух книг", 1)
            If IsNumeric(res) Then Set GetAnotherWorkbook = Workbooks(coll(Val(res)))
    End Select
End Function
  • 37367 просмотров

Не получается применить макрос? Не удаётся изменить код под свои нужды?

Оформите заказ у нас на сайте, не забыв прикрепить примеры файлов, и описать, что и как должно работать.

Понравилась статья? Поделить с друзьями:
  • Excel vba передача параметров функции
  • Excel vba передача параметров в процедуру
  • Excel vba передача массива в функцию
  • Excel vba передача массива в процедуру
  • Excel vba передать диапазон в функцию