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

» Excel VBA

Автор: Yuk
Дата сообщения: 22.11.2006 18:06
Ilyansk
Попробуй
Open fname For Binary Access Write As #1

The okk

Цитата:
Что за Value2 у объекта Target?

Target - это объект типа Range для обработки событий.
Value2 отличается от Value только тем, что не использует типы данные Date и Currency. Вместо этого возвращается Double.

Автор: Troitsky
Дата сообщения: 22.11.2006 19:03
PavelO

Цитата:
спасибо за ссылку, только вот что-то не работает этот код
Ну так напильником нужно было доработать!

Цитата:
я имел ввиду менять положение ScrollTop колесом мышки
С такой штукой никогда не работал, поэтому опять мог понять неправильно. Доработал код из того примера, что давал тебе и вот что получилось.

Код модуля:
Код: Option Explicit

Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Public hW As Long ' Хендл пользовательской формы

Private Declare Function CallWindowProcA Lib "user32" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal MSG As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function SetWindowLongA Lib "user32" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function SetWindowTextA Lib "user32" (ByVal hwnd As Long, ByVal lpString As String) As Long
Private Const GWL_WNDPROC = -4
Private Const WM_MOUSEWHEEL = &H20A
Private lpPrevWndProc As Long, Wheel As Integer


Sub Hook(hwnd As Long)
lpPrevWndProc = SetWindowLongA(hwnd, GWL_WNDPROC, AddressOf WindowProc)
End Sub

Sub UnHook(hwnd As Long)
SetWindowLongA hwnd, GWL_WNDPROC, lpPrevWndProc
End Sub

Function WindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
On Error GoTo xErr
If uMsg = WM_MOUSEWHEEL Then
If wParam = -7864320 Or wParam = -23592960 Or wParam = -15728640 Then
myForm.Scroll , fmScrollActionLineDown ' скролим вниз
ElseIf wParam = 7864320 Or wParam = 23592960 Or wParam = 15728640 Then
myForm.Scroll , fmScrollActionLineUp ' скролим вверх
End If
Else
WindowProc = CallWindowProcA(lpPrevWndProc, hwnd, uMsg, wParam, lParam)
End If
xErr:
End Function
Автор: Yuk
Дата сообщения: 22.11.2006 23:08
Макрос для mrnovel:
http://forum.ru-board.com/topic.cgi?forum=5&topic=19106&start=1040#13

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

[more=тут]
Код: Sub CombineBooks()

Dim wb(2) As Workbook
Dim fd As FileDialog
Dim i As Integer
Dim c As Range

'Read 2 files in 1 or 2 steps
i = 0
While i < 2
Set fd = Application.FileDialog(msoFileDialogOpen)
With fd
.AllowMultiSelect = True
If .Show = -1 Then
i = i + 1
Set wb(i) = Workbooks.Open(.SelectedItems(1))
If i < 2 And .SelectedItems.Count > 1 Then
i = i + 1
Set wb(i) = Workbooks.Open(.SelectedItems(2))
End If
End If
End With
Set fd = Nothing
Wend

'Copy first sheet to the new workbook
wb(1).Sheets(1).Copy
'Sum with the second book
For Each c In ActiveSheet.UsedRange.Cells
If c.Interior.ColorIndex = 35 Then 'if green
c.Value = c.Value + wb(2).Sheets(1).Range(c.Address)
End If
Next

'Close input books
wb(1).Close SaveChanges:=False
wb(2).Close SaveChanges:=False
End Sub
Автор: The okk
Дата сообщения: 23.11.2006 06:13
Yuk

Цитата:
Value2 отличается от Value только тем, что не использует типы данные Date и Currency. Вместо этого возвращается Double.

Правильно ли я понял, что в Value2 всегда хранится значение Value, приведенное к типу Double?
Это свойство имеет какое-то практическое применение или нужно только для совместимости?

Добавлено:
Можно ли как-нибудь сделать, чтобы значок автофильтра был не в верхнем правом, а в нижнем правом углу?

Добавлено:
А, сорри, туплю. - Нашел.
Автор: Yuk
Дата сообщения: 23.11.2006 07:32
The okk

Цитата:
Правильно ли я понял, что в Value2 всегда хранится значение Value, приведенное к типу Double?

Не совсем. Во-первых, не хранится. Value2, как и Value и др. является свойством объекта, то есть возвращает его значение. Во-вторых, к типу Double приводятся только Date и Currency.
Равнозначно CDbl(объект.Value). Насчет практического значения, не знаю, я практически не использую, в основном из-за того, что редко работаю с датами, а тем более с деньгами.


Добавлено:
Народ, с SOAP (веб-сервисы) в VBA никто не пробовал работать? Кое-что получается, но один сайт совсем не хочет отзываться, хотя через Pyton без проблем. Может, я что-то недоконфигурировал. Есть специалисты?

Автор: mrnovel
Дата сообщения: 23.11.2006 07:56
Yuk
Спасибо громадное!

Я решил вопрос "более по-другому"


Цитата:

Sub сложение()
'
' сложение Макрос
' Макрос записан (brp)
'

'
ChDir "C:\soft\dds"
Workbooks.Open Filename:="1.xls"
Range("I22:L393").Select
Range("L393").Activate
Selection.Copy
Workbooks.Open Filename:="2.xls"
Range("I22").Select
Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlAdd, SkipBlanks:= _
True, Transpose:=False
Application.CutCopyMode = False
ActiveWorkbook.SaveAs Filename:="result.xls", FileFormat:= _
xlNormal, Password:="", WriteResPassword:="", ReadOnlyRecommended:=False _
, CreateBackup:=False
End Sub



Сегодня хочу совместить приятное с полезным: диалоги открытия файлов (пользователям это всё таки понятнее...) с суммированием только определенного диапазона на листах.

Ещё раз: большущее тебе спасибо что натолкнул на правильную мысль!
Автор: The okk
Дата сообщения: 23.11.2006 08:27
Как определяется UsedRange?

Добавлено:
И как сделать, чтобы гиперссылки не были синими и подчеркнутыми? И, по-возможности, еще и ни на что не ссылались .
Автор: Yuk
Дата сообщения: 23.11.2006 08:48
The okk

Цитата:
Как определяется UsedRange?

Последняя ячейка как по Ctrl-End.


Цитата:
И как сделать, чтобы гиперссылки не были синими и подчеркнутыми?

Обычным форматом - убрать подчеркивание и цвет.

Цитата:
И, по-возможности, еще и ни на что не ссылались

Удалить гиперссылку.
Автор: The okk
Дата сообщения: 23.11.2006 08:57
Yuk

Цитата:
Последняя ячейка как по Ctrl-End.

Я имею в виду, что туда входит? А то ячейки все пустые, а в UserRange все равно вошли почему-то.


Цитата:
Обычным форматом - убрать подчеркивание и цвет.

ok. С этим ясно.


Цитата:
Удалить гиперссылку.


А если серьезно? - Мне просто нужно сделать всплывающую подсказку. А стандартными средствами она никак не делается.

Добавлено:
хм... а ведь где-то эта функция должна быть, раз она в винде есть?
Автор: kramrus
Дата сообщения: 23.11.2006 11:24
Всем добрый День?
Возможно ли написать макрос:
Если ячейки СА11=0 и ВА11=0 строку 11 скрыть (нужно что бы она на печаталась на принтере). Заранее Всем СПАСИБО!
Автор: The okk
Дата сообщения: 23.11.2006 11:39
kramrus

Код: if Range("CA11") = 0 and Range("BA11")=0 then
Rows(11).Hidden = true
end if
Автор: kramrus
Дата сообщения: 23.11.2006 12:10
The okk
Спасибо ГРОМАДНОЕ.
А вобще где нибудь, можно найти доку по макросам и VBA на русском языке?
Автор: The okk
Дата сообщения: 23.11.2006 12:29
kramrus
Книжку купи . Уокенбаха желательно. А если надо решать простейшие задачки типа последней, то просто справочник по VBA6.3... хотя Уокенбах все равно не помешает
Автор: Anton T
Дата сообщения: 23.11.2006 12:54
Народ помоги пожалуйста в Аксессе.
http://forum.ru-board.com/topic.cgi?forum=33&topic=3121&start=40#2
Автор: kramrus
Дата сообщения: 23.11.2006 12:58
The okk
Сенкью!
Автор: The okk
Дата сообщения: 23.11.2006 14:22
Как запретить пользователю редактировать защищенные ячейки, НО разрешить менять их скриптом.

Добавлено:
Так, с этим вроде тоже разобрался. UserInterface = True.

И все таки - что же входит в UsedRange кроме заполненных ячеек?
Автор: SERGE_BLIZNUK
Дата сообщения: 23.11.2006 16:58
kramrus

Цитата:
вобще где нибудь, можно найти доку по макросам и VBA на русском языке

Литературы в инете ПОЛНО!! в том числе и на русском. и книжек полно.
поищи, например, на Natahaus - Лучшие книги Интернета
там был Уокенбах, Джон Подробное руководство по созданию формул в Excel 2002.
(правда, 34 Мб!) [more=ссылки на скачку]
скачать можно по ссылкам (это зеркала)
http://www.mytempdir.com/1025944
http://natahaus.ifolder.ru/346506
http://www.sendspace.com/file/0pcpno
http://www.filefactory.com/file/714d3f/
[/more]
там же - Каталог ссылок на книжки по теме MS Excel
и ещё на рубоарде есть топик Учебники по MS Office 2003 на русском.. разные! много!
Автор: Yuk
Дата сообщения: 23.11.2006 19:21
The okk

Цитата:
что же входит в UsedRange кроме заполненных ячеек?

Все от Ctrl-Home до Ctrl-End.

Добавлено:
Можешь проверить макросом:
Debug.Print Activesheet.UsedRange.Address


Добавлено:

Цитата:
нужно сделать всплывающую подсказку

А коменты чем не устраивают?
Автор: The okk
Дата сообщения: 23.11.2006 19:58
Yuk

Цитата:
Все от Ctrl-Home до Ctrl-End.

Объясняю ситуацию - заполнено 10 строк. UsedRange.Rows.Count = 80. Не могу понять, почему. Ведь остальные строки чистые.


Цитата:
А коменты чем не устраивают?

меня просто удивило отсуствие очевидной опции в Excel. - Выдавать всплывающую подску для ячеек. Ведь может быть и такое, что содержимое ячейки не помещается на экране полностью. В этом случае помогает всплывающая подсказка, к которой мы все так привыкли. А коменты/заметки/примечания - это ОЧЕНЬ слабая и малопривлекательная замена.
Автор: Ilyansk
Дата сообщения: 24.11.2006 11:35

Цитата:
Объясняю ситуацию - заполнено 10 строк. UsedRange.Rows.Count = 80. Не могу понять, почему. Ведь остальные строки чистые.


Есть метод (ActiveCell.SpecialCells(xlLastCell).Select), устанавливающий при открытии книги последнюю ячейку и если пользователь в течение сеанса просто пробежал по пустым ячейкам вниз, то последняя ячейка получает строку, до куда добежали вне зависимости пусто там или нет. была у меня такая фигня. для обхода писал функцию отыскания последней строки, где в цикле бежал вниз по колонке, пока не натыкался на пустую ячейку. некрасиво, медленно, но перелопачивать инет иногда гораздо дольше, ну и если строк немного, работает почти мгновенно. Передаешь ей объект лист и номер колонки по которой будет искаться последняя ячейка

Код:
public funtion lrc(ws as worksheet, c as integer)
lrc = 1
Do While ws.Cells(lrc, c) <> ""
lrc = lrc + 1
Loop
end function
Автор: The okk
Дата сообщения: 24.11.2006 12:02
Ilyansk
Спасибо! Вот об этом я и спрашивал.
Только, если пустые ячейки все равно включаются в UsedRange, тогда условие
Cells(lrc, c) <> "" помогать не должно.

Добавлено:
Понял, в чем было дело - была просто спрятанная строка и Excel ее посчитал. Всем спасибо
Автор: kramrus
Дата сообщения: 24.11.2006 13:26
Всем добрый День.
Если в макросе написать Range("C11").Clear то все содержимое ячекй удалится.
А как написать чтобы удалить в ячейке формулы и значения, а формат ячейки и условное форматирование оставить.
Заранее спасибо.
Автор: The okk
Дата сообщения: 24.11.2006 13:57
kramrus

Код:
Range("C11").clearcontents
Автор: kramrus
Дата сообщения: 24.11.2006 15:18
SERGE_BLIZNUK

Цитата:
Уокенбах, Джон Подробное руководство по созданию формул в Excel 2002.

Спасибо, но скачать не могу, может еще где то есть?
Автор: alin
Дата сообщения: 24.11.2006 15:22
Имеется код:

Private Sub OK_Click()
Dim strDate As String
strDate = Format(Now(), "dd.mm")
ActiveSheet.Copy Before:=Sheets(1)
Sheets(1).Select
Sheets(1).Name = strDate
Unload Me
End Sub

1)Как сделать, что бы не выдавалась ошибка, если лист с именем текущей даты уже существует?
2)Как сделать, чтобы при открытии книги активным был именно этот лист?
Заранее благодарен!
Автор: The okk
Дата сообщения: 24.11.2006 16:36

Код: Private Sub OK_Click()
Dim strDate As String
strDate = Format(Now(), "dd.mm")
ActiveSheet.Copy Before:=Sheets(1)
On Error Resume Next 'забить на ошибки и идти дальше
Sheets(1).Name = strDate
On Error Goto 0 'перестать забивать на ошибки
Unload Me
Sheets(1).Activate 'активация листа
End Sub
Автор: alin
Дата сообщения: 24.11.2006 16:47
The okk
Нормальный ход, только создается лист с таким же именем (2).
Нужно, чтоб операция не продолжалась…
Еще лучше если выскочит сообщение: «лист с таким именем уже есть»
Автор: Troitsky
Дата сообщения: 24.11.2006 16:53
alin

Цитата:
1)Как сделать, что бы не выдавалась ошибка, если лист с именем текущей даты уже существует?

Поскольку лист с именем текущей даты вставляется у тебя первым листом
Цитата:
ActiveSheet.Copy Before:=Sheets(1)
то можно делать простую проверку:
Код: If Sheets(1).Name <> strDate Then
ActiveSheet.Copy Before:=Sheets(1)
Sheets(1).Select
Sheets(1).Name = strDate
End If
Автор: alin
Дата сообщения: 24.11.2006 17:23
Troitsky
Огромное спасибо ВСЕ работает!
PS: Если листу присваивается имя текущего дня (напр.: 24.11), возможно ли указать при открытии книги, что именно лист текущего дня должен быть активным?
Автор: Troitsky
Дата сообщения: 24.11.2006 17:36
alin

Цитата:
Если листу присваивается имя текущего дня (напр.: 24.11), возможно ли указать при открытии книги, что именно лист текущего дня должен быть активным?

В смысле?
Код: Sheets(Format(Now(), "dd.mm")).Activate

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

Предыдущая тема: Стоит ли переходить с Билдера на Делфи?


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