Создать файл и перебросить данные

Программирование на Visual Basic for Applications
Starik
Обычный пользователь
Обычный пользователь
 
Сообщения: 73
Зарегистрирован: 05.11.2002 (Вт) 16:55
Откуда: Russia

Создать файл и перебросить данные

Сообщение Starik » 19.10.2006 (Чт) 11:03

Добрый день!

Проблема со временем, подскажите, как оптимально быстро можно перебросить определенные данные из одного файла xls в другой файл xls.
Подробнее: я работаю в своей, довольно-таки большой (13 листов, огромный объем информации на каждом листе, 16 модулей и т.д.) программе, написанной на VBA Excel.
Зарубежные партнеры попросили предоставить некоторые расчеты, а всю программу мне высылать не хотелось бы. Один раз я переслал им одну из своих программ, по доброте душевной, тоже просили прислать расчет, так они теперь по всему холдингу, а это 12 стран мира, разослали свой файл, где использовали мои методы расчета и алгоритм, а мне позвонили, похвалили программу и сказали, что частично использовали мои методы расчета. За спасибо больше работать на буржуев не хочется, а расчет предоставить необходимо.
Короче:
Необходимо создать файл xls с 10-ю листами (имена листов должны совпадать с аналогом, но не со всей информацией на каждом листе), без модулей – аналог программного файла (13 листов).
Если создать новый файл, то необходимо форматировать каждый лист (формат разный на листах), лучше, наверно, иметь уже отформатированный шаблон с названием файла и листов (это сделать без проблем). Трудность у меня возникает при копировании данных из одного файла в другой, времени не хватает, чтобы разобраться. Кто занимался данным вопросом, помогите решить эту проблему.
И еще, можно сделать, наверно, проще – уничтожить все модули? Если есть такое решение, то как?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 19.10.2006 (Чт) 11:11

Тебе нужно быстро вырезать VB-код из книги?
Выдели все листы, скопируй в новую книгу, вышли эту новую книгу.
Если ты хочешь удалить все формулы на листе, то можно выделить область, скопировать, а затем же на ней сделать специальную вставку и вставить значения. Если область сложная и по какой-то причине специальная вставка недоступна, то выполни такой код:
Код: Выделить всё
For Each c In Cells
  c.Value = c.Value
Next c
Lasciate ogni speranza, voi ch'entrate.

Starik
Обычный пользователь
Обычный пользователь
 
Сообщения: 73
Зарегистрирован: 05.11.2002 (Вт) 16:55
Откуда: Russia

Сообщение Starik » 19.10.2006 (Чт) 11:16

alibek, спасибо, быстро работаем.
Сейчас попробую.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 19.10.2006 (Чт) 11:26

1.
Код: Выделить всё
with workbooks.add
  thisworkbook.worksheets(1).copy after:=.worksheets(.worksheets.count)
  thisworkbook.worksheets(2).copy after:=.worksheets(.worksheets.count)
  thisworkbook.worksheets(3).copy after:=.worksheets(.worksheets.count)
end with


2.
Код: Выделить всё
  Dim c As VBIDE.VBComponent
 
  With ThisWorkbook.VBProject.VBComponents
    For Each c In ThisWorkbook.VBProject.VBComponents
      If c.Type = vbext_ct_StdModule Then .Remove c
    Next
  End With
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Алексей К.
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 419
Зарегистрирован: 12.05.2004 (Ср) 9:41
Откуда: Ульяновск

Сообщение Алексей К. » 19.10.2006 (Чт) 11:44

Храни макросы в "Личной книге макросов" и не парься:)
Добавлено:
А ты поставь пароль на VBA, в макросе auto_open сделай проверку на дату - т.е. вышли им ограниченную по срокам действия версию (если конечно там нормальных прогеров нет - чтоб не смогли взломать). Как перестанет рабоать неожиданно во всех компаниях сразу завалят тебя письмами - а ты им в ответ "Направляем Вам коммерческое предложение...." :)

Starik
Обычный пользователь
Обычный пользователь
 
Сообщения: 73
Зарегистрирован: 05.11.2002 (Вт) 16:55
Откуда: Russia

Сообщение Starik » 19.10.2006 (Чт) 13:33

Спасибо за ответы.
GSerg
Код для удаления модулей у меня не работает:
"Dim c As VBIDE.VBComponent " - получаю собщение " c As VBIDE.VBComponent - User-defined type not defined".
Конечно, хотелось бы знать, как удалять модули на будущее, но сейчас просто катастрофически не хватает времени.
Код для переноса данных из книги в книгу не пробовал, освобожусь, попробую.

Алексей К.
Защитить можно многими способами, но с датами я никогда не связываюсь, умники часики переводят, правда можно, наверно, поставить запрет на перевод часов (где-то я читал про это). Для защиты я использую (по необходимости)
1. скрываю нужный лист (его не видно как с макросами, так и при отключенных макросах)
2. использую счетчик входа в программу
3. различные имена: имя компа, IP-адреса и т.д.
4. ну и конечно пароли
Да вроде и все. По крайней мере, для наших умников, это вполне достаточно. Хакеров у нас еще нет.

alibek, спасибо, все получилось хорошо и быстро, правда, пришлось на некоторых листах вручную удалять некоторую информацию, но это ерунда.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 19.10.2006 (Чт) 13:41

Starik писал(а):GSerg
Код для удаления модулей у меня не работает:
"Dim c As VBIDE.VBComponent " - получаю собщение " c As VBIDE.VBComponent - User-defined type not defined".

Не пришла по этому поводу мысль, что надо подключить ту самую VBIDE? :roll:

Или не подключай, и замени на object, а константу vbext_ct_StdModule - на её значение.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Starik
Обычный пользователь
Обычный пользователь
 
Сообщения: 73
Зарегистрирован: 05.11.2002 (Вт) 16:55
Откуда: Russia

Сообщение Starik » 19.10.2006 (Чт) 15:25

GSerg, мысль то пришла, да только я что-то не нашел или пропустил

Starik
Обычный пользователь
Обычный пользователь
 
Сообщения: 73
Зарегистрирован: 05.11.2002 (Вт) 16:55
Откуда: Russia

Сообщение Starik » 19.10.2006 (Чт) 15:37

GSerg, заменил на object, все получилось, огромное спасибо

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 19.10.2006 (Чт) 15:49

Интересно, что ты сделал с константой... она таки не равна нулю...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Starik
Обычный пользователь
Обычный пользователь
 
Сообщения: 73
Зарегистрирован: 05.11.2002 (Вт) 16:55
Откуда: Russia

Сообщение Starik » 20.10.2006 (Пт) 10:05

GSerg, сегодня посмотрев твое сообщение, решил проверить – код сегодня не работает, почему вчера получилось, не знаю. Очень много работы, отвлекаться некогда, но сейчас все таки решил добить этот вопрос.
Короче, вот рабочий код

With Application.VBE.SelectedVBComponent
If .CodeModule.CountOfLines <> 0 Then
.CodeModule.DeleteLines 1, .CodeModule.CountOfLines
End If
End With

Проверил несколько раз, сносит весь текст.
Можно удалить и все модули вместе с текстом, если его изменить, тоже проверял и не нужно подключать VBIDE, кстати, а почему у меня VBIDE нет.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 20.10.2006 (Пт) 10:31

Если не подключать, то

Код: Выделить всё
  Dim c As object
 
  With ThisWorkbook.VBProject.VBComponents
    For Each c In ThisWorkbook.VBProject.VBComponents
      If c.Type = 1 Then .Remove c
    Next
  End With

Библиотека называется Microsoft Visual Basic for Application Extencibility.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Starik
Обычный пользователь
Обычный пользователь
 
Сообщения: 73
Зарегистрирован: 05.11.2002 (Вт) 16:55
Откуда: Russia

Сообщение Starik » 20.10.2006 (Пт) 15:14

GSerg, спасибо, нашел библиотеку, попробовал код с VBIDE -выдает 13-ю ошибку. Да ладно, время будет, разбирусь.


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 79

    TopList