Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
Как извлечь адрес местонахождения рабочей книги исполняемого файла Excel
 
Доброго времени суток!
Есть рабочий Проект на основе Microsoft Excel.
По сути программное обеспечение.
Инсталлируется установщиком в указанную пользователем папку .
Проект прекрасно работает, запускается, код защищен и т.д.
Но возникла проблема из-за ошибочных путей к рабочим файлам они не открываются,
так как ссылаются на временную папку, а нужен правильный путь к установленной программе.
Иными словами, адрес по которому находится сам исполняемый файл: Excel.exe.
Цитата
ThisWorkbook.Path
неплохо справляется с задачей. Также как и
Цитата
ActiveWorkbook.Path
Но проблема в том  что после конвертации *.xls в *.exe все это сыпется.
Эти же самые операнды не отображают реального расположения файла.
Что конечно же правомерно, так как все действия переносятся в папку Temp.
После чего тот же
Цитата
ThisWorkbook.Path
прописывает путь к временно созданной внутри себя папке:
Цитата
C:\Users\Пользователь\AppData\Local\Temp\XL181124191800_tmp\XL­tmp\Visa Base
Хотя должно быть:
Цитата
C:\Visa Creator\Visa Base
А в этой папке \Visa Base и в корневике хранятся все рабочие файлы к которым нужно
постоянно обращаться, менять, сохранять, справка CHM, Readme.txt и т.д и т.п.
То есть весь проект ломается из-за ложных путей.
Понятно, что можно просто прописать четкий путь.
Но часто при инсталляции пользователи ставят программу куда захотят.
Кто-то может знает пути решения этой головоломки?
Какие есть способы "найти себя", не заглядывая в ветку Temp.
Может например при открытии книги как то вычислять путь.
Или есть какие то другие способы.
Помогите советом пожалуйста!
Изменено: Vrajadas - 25.11.2018 11:02:21
Как избежать ошибки кода на защищенном листе при изменении ячеек?, Включение и отключение защиты листа при наличии кода
 
Доброго времени суток!
Имеется приложение в 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
Может кто сталкивался с подобным и знает простое решение.
По сути нужно защитить даже не лист а просто диапазон ячеек на листе.
Формулы в этих ячейках тоже желательно все-таки скрыть.
Заранее благодарен за советы и решения

Изменено: Vrajadas - 21.11.2018 19:17:48
Перенос сторки при достижении установленного количества знаков
 
Дорогие форумчане!

Есть простой вопросик, может кто сталкивался.
Возникла необходимость заполнять поля А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
поля_из_списка.xls (23 КБ)
Заранее спасибо!
Изменено: Vrajadas - 05.11.2018 19:57:59
Разделение длинного текста на несколько коротких частей, Как автоматически разделить текст с учетом количества символов в результирующих ячейках
 
Вопрос конечно не новый. Однако красивого решения так и не смог найти.
При заполнении анкет на сайтах часто возникает необходимость вбить длинный текст в несколько полей.
То есть имеется определенная ячейка с текстовой строкой (в данном случае адрес отеля) с количеством символов от 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 символов.
Может есть какое то простое решение...
Заранее спасибо!
Изменено: Vrajadas - 08.10.2015 09:25:25
Как проверить наличие именованного диапазона?
 
Имеется диапазон с определенным именем (в моем случае имя "Рисунок")
Это имя + формула присваивается при активации отчетного листа
Это необходимая мера так как наличие формулы у этого имени сильно тормозит систему
(связано с отображением графических файлов на отчетном листе)
Поэтому и было принято данное решение: создавать-удалять имя
При переходе на другой лист имя "Рисунок" успешно удаляется - кликаем лист "Отчет" снова создается.
Все работает на "ура" но при двойном переходе к последующему листу, минуя "Отчет", Excel естественно ругается,
так как диапазона с таким именем не существует.

Вопрос очень простой: как проверить наличие определенного имени в ActiveWorkbook.Names и при его отсутствии
выйти из процедуры удаления имени.
Изменено: Vrajadas - 08.09.2015 03:10:18
Работа с несколькими выключателями, Как автоматизировать работу с выключателями в зависимости от их имени
 
Доброго времени суток всем!

Столкнулся с графической задачкой. Нужно оформить картинку с помощью переключателей.
Это картинка схемы трубопроводов (используется затем для гидравлических расчетов).
Идея в следующем: при нажатии одного из выключателей 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

Заранее спасибо!
Изменено: Vrajadas - 07.08.2015 12:31:35
Изменения данных поля со списком с сохранением текущего значения
 
Доброго времени суток всем!
Столкнулся с необходимостью замены значений в поле со списком
с помощью переключателей на пользовательской форме. Все в принципе понятно,
но есть одна проблема - как сохранить значение выбранное пользователем и затем
заменить на идентичное после переключения на другой список?
Списки содержат одинаковое количество строк.
То есть:
предположим в поле со списком выбрана 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
Изменено: Vrajadas - 11.10.2013 22:53:50
Как связать воедино выключатели формы и листа
 
Доброго дня!
Может кто-то подскажет как связать выключатель формы с выключателем листа
То есть чтобы при нажатии на аналогичный выключатель формы нажимался и выключатель на листе
Метод:
Код
ActiveWorkbook.Sheets("List").ToggleButton1.Value = True 

не срабатывает
Точнее срабатывает но уже после закрытия формы

То есть визуально выключатель листа остается на месте
и соответственно код листа не выполняется, что конечно же печально...
Изменено: Vrajadas - 09.10.2013 09:51:18
Как управлять громкостью микшера панели "Звуки и аудио устройства"?
 
Доброго времени суток всем!
Никто не подскажет как через VBA проверять громкость канала микшера: "MIDI Synth"?
При нулевой громкости перемещать ползунок в положение максимум?
Иными словами как достучаться до: Панель управления/Звуки и аудио устройства/Громкость микшера(Дополнительно..)/Play Control/MIDI Synth?

А то сделал музыкальную программу в Excel - включаю Форму "MIDI Синтезатор" но при нажатии на клавиши звука из динамиков не слышно и приходится "ручками" все время выкручивать громкость на максимум....  :(
Изменено: Vrajadas - 09.09.2013 20:44:18
Перемещение данных по таблице в зависимости от выбранного значения
 
Доброго времени суток всем!
Есть необходимость автоматизировать работу таблицы.
В ней находятся данные ограниченные с обеих сторон ячейками выделенные другим цветом.
Данные находящиеся внутри заданного диапазона должны иметь возможность перемещаться в зависимости от выбранного значения, являющегося ни чем иным как заголовком столбца
(счетчик R2 принимает значения от 1 до 16).
Сложность заключается в том чтобы данные перемещались со строчки на строчку при этом не разрываясь и не выходя за пределы диапазона.
Решение было найдено но очень кривое и работает только при смещении на единицу вперед или назад.
А если пользователь выберет перемещение больше чем на единицу получается ошибка.
Может нужно через VBA и с использованием цикла?
Может кто сталкивался с подобной задачей?

Файл в прицепе
Изменено: Vrajadas - 05.09.2013 17:20:33
Как присвоить новому файлу имя открываемого документа
 
Доброго дня всем!
Не подскажите можно ли как то присвоить создаваемому файлу имя открываемого документа.
Используется диалоговое окно. Я создаю текстовый файл с помощью скрипта из *.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
Изменено: Vrajadas - 21.07.2013 13:06:54
Импорт текста в таблицу Excel с идентификаторм
 
Доброго времени суток всем!
Пожалуйста помогите решить задачу.
Имеется текст вида:
Цитата
Мелодия###########
1#2#3#4#5#6#7#8#9#10#11#12
Са#Га'#Га'#Ма#Ма#Га'#Са#Га'#Па#Ма#--#--
--#Са#--#Па#--#--#--#Ма#--#--#--#--
1'#2'#3'#4'#5'#6'#7'#8'#9'#10'#11'#12'
Необходимо вставить этот текст в ячейки: A1:B5 активного листа.
Строку 1 вставить в ячейки A1:B1
Строку 2 игнорировать, но проверить на совпадение с текстом который уже присутствует на листе - и выйти из программы, если данные не совпали
Строки 3 и 4 вставить в диапазон A3:B4
Строку 5 игнорировать и проверить на совпадение с текстом - если нет то выйти
Соответственно при вставке убирать знак "#", служащий лишь в качестве разделителя

Желательно еще предварительно запустить диалоговое окно открытия файлов с расширением *.txt в директории: С:\MIDI, так как туда экспортируются данные с листа

PS. Как минимум нужно просто вставить данные в диапазон A1:B5 (но без "#" )
Изменено: Vrajadas - 17.07.2013 07:42:49
Экспорт/Импорт определенных ячеек в текст и обратно
 
Доброго времени суток всем!
Столкнулся с задачей сохранения данных.
Есть необходимость регулярной выгрузки данных определенных ячеек в 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

Помогите люди добрые!
Хотя кому-то эта операция покажется простой  :D  
но мне сложно реализовать эту операцию на практике
Изменено: Vrajadas - 15.07.2013 14:32:04
Работа с командной строкой средствами Excel
 
Пожалуйста научите меня работать с командной строкой в 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

Создание файла завершено....

Помогите с решением!

Предположим я открываю нужную папку в командной строке:
Код
Shell "cmd.exe /t:0f /k cd C:\MIDI" & vbCr 


а как прописать дальнейший код?
Изменено: Vrajadas - 13.07.2013 14:27:07
Как выполнить экспорт столбца Excel в файл *.txt
 
Здраствуйте! Столкнулся с задачей создания текстового файла из листа 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
Создание файла завершено успешно

Помогите с решением задачи!
Изменено: Vrajadas - 13.07.2013 11:55:15
Как запустить макрос (или сообщение) при вырезании ячейки
 
Здравствуйте! Помогите разобраться!  :)  
Составил программку и защитил лист кроме пользовательской группы ячеек.
Все прекрасно работает!
Но есть одна проблема: если пользователь захочет вырезать данные из одной незащищенной ячейки и вставит их в другую то все связи нарушатся и программа перестанет правильно работать.
Вопрос можно ли как то защитить группу ячеек от вырезания или чтобы при вырезании любой ячейки из заданного диапазона , к примеру, выскакивало сообщение о недопустимости данного действия и пользователь смог вернуть операцию.
Изменено: Vrajadas - 12.07.2013 16:53:23
Страницы: 1
Наверх