Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Excel VBA

Автор: sonix555
Дата сообщения: 07.07.2006 12:40
всем привет,
1) у меня на элементах управления отображаются вопросительные знаки "?". Пробовал на других компах - все нормально. Есть лекарство?

2) существует ли такая возможность: при нажатии на "волшебную" кнопку рабочая книга сохраняется в папку "Переданные" клиента TheBat! (ну или любого другого), с нужными реквизитами ("кому", "тема" и "текст письма")?
Может кто-то писал подобные макросы? Буду оч благодарен за фрагменты

3) Ситуация: есть локальная сеть, в ней сервак на котором лежит куча файлов (ексель) одинаковой структуры. Юзеры периодически запускают эти файлы с сервака. Можно ли сделать так, чтобы файлы использовали один програмный код? Т.е. при изменении кода не нужно было бы открывать каждую книгу и менять в ней макросы, а сделать это в одном месте и для всех?
Автор: DONRU1
Дата сообщения: 07.07.2006 12:48
Подскажите, возможно ли реализовать следующую идею.
Есть файл с сылками на ячейки других фыйлов.
Вопрос: Возможно ли сделать так, чтобы по щелку мышью по ячейке с сылкой открывался файл, на который сделана ссылка, и курсор устанавливался на ссылаемую ячейку? (Гиперссылки не предлагать)
Автор: vAkUuM
Дата сообщения: 07.07.2006 13:05
DONRU1
А вот такой примерчик подойдёт?
/Есть 2 книги Exel. В одной в ячейке А1 ссылка на ячейку в Книге Book2 на ячейку А1 листа Sheet1/


Код: Sub Example()
Range("A1").Select
Windows("Book2.xls").Activate
Sheets("Sheet1").Select
Range("A1").Select
End Sub
Автор: zporuchik
Дата сообщения: 07.07.2006 13:17
ОФТОП:
Никто не знает, чем можно сгенерить функцию по заданной последовательности чисел?
Автор: Yuk
Дата сообщения: 07.07.2006 17:07
Virtualexx

Цитата:
Вы зря кипятитесь.
С чего это ты взял? Это я от скуки и не имея конкретно никого ввиду.

Цитата:
Код:
Application.EnableEvents = True
...
Application.EnableEvents = False
...
Не понял. Этим кодом ты запрещаешь обработку событий (Change, SelectionChange, Calculate и т.п.), но отнюдь не защищаешь ячейку от случайного изменения. Похоже ты не до конца разобрался.

Цитата:
кнопку (макрос), которая будет отменять действие последнего выполненного макроса?
С этим проблемы. Undo обычно не сохраняет изменения сделанные макросом. Единственный выход имхо - делать обратный макрос.



Добавлено:
eowyn
Проверь Сервис - Совместное использование. Если включено, макросы блокируются.

Добавлено:
sonix555
1) Вместо русских символов или любых других? Скорее всего проблема или с руссификацией или определенным шрифтом.
3) Один из вариантов сделать шаблон с макросами, а в каждый файл прописать функцию Workbook_Open с
Код: Workbooks.Open FileName:="имя шаблона" Editable:=False ReadOnly:=True
Автор: lucky_Luk
Дата сообщения: 07.07.2006 20:29
Yuk

Цитата:
В 97-м офисе по другому работа с динамическими массивами. У меня его нет, так что извини.
Попробуй убрать () в строках:
Dim aArray() As Variant
и
Dim t() As Variant

Убрал, ВСЕ ЗАРАБОТАЛО под Office 97, спасибо. Прошу завсегдатаев топика еще погонять макрос на Office 97 и если не будет багов добавить это в шапку.
Автор: DONRU1
Дата сообщения: 07.07.2006 21:50
vAkUuM
Если ве так было просто, то я бы и сам такое написал, смысл в том, что таких ячеек с сылками много - около 200. Что-же мне для каждой писать обработчик событий? Тут нужен универсальный подход. Т.е. вытыщить из ссылки адрес файла и ячеки. Но сслыки не однородны.
Автор: Yuk
Дата сообщения: 07.07.2006 22:07
DONRU1
Можно несколько примеров ячеек с ссылками?
Что значит ссылки не однородны?
Почему нельзя гиперссылки использовать?
Автор: DONRU1
Дата сообщения: 07.07.2006 22:30
Yuk
Файлы на работе, но попробую по памяти.
Опечатался. Ссылки не одинаковые. Но определенный принцип построения есть.

c:\navi\svodF\otchet\2006_200\[00_0503121.xls]2'!$E$7
c:\navi\ - эта часть постоянна
SvodF - может быть SvodF, SvodO, SvodR
2006_200 - тут думаю понятно год_кварталмесяц т.е. м.б. 2006_100, 2006_101 и т.п.
00_0503121 - вместо 00 - код подразделения от 01 до 60 Изначально в ссылке стоят 00 но в процессе работы макроса они меняются на код подразделения.
0503121 - код отчетной формы

В ячейке может быть ссылка на несколько ячеек (их сумма, разница и т.п.)
Может с гиперссылками я погорячился, но все мои попытки решить задачу с их помощью получились неудачными. Т.к. ссылка у меня динамичная а гиперссылка получается статичной.
Автор: Yuk
Дата сообщения: 08.07.2006 00:10
DONRU1
Как насчет макроса, переделывающего текст в гиперссылку:

Код: Sub MakeLink()
s = Replace(Selection.Value, Chr(39), "")
addr = Mid(s, InStr(1, s, "]") + 1)
s = Left(s, InStr(1, s, "]") - 1)
fname = Replace(s, "[", "")
ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:=fname, _
SubAddress:=addr, TextToDisplay:=Selection.Value
End Sub
Автор: DONRU1
Дата сообщения: 08.07.2006 20:25
Yuk
Идея неплохая, реализвалась в следующий код
[more]
If Cells(numins, 7).Text <> "" Then
s = Replace(Selection.Formula, Chr(39), "") 'когда стояло Value считывалось значение ячейки, а не формула
addr = Mid(s, InStr(1, s, "]") + 1)
s = Left(s, InStr(1, s, "]") - 1)
fname = Replace(s, "[", "")
fname = Right(fname, Len(fname) - 1) 'убираю знак "="
Workbooks("_Ошибки.xls").Activate
Cells(numins, 7).Select
ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:=fname, SubAddress:=addr, TextToDisplay:=Selection.value
Workbooks(NameUvyaz).Activate
End If
[/more]
Но это не рашает всей задачи, т.к.
1. применимо только к простым сылкам, а ссылки вида:
=ОКРУГЛ('D:\NaviA\SvodF\Othet\2006_200\[44_0503121.xls]2'!$S$61;2)
=ОКРУГЛ('D:\NaviA\SvodF\Othet\2006_200\[44_0503121.xls]2'!$S$55+'D:\NaviA\SvodF\Othet\2006_200\[44_0503121.xls]2'!$S$61+'D:\NaviA\SvodF\Othet\2006_200\[44_0503121.xls]2'!$S$64;2)-'D:\NaviA\SvodF\Othet\2006_200\[44_рас_1.XLS]2'!$I$127
данный трюк не проходит
Я не могу знать кто, какую ссылку сделает в файле увязок.
2. файлы на которые делаются гиперссылки запаролены, соответственно при нажатии на гиперссылку вылазиет окно с запросом пароля.
Думаю повесить макрос на кнопку и открывать файл из ссылки через workbooks.open
Но опять же это не решает проблемы с длинными ссылками
Автор: SERGE_BLIZNUK
Дата сообщения: 09.07.2006 07:06
DONRU1
Уважаемый, чего-то я в данную тему не могу въехать. Аж хочу зайти и сделать парочку книжек в Excel и проверить о чём Вы тут... ;-))
но:

Цитата:
Но опять же это не решает проблемы с длинными ссылками

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


Цитата:
файлы на которые делаются гиперссылки запаролены

да... и тут тоже похоже проблема... у меня не получилось открыть книгу с паролем, установив пароль в самом макросе (теоретически это возможно. подождём, что скажет господин Yuk). Пароль то хоть один на все книги? И тогда вы должны будете его написать в макросе. И любой, выполнив макрос, получит возможность изменять запароленную книгу без знания пароля...

Автор: DONRU1
Дата сообщения: 09.07.2006 09:15
SERGE_BLIZNUK

Цитата:
И, кстати, даже из разных книг... на первую переходить?

Да, на первую в ссылке. Разные книги в ссылках практически не встречаются.
Как открыть через гиперссылку с паролем я не знаю.
Через Workboos.open открываю. Задача состоит не втом, чтобы запретить открывать книги, а чтобы их открывали черерз макрос. За год работы никто из моих пользователей, а их более 50 не нашел пароль. Не тот контингент. Да и не нужно им это. Все и так замечательно работает. Да и не храниться он в явном виде в макросе.
Автор: SERGE_BLIZNUK
Дата сообщения: 09.07.2006 09:50

Цитата:
Разные книги в ссылках практически не встречаются



Цитата:
=ОКРУГЛ('D:\NaviA\SvodF\Othet\2006_200\[44_0503121.xls]2'!$S$55+'D:\NaviA\SvodF\Othet\2006_200\[44_0503121.xls]2'!$S$61+'D:\NaviA\SvodF\Othet\2006_200\[44_0503121.xls]2'!$S$64;2)-'D:\NaviA\SvodF\Othet\2006_200\[44_рас_1.XLS]2'!$I$127


в вашем примере, две книги - 44_0503121.xls и 44_рас_1.XLS
Тот код, который вы используете и вернёт вам имя первой книги! Или я ошибаюсь?..

по поводу пароля, посмотрим, что скажет уважаемый эксперт Yuk...


Цитата:
Да и не храниться он в явном виде в макросе.

я вас не понял. вы же хотели, чтобы пароль не надо было вводить руками? Т.е., если вы согласны, чтобы пользователи при активации книги вводили его руками (как это у вас сейчас) тогда сразу две проблемы снимаются - не надо добавлять пароль в макрос и не будет дырок в безопасности...
Автор: DONRU1
Дата сообщения: 09.07.2006 10:18
SERGE_BLIZNUK

Цитата:
Тот код, который вы используете и вернёт вам имя первой книги! Или я ошибаюсь?..

Ну не возвращает он имя первой книги, а почему, я еще не разобрался.
Я хочу, чтобы пароль был в макросе. Но при этом же не обязательно его там явно указывать. Если интересно могу показать как.
Автор: SERGE_BLIZNUK
Дата сообщения: 09.07.2006 14:09

Цитата:
пароль был в макросе. Но при этом же не обязательно его там явно указывать. Если интересно могу показать как.
интересно! Покажите, плиз...


Цитата:
не возвращает он имя первой книги

я тоже гляну, может успею разобраться...
Автор: DONRU1
Дата сообщения: 09.07.2006 15:31
Yuk
Теперь все ссылки обрабатывает.
Cells(j, 7).Select
If Cells(j, 7).Text <> "" And Cells(j, 8) <> "" Then
s = Replace(Selection.Formula, Chr(39), "")
addr = Mid(s, InStr(1, s, "]") + 1)
If Right(addr, 1) = ")" Then addr = Left(addr, Len(addr) - 3)
If InStr(1, addr, "+") > 0 Then addr = Mid(addr, 1, InStr(1, addr, "+") - 1)
If InStr(1, addr, "-") > 0 Then addr = Mid(addr, 1, InStr(1, addr, "-") - 1)
s = Left(s, InStr(1, s, "]") - 1)
fname = Replace(s, "[", "")
fname = Right(fname, Len(fname) - 1)
If Left(fname, 5) = "ROUND" Then fname = Right(fname, Len(fname) - 6)
If Right(fname, 1) = ")" Then fname = Left(fname, Len(fname) - 3)
Workbooks("_Ошибки.xls").Activate
Cells(numins, 7).Select
ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:=fname, SubAddress:=addr, TextToDisplay:=Selection.value ', SubAddress:=addr
Workbooks(NameUvyaz).Activate
End If

Но проблема с паролем остается
SERGE_BLIZNUK
Любой выполнить макрос с паролем не может. Для этого надо знать имя макроса.
А просматривать всесь программный код )) - время тратить непонятно для чего. Разве только ради спортивного интереса.

Workbooks.Open Filename:=AWP_O_FN & "\" & IndexFile & "_" & OpenNameFile, WriteResPassword:=Workbooks(AWN).Worksheets("6").Cells(4, 3).Text
Т.е. пароль храниться в книге в ячейке. Лист защищен. ячейка скрыта. Т.е. просто так посмотреть пароль нельзя.
Можно усложнить еще следующим образом:
Workbooks(AWN).Sheets(Chr(51)).Range(Chr(98) & Chr(49) & Chr(51))
Но все это детские игры т.к. если захотят всеравно найдут. ))
Автор: Yuk
Дата сообщения: 10.07.2006 06:07
DONRU1

Цитата:
Но проблема с паролем остается
А в чем проблема? У тебя же уже практически все есть. Если можешь выделить путь и имя файл, лист и ячейку, замени создание гиперлинка на открытие файла, активизацию листа и выделение ячейки.

А что касается проблем безопасности, это каждый решает сам для себя. Принимая во внимание и уровень пользователей, и критичность скрываемых данных.
Удачи.
Автор: DONRU1
Дата сообщения: 10.07.2006 07:51
Yuk
Спасибо
Я уже так и сделал. Но просто подумал, что и для гиперссылок можно в макросе задавать пароль, ан нет
Автор: Virtualexx
Дата сообщения: 10.07.2006 11:48
по поводу отмены выполненного макроса: нельзяли сделать следующее с помощью макроса:


Цитата:
Вариант II. В меню Сервис выберите команду Доступ к книге, выделите закладку Правка. Далее установите "флажок" напротив Разрешить совместный доступ и нажмите кнопку ОК. Затем на все вопросы отвечайте ОК.
Для просмотра и отмены изменений в этой рабочей книге выберите в меню Сервис пункт Исправления, а затем команду Принять/отклонить исправления.

Примечание : Общая книга имеет ряд ограничений, которые обязательно необходимо учитывать при работе с подобной книгой.


Пробовал записать, получается пустым...
Автор: eowyn
Дата сообщения: 10.07.2006 11:59
Yuk

Цитата:
Проверь Сервис - Совместное использование. Если включено, макросы блокируются.

Спасибо большое. Помогло. Буду ковырять макросы.
Автор: Virtualexx
Дата сообщения: 10.07.2006 14:49
Такое вот еще дело:
В ячейке - дата
Код: =СЕГОДНЯ()
Автор: Anjin_Kazawa
Дата сообщения: 10.07.2006 15:42
Virtualexx
Дата в экселе представлена числом, надо так:

Код: =ЕСЛИ(СЕГОДНЯ()=ДАТАЗНАЧ("10.07.2006");"Внимание: последний день месяца!";"")
Автор: Yuk
Дата сообщения: 10.07.2006 17:21
Virtualexx
см мой ответ eowyn - при совместном использовании макросы блокируются.
Автор: Virtualexx
Дата сообщения: 11.07.2006 09:56
Anjin_Kazawa
спасибо!!!

Yuk
Мне не хотелось бы сглазить, но у меня макросы работают при совместном использовании. Результат отображается после сохранения активной книги.

Добавлено:
Еще вот: есть ли функции, позволяющие определить последнюю дату текущего месяца?
Автор: Anjin_Kazawa
Дата сообщения: 11.07.2006 11:20
Virtualexx

Цитата:
Еще вот: есть ли функции, позволяющие определить последнюю дату текущего месяца?

Пример получения последнего дня месяца июля 2006 года.

Код: =КОНМЕСЯЦА(ДАТАЗНАЧ("1/7/2006");0)
Автор: Nightcrawler
Дата сообщения: 11.07.2006 11:20

Цитата:
Еще вот: есть ли функции, позволяющие определить последнюю дату текущего месяца?


не совсем то, но по крайней мере, не надо последний день каждый раз забивать вручную:
=IF(МЕСЯЦ(СЕГОДНЯ())<>МЕСЯЦ(СЕГОДНЯ()+1);"Внимание: последний день месяца!";"")
Автор: SERGE_BLIZNUK
Дата сообщения: 11.07.2006 12:52

Цитата:
есть ли функции, позволяющие определить последнюю дату текущего месяца?


Цитата:
=КОНМЕСЯЦА(ДАТАЗНАЧ("1/7/2006");0)

странно, но у меня в Excel такой функции нет... 8-() ?...
можно так:
Код:
=СЕГОДНЯ()-ДЕНЬ(СЕГОДНЯ()+31)+31
Автор: Yuk
Дата сообщения: 11.07.2006 17:23

Цитата:
Цитата:
=КОНМЕСЯЦА(ДАТАЗНАЧ("1/7/2006");0)
странно, но у меня в Excel такой функции нет

КОНЕЦМЕСЯЦА = EOMONTH
Для определения дня:
Код: =ДЕНЬ(КОНЕЦМЕСЯЦА(ДАТАЗНАЧ("1/7/2006");0))
Автор: SuperMaximus
Дата сообщения: 11.07.2006 20:56
Борюсь с проблемой висящего в памяти Excel.exe после завершения макроса, осуществляющего процедуру создания док-та MS Word путем слияния :

Внизу приведен код процедуры, которая и оставляет висеть процесс "Excel.exe"
в памяти после выполнения макроса 'JoinALL' (Вордовский макрос создает в ворде, в свою очередь еще один документ, который является результатом слияния)....
Вызов макроса в данном примере я закомментировал, т.к. полностью вставил его тело (с соотв ссылками на WordApp) в тело экселевского макроса. Однако месторасположение макроса никоим образом не влияет на результат (excel.exe все равно продолжает висеть в памяти).


Код:
Sub RunContract_Automation()

'Dim Fs As Variant
Dim ContractPath As String
Dim WordApp As Word.Application
Dim WordDoc As Word.Document
Dim CType As String, CFile As String


Set WordApp = CreateObject("Word.Application")
Set WordDoc = WordApp.Documents.Open _
(ThisWorkbook.Path & "\" & CFile)
WordApp.Visible = True
' WordApp.RUN "JoinALL"


With WordApp.Application

'=========Текст макроса JoinALL Вордовского файла=======
.ActiveDocument.MailMerge.MainDocumentType = wdFormLetters
.ActiveDocument.MailMerge.OpenDataSource name:=ActiveDocument.Path & "\WORK.xls", _
ConfirmConversions:=False, ReadOnly:=False, LinkToSource:=True, _
AddToRecentFiles:=False, PasswordDocument:="", PasswordTemplate:="", _
WritePasswordDocument:="", WritePasswordTemplate:="", Revert:=False, _
Format:=wdOpenFormatAuto, Connection:= _
"Provider=Microsoft.Jet.OLEDB.4.0;Password="""";User ID=Admin;Data Source=WORK.xls;Mode=Read;Extended Properties=""HDR=YES;IMEX=1;"";Jet OLEDB:System database="""";Jet OLEDB:Registry Path="""";Jet OLEDB:Database Password="""";Jet OLEDB:Engine Type=35;Je" _
, SQLStatement:="SELECT * FROM Import$`", SQLStatement1:="", SubType:= _
wdMergeSubTypeAccess

.ActiveDocument.MailMerge.Destination = wdSendToNewDocument
.ActiveDocument.MailMerge.SuppressBlankLines = True
.ActiveDocument.MailMerge.DataSource.FirstRecord = ActiveDocument.MailMerge.DataSource.ActiveRecord
.ActiveDocument.MailMerge.DataSource.LastRecord = ActiveDocument.MailMerge.DataSource.ActiveRecord
.ActiveDocument.MailMerge.Execute Pause:=False
'=============================================================



With .Dialogs(wdDialogFileSaveAs)
.name = "D:\NEW\" & ContractName
.Show
End With

' .Quit SaveChanges:=wdDoNotSaveChanges

End With

WordApp.Quit SaveChanges:=wdDoNotSaveChanges

Set WordApp = Nothing
Set WordDoc = Nothing

End Sub

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

Предыдущая тема: Стоит ли переходить с Билдера на Делфи?


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.