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

» Excel VBA

Автор: Yuk
Дата сообщения: 26.01.2007 20:17
Pantera3587

Цитата:
обозначить в коде выделенный диапазон

Selection возвращает выделенный диапазон. Например
Код: MsgBox Selection.Address
Автор: SERGE_BLIZNUK
Дата сообщения: 26.01.2007 21:13
Pantera3587
Цитата:
Написала такой код, в котором набирая дату можно определить квартал. Код такой:
Sub Вычисление_квартал()
ну позвольте мне опять вам ответить и предложить такой код:
Код:
Sub Вычисление_квартал()
Dim Дата As Date
Дата = InputBox("Введите дату: ")
'MsgBox "Соответствует " & Квартал (Дата)
Kvartal = Int((Month(Дата) - 1) / 3) + 1
ActiveCell = Kvartal & " квартал"
ActiveCell.Offset(0, 1) = Дата
End Sub
Автор: alin
Дата сообщения: 27.01.2007 09:33
Troitsky
Огромное спасибо за новый скрипт, который вы предложили! Для экономии места на форуме я удалил из своего макроса некоторую часть кода, теперь, когда этот код переведен не vbs я затрудняюсь добавить вырезанную часть в ваш скрипт, помогите, пожалуйста, его подправить. [more=Здесь]
Код: Private Sub OK_Click()' - создание нового листа
Dim strDate As String
strDate = Format(Now(), "dd.mm")
If Sheets(1).Name <> strDate Then
ActiveSheet.Copy Before:=Sheets(1)
Sheets(1).Select
Sheets(1).Name = strDate
End If
Sheets(1).Select
Sheets(1).Name = strDate
Range("E3:E25", "E27:E31").Value = Range("AD3:AD25", "AD27:AD31").Value ' - перенос данных с 24:00 на 0:00
Range("F3:AD25", "F27:AD31").ClearContents ' - очистка области
Unload Me
For Each s In Worksheets(1).Shapes ' - отжимает кнопки на новом листе
If s.Type = msoOLEControlObject Then
If InStr(s.OLEFormat.progID, "ToggleButton") > 0 Then
s.OLEFormat.Object.Object.Value = False
End If
End If
Next
End Sub
Автор: TONADOOM
Дата сообщения: 27.01.2007 17:07
Столкнулся с проблеммой , а решить её не получается ...
ячейка I4 (а может любая другая) имеет гиперссылку на страницу в интернете .
необходимо открыть эту ссылку в новом окне , причем чтоб в этом окне не было менюшек , кнопочек , адресной строки и в заголовке окна была нужная мне информация ...
я сделал это так :

Код: Range("I4").Hyperlinks(1).Follow NewWindow:=True, AddHistory:=True
Автор: Troitsky
Дата сообщения: 28.01.2007 20:39
alin
Как получаются данные диапазоны для каждого макроса:

Цитата:
Range("H3:H18", "H22:H25")
Range("H27:H31")
Range("H3")
...

Range("J3:J18", "J22:J25")
Range("J27:J31")
Range("J3")
?
Каждые два часа происходит сдвиг на два столбца? Т.е. для макроса MyMacro2 это столбец H, MyMacro4 - J, MyMacro6 - L, MyMacro8 - N, и т.д?
Это я к тому, чтобы не громоздить кучу однотипного кода.
Автор: alin
Дата сообщения: 28.01.2007 23:46
Troitsky

Цитата:
Каждые два часа происходит сдвиг на два столбца?

Совершенно верно.
Автор: Troitsky
Дата сообщения: 29.01.2007 10:26
alin
Кажется, так:
Код: strDate = Day(Now()) & "." & Month(Now())
intHour = Hour(Now()) + 1

Set objExcel = CreateObject("Excel.Application")

objExcel.Workbooks.Open "test.xls"
With objExcel.ActiveWorkbook
    If .Sheets(1).Name <> strDate Then ' создаем лист если его не существует
        .ActiveSheet.Copy .Sheets(1)
        .Sheets(1).Name = strDate
        ' перенос данных с 24:00 на 0:00
        .Sheets(1).Range("E3:E25").Value = .Sheets(1).Range("AD3:AD25").Value
        .Sheets(1).Range("E27:E31").Value = .Sheets(1).Range("AD27:AD31").Value
        ' очистка области
        .Sheets(1).Range("F3:AD25", "F27:AD31").ClearContents
    End If
    
    With objExcel.ActiveWorkbook.Sheets(1)
        ' в зависимости от часа заполняем нужные области
        .Range(.Cells(3, 6 + intHour), .Cells(18, 6 + intHour)).Value _
            = .Range("AE3:AE18").Value
        .Range(.Cells(22, 6 + intHour), .Cells(25, 6 + intHour)).Value _
            = .Range("AE22:AE25").Value
        .Range(.Cells(27, 6 + intHour), .Cells(31, 6 + intHour)).Value _
            = .Range("AE27:AE31").Value
    End With
    
    .Close True
End With

Set objExcel = Nothing
Автор: mironmtx
Дата сообщения: 29.01.2007 11:18
Доброго времени суток всем! Есть вопрос! Я с программированием не дружу! но поставили такую задачу! есть экселевский документ! Типа записной книжки! но генеральному для поиска впадлу нажимать Ctrl+F и вот надо чтоб в начале этого документа отображалась строка поиска по этому документу! подскажите плиз как это можно сделать! Заранее благодарен!
Автор: alin
Дата сообщения: 29.01.2007 14:55
Troitsky
Огромное спасибо! Работа, которая вами проделана, просто супер!
Сейчас тестил код дома (на работе буду 31.01), организовав ссылки на другую книгу (*.xls) - все работает! На работе ссылки берутся из другой программы, написанной на Delphi, думаю, все будет ОК! Обратил внимание: если запускать код каждый новый час, то данные копируются в следующий столбец (может быть это идея - получать данные каждый час).
Так же хочу отблагодаритьYuk и The okk за участие!
Низкий поклон вам всем и удачи во всем!

Автор: The okk
Дата сообщения: 29.01.2007 15:02
mironmtx
Вид-Панели Инструментов.
На вкладке Команды слева выбираешь Правка.
Справа находишь Бинокль (найти).
Перетаскиваешь бинокль на любую панель инструментов.
Достаточно кликнуть по биноклю.
Проще только собственную панель со строкой создать.
Автор: mironmtx
Дата сообщения: 29.01.2007 15:06
The okk
это то понятно! в том то и дело что нужна непосредственно форма поиска! а вынос кнопки поиска на панель! поэтому то и обратился!
Автор: Troitsky
Дата сообщения: 29.01.2007 15:10
alin

Цитата:
Обратил внимание: если запускать код каждый новый час, то данные копируются в следующий столбец

Просто расчет был на то, что запускать скрипт будет только планировщик и в строго отведенное время, потому не делается проверка на четность часа. Так что если запускаться скрипт будет каждый час, сдвиг происходить будет лишь на один, а не на два столбца. Дополнение скрипта (в том числе разного рода проверками), естественно, возможно, но для этого нужно точно определиться с условиями эксплуатации.
Автор: alin
Дата сообщения: 29.01.2007 17:02
Troitsky
Понял, спасибо!
Автор: Pantera3587
Дата сообщения: 29.01.2007 18:58
SERGE_BLIZNUK

Спасибо за помощь. Вообще-то это плохо, что нет такой функции Квартал, потому-что не все пользователи знают как пользоваться формулами, а так ввел дату и получил квартал.

Yuk, тебе тоже спасибо. Правда я еще не пробовала применить это в коде. Если что, то задам вопрос.
Автор: OkeaH
Дата сообщения: 29.01.2007 21:10
Как в excel без применения vba можно сделать столбец фложков(что можно было отмечать ложь истина)? Знаю что так можно сделать но вот сделать так не могу уже все пункты меню облазил и бестолоку(::
Автор: The okk
Дата сообщения: 30.01.2007 06:41
OkeaH
Вид - Панели Инструментов - Формы. Появится панель с компонентами ActiveX.
С такими вопросами вообще надо в тему по Excel
Автор: Yuk
Дата сообщения: 30.01.2007 08:41
OkeaH
А что потом делать с этими флажками? Анализировать надо? И сколько их предполагается? С ActiveX слишком много не сделаешь. Потом недавно обсуждалась проблема о невозможности их спрятать вместе с ячейками. Если это не проблема - вперед рисовать.
Можно и без ActiveX, через Worksheet_SelectionChange, но это уже vba.
Другой вариант - сделать через Данные-Проверка-Лист, хотя это не совсем то.
Автор: The okk
Дата сообщения: 30.01.2007 09:08
Yuk

Цитата:
невозможности их спрятать вместе с ячейками.

А вот это, кстати, весьма спорно. У него нет свойства Visible?
Если есть, то спрятать через VBA вполне возможно.
Автор: evruka
Дата сообщения: 30.01.2007 11:08
Здравствуйте.
У меня такая проблема. Приведу пример: Есть два столбца данных: один с названиями, другой с значениями: 0 или 1:

Название 1 0
Название 2 1
Название 3 0
Название 4 1
Название 5 1
Название 6 0
Название 7 0
Название 8 1

На второй столбец поставил автофильт. Автофильтром управляет кнопка, которая то сворачивает автофильтр с значением 1 то разворачивает его полностью.
Все работает нормально. Но мне нужно защитить лист. И когда я делаю защиту, то
кнопка не может управлять автофильтром, хотя в разрешениях я указал, что автофильтр можно использовать. И еще, автофильт работает при защищенном листе, а вот кнопка, с помощью которой я управляю им не работает.
Вот код кнопки:

Sub CommandButton1_Click()
If CommandButton1.Caption = "Сгрупировать" Then
Range("O16:O340").AutoFilter Field:=1, Criteria1:="1"
CommandButton1.Caption = "Разгрупировать"
Else
If CommandButton1.Caption = "Разгрупировать" Then
Selection.AutoFilter Field:=1
CommandButton1.Caption = "Сгрупировать"
End If
End If
End Sub
Автор: The okk
Дата сообщения: 30.01.2007 11:34
evruka
На вскидку - надо разрешить макросу работать с защищенным листом.
Тут либо ActiveSheet.Unprotect - снять защиту с листа, либо ActiveSheet.Protect UserInterfaceOnly := True (не защищать от изменений, вносимых макросом).
Автор: evruka
Дата сообщения: 30.01.2007 12:38

Цитата:
На вскидку - надо разрешить макросу работать с защищенным листом.
Тут либо ActiveSheet.Unprotect - снять защиту с листа, либо ActiveSheet.Protect UserInterfaceOnly := True (не защищать от изменений, вносимых макросом).

Подскажите, где и как это нужно записать
Автор: The okk
Дата сообщения: 30.01.2007 13:23
evruka
Я в свое время в события это записывал. Например, открываешь код книги и туда в событие Workbook_open прописываешь нужные блокировки/разблокировки.
Но мой тебе совет - сто раз подумай, прежде чем связаться с защитой листа/книги/и т.д. Я с этой защитой жутко тогда намучился - UserInterfaceOnly это очень подлая вещь. Сбрасывается при каждом закрытии книги. Так что каждый раз при открытии надо отключать.

Добавлено:
Но можешь просто отдельный макрос создать. Например:
Код:
Sub СнятьЗащиту()
ActiveSheet.Protect UserInterfaceOnly := True
End Sub
Автор: Yuk
Дата сообщения: 30.01.2007 19:55
The okk

Цитата:
А вот это, кстати, весьма спорно. У него нет свойства Visible?
Если есть, то спрятать через VBA вполне возможно.

Спрятать то можно, но как сделать это одновременно со столбцом, например. Нет события на сокрытие ячеек. Единственный выход делать макрос, прячущий одновременно ячейки и контроли в них. И другой макрос на обратные действия.

Автор: The okk
Дата сообщения: 31.01.2007 05:57
Yuk

Цитата:
Спрятать то можно, но как сделать это одновременно со столбцом, например.

Ну, если проявить фантазию, то можно и не такое сделать.
Делаем следущее:
1. Делаем где-нибудь ячейку с формулой (или скрытый столбец с формулами), выдающей логическое Да/нет в зависимости от видимости ячейки. Такую функцию не сложно написать на VBA, только надо не забыть про Application.Volatile, чтобы автоматически пересчитывалась.
2. Теперь можно спокойно делать событие Worksheet_Change, где проверять
If Not Intersect(Target,Range(диапазон_с_нашими_формулами)) Is Nothing Then...
Все. Если там что-то изменилось, значит, где-то скрылись/отобразились ячейки.
Вот такая идея вкратце.
Автор: Yuk
Дата сообщения: 31.01.2007 06:17
The okk
Голова!
Автор: The okk
Дата сообщения: 31.01.2007 09:07
Yuk
Гыыы Еще полгода изучения VBA и стану крутым, как Уокенбах, буду книжки писать и сделаю надстройку еще более навернутую, чем PUP
Автор: jONES1979
Дата сообщения: 31.01.2007 10:39
The okk
а что за надстройка PUP ???
Автор: The okk
Дата сообщения: 31.01.2007 11:09
jONES1979
Power Utility Pak
Автор: Джон Уокенбах

Добавлено:
А кроме шуток - пора бы уже сделать одну серьезную надстройку, включающую в себя все существующие полезные надстройки + собственные наработки (доп.панели, доп.конструкторы, конструкторы различных итоговых форм и т.д.), как это в свое время сделал Уокенбах.

Добавлено:
mironmtx

Код:
Sub ДобавитьПанельПоиска()
Dim msBtn As CommandBarButton
Dim msTxt As CommandBarControl

Application.ScreenUpdating = False

On Error Resume Next
Application.CommandBars("Поиск").Delete
On Error GoTo 0
Application.CommandBars.Add(Name:="Поиск").Visible = True

With Application.CommandBars("Поиск")
.Position = msoBarTop
With .Controls
Set msBtn = .Add(Type:=msoControlButton)
With msBtn
.Caption = "Поиск"
.FaceId = 46
.OnAction = "Поиск"
End With
Set msTxt = .Add(Type:=msoControlEdit)
End With
End With
Application.ScreenUpdating = True
End Sub

Private Sub Поиск()
Dim Cell As Range
Set Cell = ActiveSheet.UsedRange.Find(Application.CommandBars("Поиск").Controls(2).Text)
If Not Cell Is Nothing Then Cell.Select
End Sub
Автор: dunamis
Дата сообщения: 31.01.2007 15:44
у меня на работе написал кто то когда давно макрос и поставил пароль. Макрос устарел слегка и никто не помнит парля. Можно как то сломать?

Добавлено:
помогите написать макрос. Надо вот что: например Ячейка А7, в ней написано Вася хороший мальчик. Надо, чтобы слово хороший переносилось на ячейку или две не важно на сколько вниз например на А8.
Автор: Troitsky
Дата сообщения: 31.01.2007 16:36
dunamis

Цитата:
у меня на работе написал кто то когда давно макрос и поставил пароль. Макрос устарел слегка и никто не помнит парля. Можно как то сломать?

Avanced Office Password Recovery и иже с ним


Добавлено:

Цитата:
помогите написать макрос. Надо вот что: например Ячейка А7, в ней написано Вася хороший мальчик. Надо, чтобы слово хороший переносилось на ячейку или две не важно на сколько вниз например на А8.

А в ячейке A7 оставалось "Вася мальчик"?
И так нужно для всех ячеек документа?
Слово известно или такое проворачивается именно со вторым словом в каждой ячейке?

Больше конкретики.

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

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


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