Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Перенос Excel файла с макросами (http://forum.oszone.net/showthread.php?t=130706)

SergOst 02-02-2009 17:13 1027357

Перенос Excel файла с макросами
 
Я не спец по программированию, поэтому не могу понять возможно простой вопрос:

Мне нужно перенести на другой комп. Excel-файл с макросами, содержащимися почти на каждом листе.
Версия Excel та же, установлена в полном варианте.(2002 года)
Eдва щелкаешь по клетке листа скопированного на другой комп. файла, как появляется ошибка Visual Basic с переключением на код: Compile Error: Can't find project or library событие Worksheet.SelectionChange
Желтая стрелка указывает на Private Sub Worksheet_SelectionChange(ByVal Target As Range) и выделяется первый же после этого заголовка очевидно правильный оператор присваивания.
И так на всех листах, где есть макросы. На листах без макросов ошибок не выскакивает.
Уровень безопасности по макросам ставил на низкий - это не помогает, никаких запросов паролей не возникает.


На исходном компьютере никаких ошибок не выскакивает. Там просто можно редактировать клетки, код VBA выполняется как ему положено.

Как разгадать, какой библиотеки или проекта файлу не хватает на новом месте?
Где Excel хранит присоединенные в макросах библиотеки? В файле или в какой-то из своих установочных папок?

pva 03-02-2009 07:33 1027921

покажи код (и место ошибки), авось разгадаем

SergOst 03-02-2009 20:18 1028627

Цитата:

Цитата pva
покажи код (и место ошибки), авось разгадаем »

Имхо, от кода не зависит (по крайней мере я не понимаю, если бы в коде было что-то не то, то на исходном компе тоже бы не работало, не может же что-то в коде теряться при простом копировании файла?):

Например, лист vvod (данных) - высвечивается код(по событию Worksheet SelectionChange):
----------------------------------
Private Sub Worksheet_SelectionChange(ByVal Target As Range)

'считаем кол-во ТК
a = 0
For i = 1 To 70
If Worksheets("Base").Cells(i, 7) = "" Then Exit For
a = a + 1
Next i
VsegoTK = a + 1


' вырезаем из основания номер и дату заказа, название ТК
a = 1
S = Trim(Worksheets("Ввод данных").Range("A8"))
For i = 1 To Len(S) - 1
If Mid(S, a, 2) = " " Then S = Left(S, a) + Mid(S, a + 2, Len(S) - a) Else a = a + 1
Next i

и т.д.
----------------------------------------------
желтая стрелка указывает на Private Sub ... и подсвечено "a =" в первом операторе.

Или лист Sopr (Сопроводительный лист) - высвечивается код(по событию Worksheet SelectionChange):
--------------------------------
Private Sub Worksheet_SelectionChange(ByVal Target As Range)

TekPos = 15 'текущая позиция таблицы
KolEkzempl = 3 'кол-во экземпляров каждого паллета
TekPal = 1 'текущий паллет

'считаем кол-во паллет и коробок
VsegoPal = 1
VsegoKor = 0
For i = 9 To 200
If Worksheets("Упаковочный лист для склада").Cells(i, 1) = "" Then Exit For
VsegoKor = VsegoKor + 1
If Worksheets("Упаковочный лист для склада").Cells(i, 6) > VsegoPal Then VsegoPal = Worksheets("Упаковочный лист для склада").Cells(i, 6)
Next i


With Worksheets("Сопроводительный лист").Cells
.ClearContents
.Borders.LineStyle = 0
.Font.Name = "Arial"
.Font.Size = 10
End With

For p = 1 To VsegoPal 'цикл рисования каждого паллета

For t = 1 To KolEkzempl
Worksheets("Сопроводительный лист").Range(Cells(TekPos - 11, 1), Cells(TekPos - 1, 6)).Font.Bold = True
Worksheets("Сопроводительный лист").Range(Cells(TekPos - 11, 1), Cells(TekPos - 3, 6)).Font.Size = 12
Worksheets("Сопроводительный лист").Cells(TekPos - 14, 1) = "Приложение №2 к 'Требованиям к комплектации и документации при осуществлении поставок на"
Worksheets("Сопроводительный лист").Cells(TekPos - 13, 1) = "все собственные и наемные РЦ " & Worksheets("Base").Cells(2, 21) & " всех групп товаров'"
Worksheets("Сопроводительный лист").Cells(TekPos - 11, 2) = "ИНФОРМАЦИОННЫЙ ЛИСТ ПАЛЛЕТА №"
Worksheets("Сопроводительный лист").Cells(TekPos - 11, 5) = TekPal
Worksheets("Сопроводительный лист").Cells(TekPos - 9, 1) = "Поставщик №:"
Worksheets("Сопроводительный лист").Cells(TekPos - 9, 3) = Worksheets("Base").Cells(1, 22)
Worksheets("Сопроводительный лист").Cells(TekPos - 8, 1) = "Наименование поставщика:"
Worksheets("Сопроводительный лист").Cells(TekPos - 8, 3) = Worksheets("Base").Cells(1, 21)
Worksheets("Сопроводительный лист").Cells(TekPos - 7, 1) = "Заказ №:"
If Worksheets("Ввод данных").Range("K11") = "" Then Worksheets("Сопроводительный лист").Cells(TekPos - 7, 3) = Worksheets("Ввод данных").Range("J11") Else Worksheets("Сопроводительный лист").Cells(TekPos - 7, 3) = Worksheets("Ввод данных").Range("K11")
Worksheets("Сопроводительный лист").Cells(TekPos - 6, 1) = "№ магазина " & Worksheets("Base").Cells(2, 21) & " (№ РЦ):"
Worksheets("Сопроводительный лист").Cells(TekPos - 6, 3) = Worksheets(1).Range("J9")
Worksheets("Сопроводительный лист").Cells(TekPos - 6, 4) = "(" & Worksheets(1).Range("J8") & ")"
Worksheets("Сопроводительный лист").Cells(TekPos - 5, 1) = "Плановая дата поставки:"
If Worksheets("Ввод данных").Range("K12") = "" Then Worksheets("Сопроводительный лист").Cells(TekPos - 5, 3) = Worksheets("Ввод данных").Range("J12") Else Worksheets("Сопроводительный лист").Cells(TekPos - 5, 3) = Worksheets("Ввод данных").Range("K12")
Worksheets("Сопроводительный лист").Cells(TekPos - 2, 1) = "SAP"
Worksheets("Сопроводительный лист").Cells(TekPos - 1, 1) = "№ товара"
Worksheets("Сопроводительный лист").Cells(TekPos - 2, 2) = "Наименование товара"
Worksheets("Сопроводительный лист").Cells(TekPos - 2, 3) = "кол-во кор."
Worksheets("Сопроводительный лист").Cells(TekPos - 2, 4) = "кол-во шт."
Worksheets("Сопроводительный лист").Cells(TekPos - 1, 4) = "в кор."
Worksheets("Сопроводительный лист").Cells(TekPos - 2, 5) = "общее"
Worksheets("Сопроводительный лист").Cells(TekPos - 1, 5) = "кол-во шт."
Worksheets("Сопроводительный лист").Cells(TekPos - 2, 6) = "окончание"
Worksheets("Сопроводительный лист").Cells(TekPos - 1, 6) = "срока годн."
Worksheets("Сопроводительный лист").Range(Cells(TekPos, 1), Cells(TekPos + 36, 6)).Borders.LineStyle = 1
Worksheets("Сопроводительный лист").Range(Cells(TekPos - 2, 1), Cells(TekPos - 2, 6)).Borders(xlEdgeTop).LineStyle = 1
Worksheets("Сопроводительный лист").Range(Cells(TekPos - 2, 1), Cells(TekPos - 1, 1)).Borders(xlEdgeLeft).LineStyle = 1
Worksheets("Сопроводительный лист").Range(Cells(TekPos - 2, 2), Cells(TekPos - 1, 2)).Borders(xlEdgeLeft).LineStyle = 1
Worksheets("Сопроводительный лист").Range(Cells(TekPos - 2, 3), Cells(TekPos - 1, 3)).Borders(xlEdgeLeft).LineStyle = 1
Worksheets("Сопроводительный лист").Range(Cells(TekPos - 2, 4), Cells(TekPos - 1, 4)).Borders(xlEdgeLeft).LineStyle = 1
Worksheets("Сопроводительный лист").Range(Cells(TekPos - 2, 5), Cells(TekPos - 1, 5)).Borders(xlEdgeLeft).LineStyle = 1
Worksheets("Сопроводительный лист").Range(Cells(TekPos - 2, 6), Cells(TekPos - 1, 6)).Borders(xlEdgeLeft).LineStyle = 1
Worksheets("Сопроводительный лист").Range(Cells(TekPos - 2, 6), Cells(TekPos - 1, 6)).Borders(xlEdgeRight).LineStyle = 1

b = 0 'позиция в сопроводительном листе
c = 9 'позиция в упаковочном листе
d = 1 'кол-во коробок в позиции
For i = 1 To VsegoKor
dd = 0
If Worksheets("Упаковочный лист для склада").Cells(c, 6) <> TekPal Then c = c + 1
If Worksheets("Упаковочный лист для склада").Cells(c, 6) = TekPal Then
For ii = c To c + VsegoKor - b + 1
If Worksheets("Упаковочный лист для склада").Cells(c, 2) <> Worksheets("Упаковочный лист для склада").Cells(c + 1, 2) Then Exit For
If Worksheets("Упаковочный лист для склада").Cells(c + 1, 6) <> TekPal Then Exit For
If Worksheets("Упаковочный лист для склада").Cells(c, 3) <> Worksheets("Упаковочный лист для склада").Cells(c + 1, 3) Then dd = 1
d = d + 1
c = c + 1
Next ii
a = 0
For ii = 1 To 80
a = a + 1
If Worksheets("Base").Cells(ii, 5) = Worksheets("Упаковочный лист для склада").Cells(c, 2) Then Exit For
Next ii
If dd = 1 Then
Worksheets("Сопроводительный лист").Cells(TekPos + b, 1) = Worksheets("Base").Cells(a, 1) 'штрих-код
Worksheets("Сопроводительный лист").Cells(TekPos + b + 1, 1) = Worksheets("Base").Cells(a, 1) 'штрих-код
Worksheets("Сопроводительный лист").Cells(TekPos + b, 2) = Worksheets("Base").Cells(a, 4) 'артикул
Worksheets("Сопроводительный лист").Cells(TekPos + b + 1, 2) = Worksheets("Base").Cells(a, 4) 'артикул
Worksheets("Сопроводительный лист").Cells(TekPos + b, 3) = d - 1 'кол-во кор
Worksheets("Сопроводительный лист").Cells(TekPos + b + 1, 3) = 1 'кол-во кор
Worksheets("Сопроводительный лист").Cells(TekPos + b, 4) = Worksheets("Упаковочный лист для склада").Cells(c - 1, 3) 'кол-во шт. в кор
Worksheets("Сопроводительный лист").Cells(TekPos + b + 1, 4) = Worksheets("Упаковочный лист для склада").Cells(c, 3) 'кол-во шт. в кор
Worksheets("Сопроводительный лист").Cells(TekPos + b, 5) = Worksheets("Сопроводительный лист").Cells(TekPos + b, 3) * Worksheets("Сопроводительный лист").Cells(TekPos + b, 4) 'общ. кол-во
Worksheets("Сопроводительный лист").Cells(TekPos + b + 1, 5) = Worksheets("Сопроводительный лист").Cells(TekPos + b + 1, 3) * Worksheets("Сопроводительный лист").Cells(TekPos + b + 1, 4) 'общ. кол-во
Worksheets("Сопроводительный лист").Cells(TekPos + b, 6) = "-"
Worksheets("Сопроводительный лист").Cells(TekPos + b + 1, 6) = "-"
b = b + 2
c = c + 1
End If
If dd = 0 Then
Worksheets("Сопроводительный лист").Cells(TekPos + b, 1) = Worksheets("Base").Cells(a, 1) 'штрих-код
Worksheets("Сопроводительный лист").Cells(TekPos + b, 2) = Worksheets("Base").Cells(a, 4) 'артикул
Worksheets("Сопроводительный лист").Cells(TekPos + b, 3) = d
Worksheets("Сопроводительный лист").Cells(TekPos + b, 4) = Worksheets("Упаковочный лист для склада").Cells(c, 3)
Worksheets("Сопроводительный лист").Cells(TekPos + b, 5) = Worksheets("Сопроводительный лист").Cells(TekPos + b, 3) * Worksheets("Сопроводительный лист").Cells(TekPos + b, 4)
Worksheets("Сопроводительный лист").Cells(TekPos + b, 6) = "-"
b = b + 1
c = c + 1
End If
End If
d = 1
Next i

TekPos = TekPos + 51
Next t
TekPal = TekPal + 1
Next p



End Sub

----------------------------------
Опять желтая стрелка указывает на Private Sub ... и подсвечено "TekPos =" в первом операторе.

Delirium 04-02-2009 01:43 1028933

Откройте модули, встаньте в самый самый верх, и напишите Option Explicit. Затем опишите все те переменные, на которые идет ругань, например:
Цитата:

Цитата SergOst
и подсвечено "a =" в первом операторе. »

Цитата:

Цитата SergOst
a = 0 »

Напишите Dim a as Integer
Цитата:

Цитата SergOst
и подсвечено "TekPos =" в первом операторе. »

Dim TekPos as Integer

и так далее. Если тип переменной не знаете, напишите просто Dim a, TekPos и другие переменные.

SergOst 04-02-2009 15:35 1029210

Цитата:

Цитата Delirium
Откройте модули, встаньте в самый самый верх, и напишите Option Explicit. Затем опишите все те переменные, на которые идет ругань, например: »

Все сделал в первом модуле, как сказали.
Но теперь подсвечивает уже не оператор присваивания с переменной, а слово "Trim" в первом модуле(оно там есть в приведенном мной фрагменте кода) с теми же словами ошибки, т.е. встроенную бейсиковскую функцию усечения.
Что теперь делать?
Может где-то настройки есть и про описание переменных и про встроенные функции?
Галочка в Require Variable Declaration тем не менее была снята в MSVisualBasic-Tools-Options
Постановка/снятие галочки в Auto Syntax Check тоже не влияет.

Интересно, что если в коде начинаешь набирать a=Len(.. то высвечивает подсказку Len(Expression),
т.е. функцию Len знает, а если набираешь s=Trim(.. или s=Mid(.. то подсказку не дает, т.е. эти функции почему-то не знает??

azbest 05-02-2009 01:01 1029746

Во вновь созданном листе со скопированными макросами нажмите ALT+F8 - и в появмвшемся окне выберите первый попавшийся (название) и нажмите клавишу изменить. Попадаете в окно проекта VBA с кодом программы. Нажимаете F8 - пошаговое выполнение макроса и смотрите на каком шаге он у вас зависает. Ещё в меню Вид - щелкаете на "окно локальных переменных" - и появляется под окном кода программы - внизу окно локальных переменных - все переменные что задействованы в этом макросе. По началу все могут быть равны "пустому месту", потом по мере пошагового выполнения (F8) - у переменных появляются их текущие значения - это хорошая визуальная подсказка и контроль выполнения программы макроса.

Delirium 05-02-2009 01:27 1029760

SergOst, а попробуйте переставить офис? Или еще лучше выложите файл xls файл, посмотрим, что там не так.

okshef 05-02-2009 08:28 1029901

SergOst, войдите в VBA на исходном компе, откройте Tools - References и посмотрите, где установлены галочки, какие подключены библиотеки. Подключите такие же на новом. Также в VBA на исходном компе через Object Browser введите имя вашего "проблемного" модуля, функции, программы, и внизу смотрите по ссылкам, к какому классу (dll и пр.) относится ваш "зверь". На новом нужно те же библиотеки подключать.


Время: 18:53.

Время: 18:53.
© OSzone.net 2001-