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

» Excel VBA (часть 3)

Автор: grbdv
Дата сообщения: 12.03.2012 19:11
psiho, несколько соображений, если я все правильно понял:

1. Worksheets("Данные") - вынести в общий With

2. LastRowInRange = Sh.SpecialCells(xlCellTypeLastCell).Row
а если все-таки Public Function LastRowInRange(Sh As Range)
то Public Function LastRowInRange(Sh As Range) As Range

3. Вместо двух процедур:
Call SpeedOnOff(True)
Call SpeedOnOff(False)
Public Sub SpeedOnOff(pOn As Boolean)
With Application
.EnableEvents = pOn
.DisplayAlerts = pOn
.ScreenUpdating = pOn
End With
End Sub

4.
До цикла: sMask$ = String(Len(CStr(Количество)), "0")
В цикле: Worksheets("Данные").Cells(r, 4).Value = Название & "-" & Format(j, sMask)
Вместо:
If j < 10 Then
Worksheets("Данные").Cells(r, 4).Value = Название & "-" & "0" & j
Else
Worksheets("Данные").Cells(r, 4).Value = Название & "-" & j
End If

Автор: psiho
Дата сообщения: 12.03.2012 19:50

Цитата:
Public Function LastRowInRange(Sh As Range) As Range

Насчёт этого не согласен, т.к. данная функция должна выдавать номер строки, а не диапазон
Автор: grbdv
Дата сообщения: 12.03.2012 19:57

Цитата:
2. LastRowInRange = Sh.SpecialCells(xlCellTypeLastCell).Row

Промахнулся. Задумался :)
Тогда "as Long"
Но, во-первых эта ф-ция не нужна, а во-вторых - да хоть "as Something". Иначе будет Variant, а если именно он и нужен, то все равно лучше явно указать - и читать легче, и понятнее, и не забудешь, и ,вообще, хороший тон :)
Автор: Strong64
Дата сообщения: 19.03.2012 14:02
Скрытие строк в зависимости от значения в определенной ячейке



Здравствуйте уважаемые форумчане. Я слабо понимаю VBA. Но для знатоков я думаю задача простая... Хочется автоматизировать немножко процесс работы.

Итак. Имеется ячейка с выпадающим списком (сделана по типу: проверка данных-список)
К примеру ячейка А1 содержит выпадающий список (ДА/НЕТ). И нужно сделать условие: Если А1 = "НЕТ", то скрыть строчку А2, если А1="ДА", то эту строчку (А2) отобразить.

Подскажите пожалуйста, как это сделать без кнопочек.
Автор: grbdv
Дата сообщения: 19.03.2012 14:24
Strong64
Код для листа, где все это добро:

Код: Private Sub Worksheet_Change(ByVal Target As Range)
Select Case Target
Case Cells(1, 1): Cells(2, 1).EntireRow.Hidden = (Cells(1, 1).Value = "Да")
Case Else
End Select
End Sub
Автор: Strong64
Дата сообщения: 19.03.2012 15:24

Цитата:
Код для листа, где все это добро:


Спасибо огромное!
Автор: psiho
Дата сообщения: 19.03.2012 15:29
Strong64, для поста от grbdv имеется ввиду:
1. В Верхнем Меню Excel выбираешь последовательно: Сервис-Макрос-Редактор Visual Basic
2. В появившемся окне должно быть окошко с названием "Project-VBA Project" .
3. Там найдешь такую запись "VBAProject (Твое название файла Excel)"
4. Смотри ниже-должны быть названия твоих листов, например: "Лист1 (Лист1)"
5. Соверши двойное нажатие левой кнопкой мышки на нужном названии твоего листа, где находятся эти данные
6. Вставь в пустое окно ниже код от grbdv.
7. Выйди из редактора VisualBasic - выбери в меню "File -Close and Return to Microsot Excel"
8.Сохрани свой файл.
9. Проверь, чтобы были включены макросы. Для этого выбери в меню Excel: "Сервис-Макрос-Безопасность".
10. В появившемся окне во вкладке "Уровень безопасности" должен быть выбран "Низкий" или "Средний."
11.Выйди и снова зайди в Excel.
Теперь твой код будет работать.

Автор: Strong64
Дата сообщения: 19.03.2012 16:02
psiho, спасибо за информативный ответ!

Нашел код попроще:


Код: Private Sub Worksheet_Change(ByVal Target As Range)
Rows(2).Hidden = [A1] = "НЕТ"
End Sub
Автор: grbdv
Дата сообщения: 19.03.2012 16:39
Strong64
Цитата:
Нашел код попроще:

Он не проще. Он только короче и тупее. Мелкософт не случайно задумал параметр Target, только всегда находятся такие "умники", сокращатели кода, млин, которые не искренне не понимают зачем он нужен.

1. В ТЗ было сказано менять режим отображения строки, содержащей указанную ячейку (в данном случае - A2), а не строку 2.
2. В ТЗ было сказано делать это при изменении ячейки A1, а не проверять ячейку A1 на изменение при каждом чихе на листе, а потом уж пытаться скрывать-отображать, если это она изменилась.

И вообще, после признаний типа:
Цитата:
Я слабо понимаю VBA
, сравнивать коды из разных источников, по меньшей мере - бестактно...
Автор: Strong64
Дата сообщения: 21.03.2012 17:20

Цитата:
а не проверять ячейку A1 на изменение при каждом чихе на листе, а потом уж пытаться скрывать-отображать, если это она изменилась.


Полностью с вами согласен, был не прав... и правда лист как то стал после того "простого" кода подмигивать, что влияет на зрительный нерв работников нашей организации... Спасибо.
Автор: utwer
Дата сообщения: 21.03.2012 18:11
Подскажите пжлс, можно как-то экселевский файл привязать к конкретному ПК, чтобы на другом ПК его невозможно было открыть ?
Автор: grbdv
Дата сообщения: 21.03.2012 18:27
Strong64
Не за что. Страшно не то, что реагирует на каждый чих, а то, что пытается устанавливать статус видимости строки, когда этого не надо. В этом контексте и мой код нужно оптимизировать. Но это только, если лист очень нагруженный. В данном (частном) случае (как в мультике) - и так сойдет. Если хочешь - облагородим и его. Тем более, что он реагирует не на "Да" - "Нет", а на "Да" - не "Да", что несколько не соответствует ТЗ. Я не стал усложнять, чтобы начинающего совсем уж в ступор не вводить.

Добавлено:
utwer
Так быстро посмотрел версию для печати?
Вот, сразу же выпадает
http://forum.ru-board.com/topic.cgi?forum=33&topic=10903&start=20#5
Вот еще поищи "Автор: andrewkard1980, Отправлено:16:08 26-05-2011"
"Автор: KorolCOOL, Отправлено:12:08 26-07-2011"
Гугл в помощь по "VBA Защита кода"
Автор: andrewkard1980
Дата сообщения: 21.03.2012 23:31

Цитата:
Подскажите пжлс, можно как-то экселевский файл привязать к конкретному ПК, чтобы на другом ПК его невозможно было открыть ?

Бесполезно, тоже долго голову ломал над этим - оставил просто пароль, который снимается доп. программой за секунду.
Автор: psiho
Дата сообщения: 22.03.2012 07:05

Цитата:
Подскажите пжлс, можно как-то экселевский файл привязать к конкретному ПК, чтобы на другом ПК его невозможно было открыть ?

Один из возможных вариантов:
В эдиторе VBA в коде книги ставите:

Код: Private Sub Workbook_Open()
If Environ$("computername") <> "SERVER" Then
ThisWorkbook.Close
Else
Call ОбработкаДанных
End If
End Sub
Автор: aidomars
Дата сообщения: 22.03.2012 10:03
Можно еще сделать проверку на какой нибудь файл. Файла нет-книга закрылась.
Автор: grbdv
Дата сообщения: 22.03.2012 10:12
Вот всегда так - среди нескольких умников найдется один, умнее всех остальных :)
psiho
Задание звучит "чтобы на другом ПК его невозможно было открыть ", а не "закрыть, если..."

Но, это ерунда, мелочь. Вопрос-то для чела серьезный. Ты уж сразу обсказывай, как твоя "защита" обходится, а когда она вообще просто не сработает.
Автор: berk1979
Дата сообщения: 22.03.2012 15:44
Здравствуйте! Помогите пожалуйста написать скрипт для выгрузки задач из Outlook-a в Excel . И чтоб при получении задачи Outlook-ом данные синхронизировались бы онлайн с Excel файлом.

Вот что только нашел..

Dim OL_App As New Outlook.Application
Dim OL_NameSpace As Outlook.Namespace
Dim OL_FolderTask As Outlook.MAPIFolder
Dim OL_ItemTask As Outlook.TaskItem
Dim FirstDate As Date
Dim SecondDate As Date

Set OL_NameSpace = OL_App.GetNamespace("MAPI")
Set OL_FolderTask = OL_NameSpace.GetDefaultFolder(olFolderTasks)

For Each OL_ItemTask In OL_FolderTask.Items

With OL_ItemTask

If .Complete And .StartDate = FirstDate And .DueDate = SecondDate Then
' .......................
'......................
End If

End With

Next
Автор: utwer
Дата сообщения: 23.03.2012 14:16
Подскажите пжлс, есть такая задача, добавить в екселевский файл N-ое кол-во фотографий, через вставка-из файла, необходимо, чтобы эти фото размещались автоматически по 6штук на каждой странице в одной книге, т.е. если выбрано 12 фото, нужно чтобы они автоматом разместились на 2-х страницах и под каждым фото оставалось место для подписи, а также на самой первой странице место под "шапку", а на последней странице с фотографиями ФИО. Как такое можно организовать ?

Добавлено:

Цитата:
andrewkard1980 Бесполезно, тоже долго голову ломал над этим - оставил просто пароль, который снимается доп. программой за секунду.
т.е. если эту програмку с файлом перенести на другой ПК, то он и там откроется ?

Добавлено:

Цитата:
Можно еще сделать проверку на какой нибудь файл. Файла нет-книга закрылась.
можно подробнее ?


Добавлено:

Цитата:
http://forum.ru-board.com/topic.cgi?forum=33&topic=10903&start=20#5
Вот еще поищи "Автор: andrewkard1980, Отправлено:16:08 26-05-2011"
"Автор: KorolCOOL, Отправлено:12:08 26-07-2011"
Гугл в помощь по "VBA Защита кода"
почитаю
Автор: andrewkard1980
Дата сообщения: 23.03.2012 17:00

Цитата:
т.е. если эту програмку с файлом перенести на другой ПК, то он и там откроется ?

да откроется и даже будет работать с включенными макросами, просто защиту Вы прописываете в код, который можно легко просмотреть, понять и выключить.

Добавлено:
Коллеги, голова дымит уже, есть 2 строки:

sStr1="Виноградарь, Правды просп., 76, 5/16-эт. дома, 68/46/8 кв.м, капремонт, х/р, с/у разд., 2 лодж. застекл., консьерж, домофон, 105000у.е., торг. Тел: (96) 7069771, моб. "

sStr2="Виноградарь, Правды просп., 9/9-эт. дома, 61/40/7.5 кв.м, требует ремонта, с/у совм., двойной балкон не застеклен, 83000у.е., торг. Тел: (44) 2293757, (67) 4471827, моб."

Шаблон:

Код:
pRg.Global = True: pRg.Pattern = "[А-Яа-я-є-і-ї]{1,} (просп|шоссе|бульв|дорога|пл\.|бул\.|вул|ул|наб)"
Set pMs = pRg.Execute(sStr)
If pMs.Count > 0 Then sStr = pMs.Item(0) Else sStr = " "
Автор: utwer
Дата сообщения: 23.03.2012 23:00

Цитата:
Подскажите пжлс, есть такая задача, добавить в екселевский файл N-ое кол-во фотографий, через вставка-из файла, необходимо, чтобы эти фото размещались автоматически по 6штук на каждой странице в одной книге, т.е. если выбрано 12 фото, нужно чтобы они автоматом разместились на 2-х страницах и под каждым фото оставалось место для подписи, а также на самой первой странице место под "шапку", а на последней странице с фотографиями ФИО. Как такое можно организовать ?
кто-то может подсказать пути решения ?
Автор: grbdv
Дата сообщения: 24.03.2012 07:02
utwer, угомонись и не поднимай тему - читай Правила. 5 часов прошло. Захочет кто - ответит.

Киса, скажите мне, как художник художнику - вы рисовать умеете?

Читай шапку. Ты сам-то хоть палец о палец ударил? Пиши - что не получается, а не голые хотелки. Макрос запиши, проанализируй код. А если вообще ничего не получается - начни с "Hello, world!", а не с проектов один масштабнее другого, с которыми ты возник.
Автор: utwer
Дата сообщения: 24.03.2012 08:54
grbdv извиняюсь
Автор: grbdv
Дата сообщения: 24.03.2012 09:18
utwer, да лично я тут ни при чем. Тысячи людей подписаны на эту (в частности) тему.
Автор: ddrii2007
Дата сообщения: 24.03.2012 10:07
Excel в CSV

В Excel имеем две ячейки с датами
01.01.1900 01.01.2000
При ручной выгрузке в CSV (разделитель - запятые)
получаем формат в соответствии с региональными параметрами
01.01.1900;01.01.2000

При записи и выполнении макроса

Sub CSV()
Application.DisplayAlerts = False
ActiveWorkbook.SaveAs Filename:="C:\tmp\today.csv", _
FileFormat:=xlCSV, CreateBackup:=False, Local:=True
ActiveWorkbook.Save
ActiveWindow.Close
Application.DisplayAlerts = True

End Sub

1/1/1900,1/1/2000

Нужно, чтобы при выполнении макроса, в CSV получался формат, как при ручной выгрузке
разделитель ;
краткая дата dd.MM.yyyy.
Подскажите, что не так или пошлите куда надо...

Региональные параметры по умолчанию - Россия,
разделитель списков ;
краткая дата dd.MM.yyyy.
[HKEY_CURRENT_USER\Control Panel\International]
"Locale"="00000419"




Автор: grbdv
Дата сообщения: 24.03.2012 10:38
ddrii2007
Я бы не связывался с экселевским понимаем того, кому и в каком виде надо видеть дату :) Форматировал бы строку по своим нуждам и в таком виде выгонял в csv. Это чтобы заработало.

Добавлено:
... с экселевским и виндовым
Автор: ddrii2007
Дата сообщения: 24.03.2012 11:17
grbdv
Программными способами решение найти можно, но...
хотелось бы получить ответ, почему в макросе
ActiveWorkbook.SaveAs не работает параметр Local:=True
как это происходит при ручной выгрузке
Автор: panda3
Дата сообщения: 26.03.2012 11:19
ddrii2007
Не работает, потому что это глюк в Excel. Не лечится. Только писать выгрузку руками. Вот если хочешь, глянь пример программы по универсальной настраиваемой выгрузке в текстовый файл.
http://web.archive.org/web/20100515203138/http://www.smokeylake.com/excel/text_write_program.htm
Автор: AndVGri
Дата сообщения: 26.03.2012 14:32
ddrii2007
ddrii2007

Цитата:
ActiveWorkbook.Save

Вот это уберите и посмотрите
Автор: grbdv
Дата сообщения: 27.03.2012 17:05
На листе с данными. Как так? Выходки мелкософта или опять сам дурак?

Код:
? Range("A1", "C3").Address
$A$1:$C$3
? Range("A1", "C3").SpecialCells(xlCellTypeLastCell).Address
$P$1180
Автор: ddrii2007
Дата сообщения: 27.03.2012 19:14
AndVGri

Спасибо большое.


Цитата:
ActiveWorkbook.Save

Вот это уберите и посмотрите


Отлично работает, все получилось как надо.

Excel в CSV вопрос закрыт.


Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127

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


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