Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Сфера Microsoft » Microsoft Office (Word, Excel, Outlook и т.д.) » 2007 - [решено] Перебор листов и ячеек в VBA

Ответить
Настройки темы
2007 - [решено] Перебор листов и ячеек в VBA

Ветеран


Сообщения: 1630
Благодарности: 220

Профиль | Отправить PM | Цитировать


Мне надо перебрать все листы книги Excel2007 и поместить содержимое одних и тех же выбранных ячеек
в столбец на отдельный лист Лист1.
Листы в книге все названы, но я понял, что все равно к ним можно обращаться как к ЛистN.
Я написал макрос, но обращение все равно не работает.
Dim SheetNum As String
Dim PosNum As String
SN = 3
SP = 8
While SN < 309
SheetNum = "Лист" + LTrim(Str(SN))
Sheets("SheetNum").Select
Range("A2:G2").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Лист1").Select
PosNum = "A" + LTrim(Str(SP))
Range("PosNum").Select
ActiveSheet.Paste Link:=True
SP = SP + 1
SN = SN + 1
Wend


Макрос останавливается на строке Sheets("SheetNum").Select и не хочет идти на Лист3
Как перебрать листы и ячейки?

Отправлено: 16:38, 12-01-2013

 

Модератор


Moderator


Сообщения: 16844
Благодарности: 3247

Профиль | Сайт | Отправить PM | Цитировать


alef2474, объясните, что вы хотите сделать?
Перебрать все листы можно несколькими способами, например, так
Код: Выделить весь код
For Each ws In Worksheets
......
ваш код
......
Next

-------
При заполнении сведений о конфигурации компьютера не забудь поставить флажок: отображать - "Да"
-------------------------------------------------------------------------------------------
Ассоциация VirusNet - помощь и обучение борьбе с вирусами. Некоторые вопросы загрузки в моем блоге


Отправлено: 18:55, 12-01-2013 | #2



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

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


Ветеран


Сообщения: 1630
Благодарности: 220

Профиль | Отправить PM | Цитировать


okshef, спасибо, что откликнулись
У менеджеров имеются безобразные по моему мнению файлы Excel в которых они на отдельных листах ведут базу данных клиентов.
Причем имя листа - это название фирмы клиента.
На каждом листе, например в ячейке В1 написано "Название ООО "ФирмаХ"

в объединенных ячейках А6-D6 "контактное лицо Тамара Ивановна"

в объединенных ячейках B8-C8 "Телефон (111)222-32-32"

и т.п. контактная информация о клиенте, которую они листом могут распечатать с линиями и дополнительными надписями.

Причем, так как клиентов много, то таких листов в книге - сотни и загружается такая книга в память при открытии
по нескольку минут на вполне еще приличных компьютерах.Использование процессора подскакивает до 80%.
(Менеджеры недовольны и требуют компьютеров с новейшими мощнейшими игровыми процессорами).
И потом им еще надо побыстрее найти нужный лист клиента, когда они разговаривают по телефону, чтоб подредактировать.

Как-то напрашивается преобразование такой книги Excel в базу данных Access, которая бы загружалась быстрее,
где каждая строка была бы информацией о фирме, а в колонках - в поле1 - название фирмы, в поле2 - контактное лицо, в поле3 - телефон и т.д.

Как быстрее выполнить такое преобразование и прав ли я в том, что такой файл Access будет открываться быстро?
Я посмотрел мастер импорта в Access и что-то он не предлагает таких функций.

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

Перебор листов действительно можно обойти применением оператора for each, спасибо.
Но у меня в макросе есть и перебор строк Range("PostNum").Select, где PostNum - текстовая переменная образующаяся сложением столбца А и строки 3,4,5,6,...,309
Видимо и тут нельзя использовать переменные и Range должны стоять только константы?

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

Отправлено: 19:32, 12-01-2013 | #3


Модератор


Moderator


Сообщения: 16844
Благодарности: 3247

Профиль | Сайт | Отправить PM | Цитировать


alef2474, создайте в книге новый лист "Список", вставьте в модуль программу
Код: Выделить весь код
Sub Create_list()
    i = 1
    For Each ws In Worksheets
        If ws.Name <> "Список" Then
            Sheets("Список").Cells(i, 1) = ws.Range("b1")
            Sheets("Список").Cells(i, 2) = ws.Range("a6")
            Sheets("Список").Cells(i, 3) = ws.Range("b8")
            i = i + 1
        End If
    Next
Sheets("Список").Activate
MsgBox "Формирование списка завершено"
End Sub
и запустите

-------
При заполнении сведений о конфигурации компьютера не забудь поставить флажок: отображать - "Да"
-------------------------------------------------------------------------------------------
Ассоциация VirusNet - помощь и обучение борьбе с вирусами. Некоторые вопросы загрузки в моем блоге

Это сообщение посчитали полезным следующие участники:

Отправлено: 20:06, 12-01-2013 | #4


Ветеран


Сообщения: 1630
Благодарности: 220

Профиль | Отправить PM | Цитировать


Спасибо большое, все сработало как надо.(высота строк только резко подскочила в Список) Этим простым кодом Вы разрешили еще несколько вопросов, которые меня мучали.
Выбор в range только первой ячейки из объединенных для меня был не очевиден. В range действительно, наверно, могут ставиться только константы. В help'e (ниже) выделенный текст меня ввел в заблуждение.(A1-style подразумевает только константы)
Цитата:
The name of the range. This must be an A1-style reference in the language of the macro. It can include the range operator (a colon), the intersection operator (a space), or the union operator (a comma). It can also include dollar signs, but they’re ignored. You can use a local defined name in any part of the range. If you use a name, the name is assumed to be in the language of the macro.

Последний раз редактировалось alef2474, 13-01-2013 в 15:20.


Отправлено: 14:26, 13-01-2013 | #5


Модератор


Moderator


Сообщения: 16844
Благодарности: 3247

Профиль | Сайт | Отправить PM | Цитировать


alef2474, не совсем понятно ваше смущение. В приведенной вами цитате речь идет о том как передавать (определять) диапазон в макросах. И также говорится о том, что диапазон может быть назван на локальном (не английском) языке. Просто в этом случае при определении такого диапазона имя нужно заключать в кавычки, например
Код: Выделить весь код
Range("Мой диапазон")
Цитата alef2474:
Выбор в range только первой ячейки из объединенных »
а вы активируйте диапазон из выделенных ячеек и посмотрите, какое имя отображается в поле имен. Это и будет крайняя левая ячейка. Конечно, это справедливо, если вы не присвоили этому диапазону собственное имя.

-------
При заполнении сведений о конфигурации компьютера не забудь поставить флажок: отображать - "Да"
-------------------------------------------------------------------------------------------
Ассоциация VirusNet - помощь и обучение борьбе с вирусами. Некоторые вопросы загрузки в моем блоге


Отправлено: 16:01, 13-01-2013 | #6


Ветеран


Сообщения: 1630
Благодарности: 220

Профиль | Отправить PM | Цитировать


Цитата okshef:
что диапазон может быть назван на локальном (не английском) языке. »
Я слово local понял как не относящееся к языку, а как локальный идентификатор в этой локальной процедуре, а не внешней.А язык(language) macro как язык программирования (VBA). Чаще слово local именно так понимается.
Плохо, что в range нельзя использовать текстовые переменные.

Цитата okshef:
а вы активируйте диапазон из выделенных ячеек и посмотрите, какое имя отображается в поле имен. Это и будет крайняя левая ячейка. »
Да, я обратил внимание, именно так. Но подумал, сперва, что в range надо подставлять диапазон. Подставил - и ничего не получилось.

Отправлено: 18:28, 13-01-2013 | #7



Компьютерный форум OSzone.net » Сфера Microsoft » Microsoft Office (Word, Excel, Outlook и т.д.) » 2007 - [решено] Перебор листов и ячеек в VBA

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
C/C++ - Генератор титульных листов Hector Программирование и базы данных 2 29-11-2010 19:21
Перебор контролов w3d1 AutoIt 8 04-09-2009 12:35
Перебор в твиках! lmn Автоматическая установка Windows 2000/XP/2003 2 30-07-2005 02:47
Алгоритм раскроя прямоугольных листов Serglink Программирование и базы данных 4 10-06-2004 11:06
считалка распечатанных листов Domashenko Alexey Хочу все знать 1 06-06-2004 20:46




 
Переход