Доброго времени суток! Есть рабочий Проект на основе Microsoft Excel. По сути программное обеспечение. Инсталлируется установщиком в указанную пользователем папку . Проект прекрасно работает, запускается, код защищен и т.д. Но возникла проблема из-за ошибочных путей к рабочим файлам они не открываются, так как ссылаются на временную папку, а нужен правильный путь к установленной программе. Иными словами, адрес по которому находится сам исполняемый файл: Excel.exe.
Цитата
ThisWorkbook.Path
неплохо справляется с задачей. Также как и
Цитата
ActiveWorkbook.Path
Но проблема в том что после конвертации *.xls в *.exe все это сыпется. Эти же самые операнды не отображают реального расположения файла. Что конечно же правомерно, так как все действия переносятся в папку Temp. После чего тот же
Цитата
ThisWorkbook.Path
прописывает путь к временно созданной внутри себя папке:
Цитата
C:\Users\Пользователь\AppData\Local\Temp\XL181124191800_tmp\XLtmp\Visa Base
Хотя должно быть:
Цитата
C:\Visa Creator\Visa Base
А в этой папке \Visa Base и в корневике хранятся все рабочие файлы к которым нужно постоянно обращаться, менять, сохранять, справка CHM, Readme.txt и т.д и т.п. То есть весь проект ломается из-за ложных путей. Понятно, что можно просто прописать четкий путь. Но часто при инсталляции пользователи ставят программу куда захотят. Кто-то может знает пути решения этой головоломки? Какие есть способы "найти себя", не заглядывая в ветку Temp. Может например при открытии книги как то вычислять путь. Или есть какие то другие способы. Помогите советом пожалуйста!
Доброго времени суток! Имеется приложение в Excel, некоторые ячейки которого хотелось бы защитить. Не столько скрыть формулы - сколько просто от случайного стирания. Что разумеется легко решается. Ничего нового - тема стара как мир и решается через Protect. На всех процедурах: Sub ... End Sub все прекрасно работает. Однако когда дело доходит до процедур изменения ячеек с последующими действиями исполнение кода завершается ошибкой. То есть при появлении завершающего присваивания пароля:
Код
Worksheets("List1").Protect Password:="555"
Процедура вылетает. Ошибка вида: Run Time Error '1004'
Код
Private Sub Worksheet_Change(ByVal Target As Range)
Application.ScreenUpdating = False
Worksheets("List1").Unprotect Password:="555"
'много ячеек подверженных изменению
Set KeyCells = Range("B1")
If Not Application.Intersect(KeyCells, Range(Target.Address)) _
Is Nothing Then
'необходимые действия
Set KeyCells = Range("B2")
If Not Application.Intersect(KeyCells, Range(Target.Address)) _
Is Nothing Then
'необходимые действия
'и так далее
Worksheets("List1").Protect Password:="555"
End Sub
Может кто сталкивался с подобным и знает простое решение. По сути нужно защитить даже не лист а просто диапазон ячеек на листе. Формулы в этих ячейках тоже желательно все-таки скрыть. Заранее благодарен за советы и решения
Есть простой вопросик, может кто сталкивался. Возникла необходимость заполнять поля А3 и А4 (это для анкеты) данными из списка А2 При выборе значения из списка оно наполняет нижнее поле.
При достижении длины поля более 50 знаков необходимо перейти на нижнюю строчку а при достижении 50 знаков остановить процесс. Желательно чтобы после завершения всего процесса последняя запятые в верхнем и нижнем поле были удалены.
Код
'Заполняем поля посещения стран автоматически
Private Sub Worksheet_Change(ByVal Target As Range)
Set KeyCells = Range("A2")
If Not Application.Intersect(KeyCells, Range(Target.Address)) _
Is Nothing Then
Application.ScreenUpdating = False
Dim str As String
Dim i As Long
For i = 0 To Range("A2").Count - 1
If Range("A2").Select Then
str = str & Range("A2").Value & ", "
End If
Next
Range("A3").Value = Range("A3").Value & str
End If
End Sub
Вопрос конечно не новый. Однако красивого решения так и не смог найти. При заполнении анкет на сайтах часто возникает необходимость вбить длинный текст в несколько полей. То есть имеется определенная ячейка с текстовой строкой (в данном случае адрес отеля) с количеством символов от 10 до 105. Нужно разбить этот текст на три части длиною не более 35 символов и вставить в 3 ячейки. Слова конечно же отделены пробелом и их нельзя дробить. Например исходная строка: VAMANA TRAVELS INDIA PVT LTD FF10, ANSAL FORTUNE ARCADE, SECTOR 18, NOIDA 201301 А необходимо получить: VAMANA TRAVELS INDIA PVT LTD FF10, ANSAL FORTUNE ARCADE, SECTOR 18, NOIDA 201301
Задача казалось бы простая, но на практике так и не смог получить эффективное решение несколькими формулами. Приходится проводить множество операций. Сначала разбивать текст на слова. Потом вычислять их длину. Потом "склеивать" их по признаку чтобы в строке было не более 35 символов. Может есть какое то простое решение... Заранее спасибо!
Имеется диапазон с определенным именем (в моем случае имя "Рисунок") Это имя + формула присваивается при активации отчетного листа Это необходимая мера так как наличие формулы у этого имени сильно тормозит систему (связано с отображением графических файлов на отчетном листе) Поэтому и было принято данное решение: создавать-удалять имя При переходе на другой лист имя "Рисунок" успешно удаляется - кликаем лист "Отчет" снова создается. Все работает на "ура" но при двойном переходе к последующему листу, минуя "Отчет", Excel естественно ругается, так как диапазона с таким именем не существует.
Вопрос очень простой: как проверить наличие определенного имени в ActiveWorkbook.Names и при его отсутствии выйти из процедуры удаления имени.
Столкнулся с графической задачкой. Нужно оформить картинку с помощью переключателей. Это картинка схемы трубопроводов (используется затем для гидравлических расчетов). Идея в следующем: при нажатии одного из выключателей 1-й группы с именами: a, b, c и d заполняется картинка вертикальных участков с помощью выключателей 2-й группы с номерами: 1, 2, 3, 4, 5 и т.д. Для простоты примера не стал городить много имен, но в реальности сетка гораздо больше размером При изменении ячейки A1 заполняются соответствующие горизонтальные участки опять-таки в зависимости от выключателей группы с именам: a, b, c и d.
Есть ли способы решить простым способом задачку: Чтобы при нажатии одного из выключателей 1-й группы другие автоматически отключались То есть для корректной работы должен быть включен только один выключатель 1-й группы, например с именем a Отключение лишних в моем варианте:
Код
Private Sub X1_Click()
If X1.Value = True Then
X2.Value = False
X3.Value = False
X4.Value = False
End If
End Sub
и т.д. Но код получается слишком длинным Можно ли как то цикл запустить в зависимости от имени выключателя другие чтоб отключались И можно ли вообще обратиться к конкретному выключателю используя его Свойство: Name? По сути это и есть главный вопрос. Дальнейшая работа из-за этого не идет... Типа такого, но у меня не сработало:
Код
For n = 2 To 4
("X" & n).Value = False
Next n
так и не смог разобраться... Как описать универсальную функцию которая бы обрабатывала события вкл/откл выключателей и делала видимыми нужные участки трубопровода в зависимости от их состояния: не хочется делать 10 этажей кода, думаю если разберусь как обращаться по именам - дело пойдет...
Для примера показал заполнение 1-го столбца картинки при включенной "кнопке" a
Доброго времени суток всем! Столкнулся с необходимостью замены значений в поле со списком с помощью переключателей на пользовательской форме. Все в принципе понятно, но есть одна проблема - как сохранить значение выбранное пользователем и затем заменить на идентичное после переключения на другой список? Списки содержат одинаковое количество строк. То есть: предположим в поле со списком выбрана 5-я строка 1-го списка после переключения автоматически должна отобразиться 5-я строка 2-го списка
Помогите пожалуйста разобраться с циклом люди добрые! Есть необходимость присвоить определенной переменной последовательно 4 значения: 0,1,2,3 Причем после каждого присваивания процедура должна осуществлять переход к другому блоку операторов и помимо этого еще передавать определенные значения 4-х ячеек На практике же по понятным причинам выполняется лишь один первый переход с присваиванием значения лишь одной ячейки
Код
For u = 0 To 3
If u = 1 Then: Swar = Sheets("List").Range("FG22"): GoTo Enter:
If u = 2 Then: Swar = Sheets("List").Range("FH22"): GoTo Enter:
If u = 3 Then: Swar = Sheets("List").Range("FI22"): GoTo Enter:
If u = 0 Then: Swar = Sheets("List").Range("FF22"): GoTo Enter:
Next u
Enter:
Select Case i
Case Is < 0
Toggle1 = False
Case Is = 0
Cells(3 + u, 2).Value = Swar
Case Is <= 17 - j
Cells(3 + u, (1 + i) + (j - 1)).Value = Swar
Case Is <= 33 - j
Cells(8 + u, (1 + i) - (17 - j)).Value = Swar
Case Is <= 49 - j
Cells(13 + u, (1 + i) - (33 - j)).Value = Swar
Case Is <= 65 - j
Cells(18 + u, (1 + i) - (49 - j)).Value = Swar
Case Is <= 81 - j - (17 - j)
Cells(23 + u, (1 + i) - (65 - j)).Value = Swar
Case Is > 81 - j - (17 - j)
Toggle1 = False
End Select
это далеко не весь код но идея думаю понятная
никак не могу понять как выполнить тело этого цикла полностью? а может есть решение попроще...
в итоге в определенном месте по нажатию кнопки и в зависимости от значения счетчика i должен появиться столбик из значений 4-х ячеек:FG22,FH22,FI22,FF22
Доброго дня! Может кто-то подскажет как связать выключатель формы с выключателем листа То есть чтобы при нажатии на аналогичный выключатель формы нажимался и выключатель на листе Метод:
Доброго времени суток всем! Никто не подскажет как через VBA проверять громкость канала микшера: "MIDI Synth"? При нулевой громкости перемещать ползунок в положение максимум? Иными словами как достучаться до: Панель управления/Звуки и аудио устройства/Громкость микшера(Дополнительно..)/Play Control/MIDI Synth?
А то сделал музыкальную программу в Excel - включаю Форму "MIDI Синтезатор" но при нажатии на клавиши звука из динамиков не слышно и приходится "ручками" все время выкручивать громкость на максимум....
Доброго времени суток всем! Есть необходимость автоматизировать работу таблицы. В ней находятся данные ограниченные с обеих сторон ячейками выделенные другим цветом. Данные находящиеся внутри заданного диапазона должны иметь возможность перемещаться в зависимости от выбранного значения, являющегося ни чем иным как заголовком столбца (счетчик R2 принимает значения от 1 до 16). Сложность заключается в том чтобы данные перемещались со строчки на строчку при этом не разрываясь и не выходя за пределы диапазона. Решение было найдено но очень кривое и работает только при смещении на единицу вперед или назад. А если пользователь выберет перемещение больше чем на единицу получается ошибка. Может нужно через VBA и с использованием цикла? Может кто сталкивался с подобной задачей?
Доброго дня всем! Не подскажите можно ли как то присвоить создаваемому файлу имя открываемого документа. Используется диалоговое окно. Я создаю текстовый файл с помощью скрипта из *.mid. Всякий раз переименовывать файлы достаточно трудоемко так как файлов бывает много.
Код
Sub Converter()
'проверка наличия скрипта в директории C:\WINDOWS
If Dir("C:\WINDOWS\mf2tXP.exe") = "" Then
MsgBox "Для продолжения работы" & vbNewLine & "установите приложение:" & vbNewLine & "C:\WINDOWS\mf2tXP.exe" & vbNewLine & "", vbCritical, "Ошибка"
Exit Sub
End If
On Error Resume Next
'открываем диалоговое окно выбора файла *.mid
FOpen$ = Application.GetOpenFilename(FileFilter:="Text Files (*.mid), *.mid")
If VarType(FOpen$) = vbBoolean Then Exit Sub
'создаем пустой текстовый файл для дальнейшей конвертации
MyPath$ = "C:\Temp\"
MkDir MyPath$
Set fso = CreateObject("scripting.filesystemobject")
Set ts = fso.CreateTextFile(MyPath$ & ".txt", True)
ts.Close
'назначаем директорию скрипта
Const PATH = "C:\WINDOWS\"
'проверка хода выполнения скрипта с помощью сообщения
MsgBox PATH & "mf2tXP.exe " & FOpen$ & " " & MyPath$ & ".txt", vbInformation, "Проверка выполнения скрипта"
'запрускаем непосредственно сам скрипт и назначаем ему файл для конвертации и результирующий файл
CreateObject("wscript.shell").Run PATH & "mf2tXP.exe " & FOpen$ & " " & MyPath$ & ".txt", 0, True
Set ts = Nothing: Set fso = Nothing
'даем пользователю знать что файлы созданы и перемещены в папку
MsgBox "Файлы созданы, и помещены в папку" & vbNewLine & MyPath$, vbInformation, "Готово!"
' открываем саму папку с созданным файлом
CreateObject("wscript.shell").Run "explorer.exe /e, """ & MyPath$ & """"
End Sub
можно ли как то "отловить" имя открываемого документа и создать одноименный .txt?
Добрый день! Есть текстовый файл с данными Мне необходимо прежде чем вставлять данные на лист проверить его, например по первой строчке. При запуске проверки с помощью If - программа перестает отвечать и все время выдает сообщение об ошибке проверки ключа Где ошибка в коде? Может кто поправит Интересно что при отключении Оператора If...Else...End If все работает и данные прекрасно загружаются
Код
Sub Открыть_урок()
Dim MyPath As String
Dim SaveDriveDir As String
SaveDriveDir = CurDir
MyPath = "C:\"
ChDrive MyPath
ChDir MyPath
On Error Resume Next
FOpen = Application.GetOpenFilename(FileFilter:="Text Files (*.txt), *.txt")
If VarType(FOpen) = vbBoolean Then Exit Sub
Application.ScreenUpdating = False
Range("G49").Select
Set ImpRng = ActiveCell
Open FOpen For Input As #1
Dim s As String
Input #1, s
'If s = "XX#1#2#3#4#5#6#7#8#9#10#11#12#13#14#15#16" Then
Range("G49").Value = s
r = 1
Do Until EOF(1)
Line Input #1, data
ActiveCell.Offset(r, 0) = data
r = r + 1
Loop
Close #1
Application.ScreenUpdating = True
'Else: MsgBox "Файл не прошел проверку ключа! " & vbNewLine & "Выберите другой файл", vbInformation, "Ошибка в данных"
'Exit Sub
'End If
End Sub
Необходимо вставить этот текст в ячейки: A1:B5 активного листа. Строку 1 вставить в ячейки A1:B1 Строку 2 игнорировать, но проверить на совпадение с текстом который уже присутствует на листе - и выйти из программы, если данные не совпали Строки 3 и 4 вставить в диапазон A3:B4 Строку 5 игнорировать и проверить на совпадение с текстом - если нет то выйти Соответственно при вставке убирать знак "#", служащий лишь в качестве разделителя
Желательно еще предварительно запустить диалоговое окно открытия файлов с расширением *.txt в директории: С:\MIDI, так как туда экспортируются данные с листа
PS. Как минимум нужно просто вставить данные в диапазон A1:B5 (но без "#" )
Доброго времени суток всем! Столкнулся с задачей сохранения данных. Есть необходимость регулярной выгрузки данных определенных ячеек в C:\MIDI\dadra_*.txt. где * - всякий раз новое имя Затем когда возникает необходимость - то импортировать данные снова на лист из C:\MIDI\dadra_*.txt Желательно все реализовать с помощью 2-х кнопок: 1. Экспорт и 2. Импорт(см. файл) Предполагается что лист будет защищен, но как я понял это не мешает отправке данных в файл. Диапазоны ячеек для сохранения:
Код
Range ("B1:P21")
К примеру "Экспорт" можно так:
Код
Private Sub CommandButton2_Click()
Open "C:\MIDI\dadra_i.txt" For Output As #1
Range("B1:P21").Copy
With New DataObject
.GetFromClipboard
Print #1, Replace(.GetText(1), vbTab, "&")
End With
Application.CutCopyMode = False
Close #1
End Sub
Как создать диалоговое окошко и выполнить обратную операцию "Импорт" также с диалговым окном? Хотелось бы при импорте проверку на соответствие по первой строчке dadra_*.txt
Помогите люди добрые! Хотя кому-то эта операция покажется простой но мне сложно реализовать эту операцию на практике
Пожалуйста научите меня работать с командной строкой в VBA Excel
Имеется файл *.txt созданный из *.xls Имеется файлик с программой по адресу С:\Windows\t2mfXP.exe Нужно с этим файлом выполнить следующие действия: 1) Запустить командную строку Пуск\Выполнить затем cmd 2) Зайти из под командной строки в нужную папку C:\Documents And Settings\Имя пользователя>cd C:\MIDI Запустить программу и выполнить задачу: C:\MIDI>t2mfXP.exe sample.txt sample.mid
Создание файла завершено....
Помогите с решением!
Предположим я открываю нужную папку в командной строке:
Здраствуйте! Столкнулся с задачей создания текстового файла из листа Excel Вопрос как одним кликом по кнопке создать текстовый файл с данными из первого столбца в той же папке, где находится сам исходник. Например в категории C:\MIDI.
Есть ли средства в VBA Excel которые помогут созданный таким образом файл sample.txt обработать с помощью программы находящейся в папке
Цитата
С:\Windows\t2mfXP.exe
То есть действия попунктно: 1) Запускаем командную строку Пуск\Выполнить набираем cmd 2) Вводим в появившейся командной строке C:\Documents And Settings\Имя пользователя>cd C:\MIDI Нажатие Enter C:\MIDI>t2mfXP.exe sample.txt sample.mid Нажатие Enter Создание файла завершено успешно
Здравствуйте! Помогите разобраться! Составил программку и защитил лист кроме пользовательской группы ячеек. Все прекрасно работает! Но есть одна проблема: если пользователь захочет вырезать данные из одной незащищенной ячейки и вставит их в другую то все связи нарушатся и программа перестанет правильно работать. Вопрос можно ли как то защитить группу ячеек от вырезания или чтобы при вырезании любой ячейки из заданного диапазона , к примеру, выскакивало сообщение о недопустимости данного действия и пользователь смог вернуть операцию.