#excel #vba
#excel #vba
Вопрос:
Я пытаюсь в основном создать XLAM, который я могу распространять каждый раз, когда я делаю ревизию, которая откроет MsgBox
при первом запуске, но затем никогда больше. Я не хочу, чтобы конечным пользователям приходилось сохранять или что-либо еще, поскольку мои конечные пользователи, как правило, открывают Excel исключительно для использования простых функций, таких как создание последовательности запусков для копирования в буфер обмена, а затем закрывают книгу без сохранения.
Я нашел это -> http://www.vbaexpress.com/kb/getarticle.php?kb_id=511
Но для этого требуется сохранение рабочей книги, что является проблемой, потому что мои пользователи часто не сохраняют рабочие книги. Я попытался добавить ActiveWorkbook.Save
в код, который не сработал. Я также пытался вставить его в ThisWorkBook
, и это не сработало, но я подозреваю, что код просматривается Modules
не ThisWorkBook
.
У кого-нибудь есть какие-либо предложения? Я знаю, как написать код для MsgBox
автоматического запуска при запуске, но я понятия не имею, с чего начать, чтобы он запускался только один раз.
Я ищу вариант только с кодом, ни один из вариантов, перечисленных в приведенном выше URL, мне не нравится, например, редактирование рабочей книги, создание regedit или создание локального файла.
Обновить:
У меня была идея, могу ли я заставить макрос удалить file.xlam
сам по себе, даже если он был загружен в Excel? Что-то вроде «Принудительного удаления»
Комментарии:
1. Рассматривали ли вы возможность сохранения отпечатка пальца / IP-адреса системы пользователей в онлайн-хранилище, возможно, на простой веб-странице, которая выдаст простой ответ (что-то вроде сайтов «какой у меня ip»)?
Ответ №1:
Обновить:
Я только что получил одобрение по этому вопросу сегодня и на самом деле подошел к этому по-другому, используя некоторые недавние знания, которые я приобрел.
На самом деле VBA имеет встроенную функцию сохранения / чтения / обновления Windows Reg в ограниченной папке. Я получил его для чтения / записи / обновления в другом месте через вызывающую оболочку, но я предпочитаю встроенный метод, когда это возможно.
Я использовал это https://learn.microsoft.com/en-us/office/vba/language/reference/user-interface-help/savesetting-statement чтобы сохранить reg-ключ с указанием «reset» = TRUE, и первое, что сделал мой макрос, это проверил это, и если оно не существует, создайте его и выполните XYZ. При следующем запуске он найдет ключ и продвинется дальше. Просто другой подход..
Я уверен, что существует много разных способов достижения этой цели, и каждый из них будет полезен в зависимости от сценария использования. В моем случае в итоге я получил файл XLAM, в который были записаны следующие данные (имя пользователя / дата / номер редакции) в центральный «update_log.txt » файл на сервере, а затем при каждом запуске проверяется номер текущей редакции и update_log.txt для подтверждения получения пользователем MsgBox
. Если нет, отобразите его.
Когда мне нужно отправить новое сообщение, я обновляю «Ревизию.XLAM» с новым MsgBox
описанием обновления и увеличением номера редакции обновления.
Код выглядит следующим образом:
Основной подраздел:
'''''PUBLICVARS'''''
Public blnFound As Boolean
Public UpdateRev As Variant
'''''ENDPUBVARS'''''
Public Sub UpdateMsg()
Call UpdateLogCheck ' Check and/or create Update_Log.txt
blnFound = False ' Always start false
UpdateRev = "Updated:1" amp; (Environ$("Username")) 'Increment with each Update
Call SearchTextFile(UpdateRev)
If Not blnFound = "True" Then
Call Update_Msg
Call IncrementUpdateLog(UpdateRev)
End If
End Sub
Модуль CreateUpdateLog:
Public Sub UpdateLogCheck()
Dim UpdateFile As Variant
UpdateFile = "\serverupdate_log.txt"
Set fs = CreateObject("Scripting.FileSystemObject")
If Dir(UpdateFile, vbDirectory) = vbNullString Then
Set a = fs.CreateTextFile(UpdateFile, False)
End If
End Sub
Модуль журнала поиска обновлений:
Public Sub SearchTextFile(strSearch)
strFileName = "\serverupdate_log.txt"
' Const strSearch = "Updated:1"
Dim strLine As String
Dim f As Integer
Dim lngLine As Long
f = FreeFile
Open strFileName For Input As #f
Do While Not EOF(f)
lngLine = lngLine 1
Line Input #f, strLine
If InStr(1, strLine, strSearch, vbBinaryCompare) > 0 Then
blnFound = True
Exit Do
End If
Loop
Close #f
End Sub
Модуль UpdateMsg:
Public Sub Update_Msg()
Dim line1 As Variant
Dim line2 As Variant
Dim line3 As Variant
Dim line4 As Variant
Dim line5 As Variant
Dim line6 As Variant
Dim line7 As Variant
Dim line8 As Variant
Dim line9 As Variant
line1 = "This is the 'New Revision' Message, it should only appear once when there is a new revision"
line2 = "This Revision focused on this new delivery system for Revision Updates"
MsgBox line1 amp; vbCrLf amp; vbCrLf amp; _
line2 amp; vbCrLf amp; vbCrLf amp; _
line3 amp; vbCrLf amp; vbCrLf amp; _
line4 amp; vbCrLf amp; vbCrLf amp; _
line5 amp; vbCrLf amp; vbCrLf amp; _
line6 amp; vbCrLf amp; vbCrLf amp; _
line7 amp; vbCrLf amp; vbCrLf amp; _
line8 amp; vbCrLf amp; vbCrLf amp; _
line9 amp; vbCrLf amp; vbCrLf
End Sub
Файл журнала увеличения / обновления:
Public Sub IncrementUpdateLog(UpdateRev)
Dim UpdateFile As Variant
UpdateFile = "\serverupdate_log.txt"
Open UpdateFile For Append As #1
Write #1, UpdateRev
Close #1
End Sub