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

» Excel VBA (часть 3)

Автор: Mishel917
Дата сообщения: 11.08.2012 15:35
[more] Maximus777

Код:

With ListView1.SelectedItem
If ListView1.HideColumnHeaders = True Then
Caza(1) = .Top - .Height
Daza(1) = .Top
Else
Caza(1) = .Top
Daza(1) = .Top + .Height
End If
End With

есть эквивалентом ListView1.ColumnHeaders.Top в его отсутствии. Если заголовка нет, то получаем значение ColumnHeaders.Top, если заголовок есть то получаем значение ListView1.SelectedItem.Top (Top первой опции).

Лучше толькл класс, который продлит список

ListView1.ColumnHeaders
. Add
. Clear
. Count
. Item
. Remove

до
. Top
. Height

после чего код станет меньше и объектно-ориентированнее.

С PNG графикой в окнах сообщений не работал, технологии не знаю.

[/more]
Автор: Maximus777
Дата сообщения: 11.08.2012 18:29
Mishel917
Не думаю, что кому-то, кроме Вас, этот класс нужен. Поэтому, только если Вы допишите ...

А с PNG графикой в VBA напряг. Поэтому и приходится рисовать её имитацию в формате BMP.
Автор: Kri26
Дата сообщения: 13.08.2012 10:21
Добрый день. Задача: Необходимо, чтобы при изменении ячейки Excel в другую ячейку вставлялась текущая дата. Подскажите как будет выглядеть код. Спасибо.
Автор: AndVGri
Дата сообщения: 13.08.2012 10:27
Kri26
Фраза в поисковике
Необходимо, чтобы при изменении ячейки Excel в другую ячейку вставлялась текущая дата
Выводит, например
http://www.planetaexcel.ru/tip.php?aid=28 - попробуйте следующий раз, уверяю - это не сложно
Автор: psiho
Дата сообщения: 13.08.2012 11:27

Цитата:
http://www.planetaexcel.ru/tip.php?aid=28

Кстати, заметили, что там не правильно согласно русского языка указано "добавление текущей даты"? На самом деле вставляется текущая дата и время. Если нужно вставить именно дату, то нужно заменить строку ".Value=Now" на ".Value=Date"
Автор: Kri26
Дата сообщения: 13.08.2012 12:19
Огромное спасибо
Автор: grbdv
Дата сообщения: 13.08.2012 12:50
Kri26
Надо еще иметь ввиду, что изменения, произведенные кодом не откатываются. Так можно потерять дату, изначально занесенную при первом вводе.
Автор: psiho
Дата сообщения: 13.08.2012 14:01
Mishel917,
лови пример как считать кординату прокрутки линейки в ListView. Работает при выборе Item:
http://rghost.ru/39756484
Автор: Mishel917
Дата сообщения: 13.08.2012 17:13
psiho

Большое спасибо! Проведу тестирование в своём макросе.

Координата Scrollbar необходима для согласования координаты опции ListView с координатой курсора мыши Y, на случай перемещения Scrollbar. Способ такого согласования также есть и в VBA – используя GetFirstVisible - верхний видимый элемент ListView .

If ListView1.ListItems(intM + ListView1.GetFirstVisible.Index - 1).SubItems(1) = Data(intM, 2) Then


Добавлено:
Всем доброго времени суток!

В режиме просмотра ListView - lvwReport можно программно задать цвет шрифта для одного ListItems, например:

ListView1.ListItems(3).ForeColor = vbRed

Вопрос, - как программно задать цвет шрифта для целой строки, т. е. для всей опции ListView?

Так не срабатывает:

ListView1.ListItems(3).SubItems(1).ForeColor = vbRed
ListView1.ListItems(3).SubItems(2).ForeColor = vbRed
ListView1.ListItems(3).SubItems(3).ForeColor = vbRed
Автор: psiho
Дата сообщения: 14.08.2012 07:34

Цитата:
Вопрос, - как программно задать цвет шрифта для целой строки, т. е. для всей опции ListView?

Срабатывает для твоего примера,например для 1й строки, вот так:


Код:
ListView1.ListItems(1).ForeColor = vbRed
ListView1.ListItems(1).ListSubItems(1).ForeColor = vbRed
Автор: Mishel917
Дата сообщения: 14.08.2012 10:55
psiho

Ещё раз большое спасибо!
Код создаёт заметно лучший интерфейс.
Автор: komputeryuzer
Дата сообщения: 14.08.2012 16:56
нарот надо событие изменеия одной ячейки (нажали на интер)

нашол вот такой скрипт но он срабатывает при указании на ячейку курсором мыши..

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect(Target, Target.Worksheet.Range("H5")) Is Nothing Then ....
End Sub

как заставить реагировать только нажатие интера?
Автор: grbdv
Дата сообщения: 14.08.2012 17:06
komputeryuzer
Надо использовать событие Worksheet_Change

Код: Private Sub Worksheet_Change(ByVal Target As Range)
'[...]
End Sub
Автор: komputeryuzer
Дата сообщения: 14.08.2012 18:14
grbdvnu спасибо.. как раз то что надо!!! именно при ручном изменении!!! благодарю!
Автор: highlander9
Дата сообщения: 15.08.2012 14:48
Всем доброго дня!
MS Office 2003
Подскажите как написать макрос для печати на принтер HP LaserJet P3005 PCL 6 из MS Excel
по аналогии с макросом для MS Word (этот код успешно работает):

Код: Dim sMyPrinter As String
Dim netPrinter As String
sMyPrinter = Application.ActivePrinter
netPrinter = "HP LaserJet P3005 PCL 6"
Application.ActivePrinter = netPrinter
ActiveDocument.PrintOut
Application.ActivePrinter = sMyPrinter
Автор: grbdv
Дата сообщения: 15.08.2012 15:02
highlander9
Вместо ActiveDocument.PrintOut используй ActiveSheet.PrintOut
ActiveDocument - это вордовский объект.
Автор: Maximus777
Дата сообщения: 15.08.2012 15:07
highlander9

При таких рефах:


Вот этот код работает:

Код: Dim sMyPrinter As String
Dim netPrinter As String
sMyPrinter = Application.ActivePrinter
netPrinter = "HP LaserJet P3005 PCL 6"
Application.ActivePrinter = netPrinter
ThisWorkbook.PrintOut
Application.ActivePrinter = sMyPrinter
Автор: highlander9
Дата сообщения: 15.08.2012 15:14
grbdv
Заменил

Код: Dim sMyPrinter As String
Dim netPrinter As String
sMyPrinter = Application.ActivePrinter
netPrinter = "HP LaserJet P3005 PCL 6"
Application.ActivePrinter = netPrinter
ActiveSheet.PrintOut
Application.ActivePrinter = sMyPrinter
Автор: grbdv
Дата сообщения: 15.08.2012 15:36
Maximus777
Цитата:
При таких рефах:

Ну, это же стандартный набор, по дефолту.

highlander9
PrintOut в данном случае - Екселевский метод. Работает со следующими объектами:



Добавлено:
highlander9
Цитата:
Ошибка та же осталась...

На какой строке? На первом вхождении?
sMyPrinter = Application.ActivePrinter

Закомментируй все строки и оставь только первое вхождение.
Sub sb_Print()
Dim sMyPrinter As String
Dim netPrinter As String
sMyPrinter = Application.ActivePrinter
' netPrinter = "HP LaserJet P3005 PCL 6"
' Application.ActivePrinter = netPrinter
' ActiveSheet.PrintOut
' Application.ActivePrinter = sMyPrinter
End Sub


Добавлено:
Убедись в правильности написания имени второго принтера:
netPrinter = "HP LaserJet P3005 PCL 6"
Автор: highlander9
Дата сообщения: 15.08.2012 15:43
Принтер указан правильно.
Потому-что код написанный для word работает корректно.
Все делаю на одном компе в том же самом офисе 2003

Ошибка начинается со строки:

Код: Application.ActivePrinter = netPrinter
Автор: psiho
Дата сообщения: 15.08.2012 15:49
highlander9,
grbdv
Проблема не в этом, а в том, что название сетевого принтера указано неверно.
Чтобы узнать правильное имя, необходимо:
1. Вручную в самой Windows изменить принтер, на который выводится печать по умолчанию, на Ваш сетевой
2. Запустить вышеназванный код
3. В момент появления окна с ошибкой нажать на "Debug"
4. После появления редактора VisualBasic навести курсор в строке "sMyPrinter = Application.ActivePrinter" на слово "sMyPrinter"
5. Покажется название этого принтера.Заменить его в строке "netPrinter = "..."
6. Поменять принтер по умолчанию на предыдущий. Теперь всё заработает.


Например, у нас в фирме сетевой принтер указывается так: "\\server\hp LJ 4345 mfp PCL 6 (Ne04)", хотя в windows в папке "принтеры и факсы" называется "hp LJ 4345 mfp PCL 6"
Автор: grbdv
Дата сообщения: 15.08.2012 15:51
highlander9
Значит - неправильно :(
Перейди на лист. Вручную через диалог выбора принтера распечатай его. Принтер подставь именно этот "HP LaserJet P3005 PCL 6".

Потом перейди в дебаггер. В окне Immediate введи
? ActivePrinter
Ответ скопируй в код между кавычками.
Автор: highlander9
Дата сообщения: 15.08.2012 15:51
psiho
Респект!!!

В моем случае принтер:

Код: netPrinter = "HP LaserJet P3005 PCL 6 (Ne05"
Автор: grbdv
Дата сообщения: 15.08.2012 16:00
psiho
Цитата:
grbdv
Проблема не в этом, а в том, что название сетевого принтера указано неверно.

Вот спасибо :) Я двумя постами выше об этом сказал :)

Цитата:
Добавлено:
Убедись в правильности написания имени второго принтера:

Автор: highlander9
Дата сообщения: 15.08.2012 16:02
grbdv
Спасибо за уделенное время!!!

Автор: grbdv
Дата сообщения: 15.08.2012 16:09
highlander9
Не за что.
Просто имей ввиду на будущее, что все эти плоско-апраллельные переносы внутри VBA надо делать с оглядкой. Иногда и методы, и свойства, и объекты называются одинаково (как PrintOut), а принадлежат разным библиотекам, да и работать могут совершенно по-разному.
Автор: psiho
Дата сообщения: 15.08.2012 16:22

Цитата:
Вот спасибо Я двумя постами выше об этом сказал

Пока набирал ответ, ты уже ответил. Поэтому не видел твоего ответа
Автор: grbdv
Дата сообщения: 15.08.2012 16:48
psiho, да я не в претензии ведь :) Просто иногда комично выглядит :)
Автор: JekG
Дата сообщения: 15.08.2012 17:52
Подскажите пожалуйста
Если локально из файла отчета запустить макрос

Dim lngI As Long
lngI = Cells(Rows.Count, 5).End(xlUp).Row
Range("F5").FormulaR1C1 ="бла бла"
Range("F5").AutoFill Destination:=Range("F5:F" & lngI), Type:=xlFillDefault

все работает как нужно, а если прописать его в личную книгу макросов и запускать его оттуда начинает вместо выполнения формулы копировать результат из ячейки F5
C чем это может быть связано?
Автор: grbdv
Дата сообщения: 15.08.2012 19:13
JekG
Цитата:
все работает как нужно

А как нужно-то? Какое "выполнение" и какой формулы должно произойти?

"бла бла" - не формула, а строка... вот она и растягивается :)
Тем более, что тип растягивания установлен как xlFillDefault .

А если хочешь запускать его откуда угодно, то надо явно указывать Sheet, которому принадлежат все эти Cells и Range. А то по умолчанию все это применится к ActiveSheet в ActiveWorkbook.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127

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


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