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

» Excel VBA (часть 3)

Автор: eng1ne
Дата сообщения: 04.05.2011 07:25
Доброго времени суток, господа.
Подскажите, как вытащить в ячейку на листе переменные СТРАНИЦА и СТРАНИЦ, находящиеся в колонтитуле? И возможно ли связать некую ячейку и примечание к некой ячейке, скажем ссылкой? Заранее благодарю.
Автор: smirnvlad
Дата сообщения: 04.05.2011 10:56
phoenix72rus

Цитата:
При открывании документа должно появлятся досовское окно (программа)

дос программы не работают на 64 битных системах, может из-за этого?

Цитата:
на одном, открылось все с пол пинка

и скрипты видны?

eng1ne

Цитата:
в ячейку на листе переменные СТРАНИЦА и СТРАНИЦ

макросом считающим печатные страницы (уже обсуждалось, и скрипт был)

Цитата:
связать некую ячейку и примечание к некой ячейке

гиперссылка на место в документе, не то?
Автор: phoenix72rus
Дата сообщения: 04.05.2011 12:42
Да все видно, программа работает как и должна, никак не могу понять почему у мя такая ерунда =\ щас пробую VB ставить, мб каких то библиотек не хватает...
Автор: andrewkard1980
Дата сообщения: 08.05.2011 11:54
Добрый день.
Получаю данные - часть из которых находятся в формате json в виде:
\u0433\u0440\u0443\u0437
Есть ли возможность средствами VBA привести в киррилицу?
Спасибо.
Автор: asbo
Дата сообщения: 08.05.2011 12:16
andrewkard1980,
VB-JSON: A Visual Basic 6 (VB6) JSON Parser Class Library
Автор: andrewkard1980
Дата сообщения: 08.05.2011 15:19
asbo
спасибо, но хотелось бы в виде функции в теле макроса.
Автор: smirnvlad
Дата сообщения: 08.05.2011 17:29
andrewkard1980

Цитата:
хотелось бы в виде функции в теле макроса

почему бы не выдрать из предложенной библиотеки
вот вариант только для "\u????"
[more]
Код: [no]
Function JSONuToStr(s As String)
Dim res As String

ssa = Split(s, "\u")
res = ssa(LBound(ssa))
For ssi = (LBound(ssa) + 1) To UBound(ssa)
res = res + ChrW(Val("&H" + Left(ssa(ssi), 4))) + Mid$(ssa(ssi), 5)
Next
JSONuToStr = res
End Function
[/no]
Автор: andrewkard1980
Дата сообщения: 08.05.2011 21:06
Ребят, откуда Вы это все знаете?
smirnvlad
спасибо, код сработал так как надо!
Правда у меня не получилось использовать его как функция, зато в тексте данный скрипт не выдавал ошибок.
Благодарю!
Автор: smirnvlad
Дата сообщения: 09.05.2011 17:49
andrewkard1980

Цитата:
не получилось использовать его как функция

[more]
Код: [no]
Function JSONuToStr(s As String)
Dim res As String

ssa = Split(s, "\u")
res = ssa(LBound(ssa))
For ssi = (LBound(ssa) + 1) To UBound(ssa)
res = res + ChrW(Val("&H" + Left(ssa(ssi), 4))) + Mid$(ssa(ssi), 5)
Next
JSONuToStr = res
End Function

Sub test()
Dim jsontext As String

jsontext = "\u0433\u0440\u0443\u0437"
ltext = JSONuToStr(jsontext)
If "груз" = ltext Then
MsgBox "Ok"
Else
MsgBox "Error"
End If
End Sub
[/no]
Автор: andrewkard1980
Дата сообщения: 10.05.2011 10:03
smirnvlad
Хорошо, спасибо.
Автор: fluffykzn
Дата сообщения: 10.05.2011 15:46
Приветствую.
Подскажите, как запустить на печать сразу всю книгу, но перед этим вызвав диалог выбора принтера.

По команде Application.Dialogs(xlDialogPrint).Show диалог выводится, но стоит галочка на "печать выделенных листов" и постоянно ее нужно прекючать на "печать всей книги". Может при открытии этого диалогового окна сразу возможно установить этот параметр?

Команда ActiveWorkbook.PrintOut Copies:=1, Collate:=True не подходит потому что печатается на выбранный по умолчанию принтер, что не устраивает, но и конкретного имени принтера нет - поэтому хотелось бы выбрать самому.
Автор: asbo
Дата сообщения: 10.05.2011 16:11
fluffykzn, а Application.ActivePrinter не поможет? И для Application.Dialogs есть еще xlDialogPrinterSetup. Может удастся что-то скомбинировать :)
Автор: fluffykzn
Дата сообщения: 11.05.2011 08:53
asbo
Спасибо, так и сделаю.
Автор: Mpa3b
Дата сообщения: 11.05.2011 20:48

Цитата:
На Хрюше выдает ошибку, что файл очень сильно поврежден, восстанавливает, пишет очень сильно поврежден и восстановить мало что удалось,

такая же петрушка(vista). писал в офисе 98 ом. затем 2000 м конвертировал. сегодня после попытки восстановления весь vba код теряется. сообщение excel я, что утерян VBA код.
чего только не перепробовал... 98ой офис не открывает, такая же петрушка. наверное нужно в 98ой винде все восстанавливать.
да, вьювер екселевский и тот не может открыть такие файлы
Автор: geka6pucT
Дата сообщения: 23.05.2011 14:47
Всем привет!
Тут мне поручили разобраться с макросом ексель... С макросами я всего лишь сталкивался пару раз.
Макрос на excel' е 2003, вылетает с ошибкой Runtime error 438 Object doesn't support this property or method, на строке:

Код:
Worksheets("ТОтч").Date_TN.Value = Format(DateToday, "dd.mm.yy")
Автор: asbo
Дата сообщения: 23.05.2011 15:55
geka6pucTПолучается какие-то контроы на листах размещены, которые называются Date_TN и Date_TE. Там таких еще полно (Date_V, Opl_TOtch, FormOpl). Посмотри в ObjectBrowser (F2) или ПКМ на переменной Definition.
Автор: andrewkard1980
Дата сообщения: 26.05.2011 15:08
Добрый день, Коллеги.
Возник вопрос. При открытии книги макрос сканирует, например с/н диска С и записывает его в ячейку. Нужно, что бы при первом запуске он скопировал с/н в ячейку, удалил часть этого кода (запись в ячейку) и дальше проверил текущий с/н с записанным, если все ок, выход.
Заранее спасибо.
Автор: AndVGri
Дата сообщения: 26.05.2011 15:28
andrewkard1980

Цитата:
проверил текущий с/н с записанным

Э, может сравнил?

Цитата:
если все ок, выход

Ок - это при каком условии?

Переведи себя
Автор: andrewkard1980
Дата сообщения: 26.05.2011 16:07
Извините.

Private Sub Workbook_Open()
z = Hex$(CreateObject("Scripting.FileSystemObject").GetDrive("C").SerialNumber)
Worksheets("Data").Range("A100") = z

z1 = Hex$(CreateObject("Scripting.FileSystemObject").GetDrive("C").SerialNumber)
If z <> z1 Then MsgBox (Error) Else Exit Sub

End Sub

Тут есть пару вопросов:
1) Можно ли записать значение SerialNumber не в ячейку листа, а в модуль?
2) Как при первом запуске удалить строчку:

z = Hex$(CreateObject("Scripting.FileSystemObject").GetDrive("C").SerialNumber)

Спасибо.

Добавлено:
Может опять неясно выразился.
1 запуск, должен быть код ввиде:

Private Sub Workbook_Open()
z = Hex$(CreateObject("Scripting.FileSystemObject").GetDrive("C").SerialNumber)
Worksheets("Data").Range("A100") = z
z1 = Hex$(CreateObject("Scripting.FileSystemObject").GetDrive("C").SerialNumber)
If z <> z1 Then MsgBox (Error) Else Exit Sub
End Sub

Повторные запуски (код должен трансформироватся в такой):

Private Sub Workbook_Open()
Worksheets("Data").Range("A100") = z
z1 = Hex$(CreateObject("Scripting.FileSystemObject").GetDrive("C").SerialNumber)
If z <> z1 Then MsgBox (Error) Else Exit Sub
End Sub

Спасибо.
Автор: asbo
Дата сообщения: 26.05.2011 16:42
andrewkard1980Для программного модифицирования кода нужно подключить библиотеку VBIDE (Microsoft Visual Basic for Applications Extensibility 5.3). А далее см. класс CodeModule.
Автор: andrewkard1980
Дата сообщения: 26.05.2011 17:22
asbo
Спасибо. Но наверное не туда копаю. Может тут можно сделать 2 модуля с:
Private Sub Workbook_Open()

первый проверит с/н и запишет в ячейку и удалится
второй будет сверять текущие значение с/н с записанным?
Автор: asbo
Дата сообщения: 26.05.2011 17:47

Цитата:
...сделать 2 модуля с: Private Sub Workbook_Open()

Нет. Это ведь не просто программный модуль, а модуль класса, и Private Sub Workbook_Open не просто процедура, а обработчик события Open класса Workbook.

Честно говоря эта защита белыми нитками шита...
Автор: andrewkard1980
Дата сообщения: 26.05.2011 20:46

Цитата:
Честно говоря эта защита белыми нитками шита...

Не спорю, asbo. Но хоть что-то...
А сейчас есть вариант более или менее?
Автор: asbo
Дата сообщения: 26.05.2011 21:16
andrewkard1980
Я не спец, просто немного представляю себе эту проблему. Да и тема немного не для этого топика - вопрос-то об идее, концепции, а не ее реализации... По реализации я тебе подсказал, что смог :)

Определись, что тебе защитить надо - данные, структуру или код? Или в комбинации... В зависимости от этого и подходы будут разные. Но, повторюсь, здесь это будет оффтоп :(

Погугли. Материалов, уверяю, множество в сети по всем названным.
Автор: AndVGri
Дата сообщения: 27.05.2011 02:22
andrewkard1980
Вот, потихонечку становиться ясно. Вопрос состоит из двух частей
1. Что считать повторным запуском и как его определить?
Скорее всего повторный запуск по времени. То есть получаем текущее время, сравниваем с уже сохранённым, если разница меньше допустимой, то считаем запуск повторным и выполняем действия для повторного запуска. Если разница больше допустимой, то запуск первичный - выполняем действия для первого запуска, сохраняем время первого запуска для последующих сравнений времени запусков.
2. Как хранить.
Думаю, что модифицировать модуль ни к чему. Проще записывать/читать с/н и дату первого запуска (см. выше):
2.1 в ячейки скрытого листа книги.
2.2 в реестр методами SaveSetting, GetSetting
2.3 создать свою структуру и читать/писать её в файл

Естественно нужно предусмотреть отслеживание ситуации, когда всё это выполняется первый раз. То есть проверить: существование файла, записей реестра, записей в ячейках, считать такой момент первым запуском и создать: файл, записи реестра, записи в ячейках.
Автор: andrewkard1980
Дата сообщения: 27.05.2011 11:23
asbo
Спасибо. После гугления начинаешь понимать - что все это бесполезно
AndVGri
Спасибо. Будем пробывать.
Автор: asbo
Дата сообщения: 27.05.2011 12:08
andrewkard1980
Цитата:
...все это бесполезно

Ну, примерно так. Я не хотел это категорично утверждать сразу, на уровне аксиомы. Эксель можно эффективно защитить от пользователя в концепции фулпруф. Но, похоже, это не твой случай :) Все остальное или ломается на 1-2-3, или же затраты на защиту вырастают просто неприлично.

В конечном итоге все зависит от уровня подготовленности конечного пользователя. Но ему никто не мешает обратиться к более опытным.
Автор: Alderbvcx
Дата сообщения: 27.05.2011 12:39
Добрый день, господа.
Прошу помочь со следующей ситуацией:
Есть лист, в нем очень большое количетсво таблиц разного размера. В каждой таблице есть строка, содержащая цифры - базовые значения, на основе которых формируются остальные значения таблицы. Необходимо найти в каждой таблице эту базовую строку с базовыми значениями и увеличить, например, на 10%.
Столбец начала базовых значений у всех одинаковый. Между таблицами встречаются и пустые строки, и текст с цифрами. Все цифровые значения таблицы имеют финансовый фрмат, у остальных - другой. Можно ли перебирать эти балицы таким путем: искать первою строку с финансовыми значениями, обработать ее. Все сотальные строки пропускать до тех пор, пока не встретится, например, пустая строка. Потом цикл повторяется - сново искать первую строку с фин. значениеми. Как это сделать? Или лучше сделать иначе?
Автор: asbo
Дата сообщения: 27.05.2011 14:20
Alderbvcx, честно говоря, на пальцах не совсем понятно.

* В каждой таблице есть строка, содержащая цифры - базовые значения ... Необходимо найти в каждой таблице эту базовую строку...
Она не первая?

* Столбец начала базовых значений у всех одинаковый
???

* Все цифровые значения таблицы имеют финансовый фрмат, у остальных - другой
Какой же все-таки у базовой?

Лучше, имо, по другому. Завести для базовых значений отдельную таблицу, и менять их там. А в ведомых таблицах просто дублировать эту базовую строку ссылками на их значения. Тогда ничего искать не придется, все будет в одном месте. А если коэффициент изменения базовых значений в одной строке одинаковый - то ввести и его отдельным полем.
Автор: Alderbvcx
Дата сообщения: 27.05.2011 14:54

Цитата:
Она не первая?

Да. Впереди нее несколько строк шапки таблиц. Наименования, даты и т.д.

Цитата:
Столбец начала базовых значений у всех одинаковый

Само собержимое - числовые значения в каждой таблице начинаются с одного и того же столбца. То есть, этот момент у них общий. А вот ширина и длина у таблиц разная.

Таблиц очень много, субъективно больше сотни на нескольких листах. Книгу мы не формируем, она у нас как данность, но нам с ней работать. Она будет меняться, дополняться незначительно и ее снова нужно будет обрабатывать. А если собирать отдельную таблицу базовых значений, все равно нужно будет обрабатывать таблицы. Выделять их и копировать, я правильно понимаю?
Коэффициент изменения базовых значений во всех таблицах одинаковый, но его нужно будет менять, также у всех сразу. Это не проблема, проблема в обработке таблиц.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127

Предыдущая тема: VS 2010


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