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

» Excel VBA (часть 2)

Автор: SAS888
Дата сообщения: 15.02.2008 10:38
virginijus
Можно проще:

Код: Dim i As Integer
For i = 1 To 30
If Cells(i, "A") > 0 Then Range("B1") = Cells(i, "A")
Next
Автор: Ilyansk
Дата сообщения: 15.02.2008 11:18
Ув.форумчане, помогите наладить переход в форме по полям ввода.
Есть поле со списком (п1) Если в него введно новое значение, то перейти к п2, а если выбрано из списка, то к п4
определяю метод ввода при выходе из формы в sub обработки события п1_exit и в этой процедуре, в случае ввода из списка, вызываю метод п4.setfocus. В противном случае - ничего не делаю, т.к. по tabindex п2 "идет" следующим.
Заморочка вот в чем. П4 тоже поле со списком (listindex=0, не -1, так надо) и когда выполняется в п1_exit п4.setfocus, тут же п1_exit вызывается снова, доходит до п4.setfocus и тогда только выполняет вход в п4 и ! почему-то сразу выход из него, те происходит событите п4_exit безо всяких манипуляций с п4, хотя они необходимы
Заколебался я с этими событиями... В общем вопрос пока такой, как в зависимости от введенного значения, попадать в нужные поля ввода (устанавливать курсор)?
Автор: virginijus
Дата сообщения: 15.02.2008 12:35
SAS888 Спасибо, люблю простату, только вот жаль результат - такои же , и показывает на

For i = 1 To 30 эту строчку

а вот так :

Sub aaa()
Dim I, X As Integer
X = 1
For I = 1 To 30
If Cells(I, 1) = "" Then
Else
X = X + 1
End If
Next I
Cells(1, 2) = Cells(X - 1, 1)
End Sub , идет, так мне написал знакомыи, но мне кажетьса, что можно как-то попроще

Автор: Ilyansk
Дата сообщения: 15.02.2008 12:46
virginijus,
разве, что так (с проверкой на число и величину). Но это почти не отличается от предложенного выше

Код: Sub aaa()
For I = 1 To 30
If isnumeric(Cells(I, 1)) Then if Cells(I, 1) >0 Then Cells(1, 2) = Cells(I, 1)
Next I
End Sub
Автор: virginijus
Дата сообщения: 15.02.2008 13:45
Ilyansk Cпасибо, то, что надо, а нелзя-ли все это написать через "A1:A30"? Так было-бы попрощее, хотя и так отлично. Спасибо
Автор: vasiliy74
Дата сообщения: 15.02.2008 17:20
как приостановить выполнение макроса в конкретном месте на 1 минуту например, ?

Добавлено:
Взял пример из [more=Help-a Excel]
Код: newHour = Hour(Now())
newMinute = Minute(Now())
newSecond = Second(Now()) + 10
waitTime = TimeSerial(newHour, newMinute, newSecond)
Application.Wait waitTime
Автор: gvserg1
Дата сообщения: 15.02.2008 19:19
Доброго времени суток!
Подскажите плиз, как можно сделать так, чтобы ВСЕМ ячейкам на текущем листе, которые содержат цифровые значения (при этом формат их может быть как чилсовой так и текстовый) присваивался формат "Accounting" (он же Бухгалтерский), с количеством знаков после запятых=0 и знак валюты тоже "пусто".
При этом формат ячеек с текстом либо с цифровыми значениями которые не являются числами (напр 61.2.3 - бух счета) оставалсь неизмененными)
Пример того что нужно - в файле. На первом листе - что имеем, на втором - как должно быть.
http://slil.ru/25478605
Буду очень признательным за помощь...
Автор: vasiliy74
Дата сообщения: 15.02.2008 19:22
Понял. нужно просто вторую часть отдельной функцией реализовать и установить запуск через 15 сек например
Автор: Anton T
Дата сообщения: 15.02.2008 19:48
vasiliy74
В форме:

Код: Private Sub UserForm_Activate()
Application.OnTime Now + TimeValue("00:00:05"), "KillTheForm"
End Sub
Автор: vasiliy74
Дата сообщения: 15.02.2008 19:51
Anton TВсё равно спасибо
Автор: AndVGri
Дата сообщения: 16.02.2008 03:22
Ilyansk
[more=Попробуй так]
Фокус у тебя передаётся на другой элемент, поэтому был введён флаг принудительного перехода на cmb4

Код:
Private toCmb4 As Boolean

Private Sub cmb1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If cmb1.ListIndex > -1 Then
toCmb4 = True 'установим флаг, что нужен фокус на cmb4
cmb4.SetFocus
Else
toCmb4 = False
End If
End Sub

'на этот элемент переходит фокус
Private Sub cmb3_Enter()
If toCmb4 Then
toCmb4 = False
cmb4.SetFocus
End If
End Sub
Private Sub UserForm_Activate()
cmb1.List = Array("One1", "One2", "One3")
cmb4.List = Array("four1", "four2", "four3")
cmb4.ListIndex = 0
End Sub
Автор: Ilyansk
Дата сообщения: 18.02.2008 06:13
virginijus

Цитата:
Ilyansk Cпасибо, то, что надо, а нелзя-ли все это написать через "A1:A30"?

во многих случаях в VBA excel можно вместо cells(x,y) применять range("a1"), но с учетом того, что RANGE это диапазон, т.е. позволяет работать сразу с группой ячеек, например менять формат отображения, а cells(x,y) - только с одной, "лично мне так ка-аца"... Да и куда проще? Хотя, Вы правы

Код: For Each c In Range("a1:a30")
If c <> "" And IsNumeric(c) Then Range("b1") = c
Next
Автор: Sunnych
Дата сообщения: 18.02.2008 12:45
Есть вот такой макрос он проходит по шапке (в шапке заданы месяца) и определяет таким образом начальный и конечный столбец области определения для изъятия и замены информации находящейся в ячейках, проблема такого рода ранее ячейки с месяцами были текстовыми, а теперь они в формате дата "Date", и я не знаю как мне переделать функции "Function" так что макрос работал как раньше.

Код: Function ПолучитьЛист(ИмяЛиста) As Worksheet
Dim tmpWSh As Worksheet
On Error Resume Next
Set tmpWSh = ActiveWorkbook.Sheets(ИмяЛиста)
If Err.Number <> 0 Then
Set tmpWSh = ActiveWorkbook.Sheets.Add
tmpWSh.Name = ИмяЛиста
Else
tmpWSh.UsedRange.Clear
End If
On Error GoTo 0
Set ПолучитьЛист = tmpWSh
End Function

Function ЭтоМесяц(ТекстЗнач) As Boolean
Dim AllMonth As String
ЭтоМесяц = False
ТекстЗнач = LCase(ТекстЗнач)
If InStr(1, "янв.08,фев.08,мар.08,апр.08,май.08,июн.08,июл.08,авг.08,сен.08,окт.08,ноя.08,дек.08", ТекстЗнач) > 0 Then
ЭтоМесяц = True
End If
End Function

Function ПолучитьНомерМесяца(ТекстЗнач) As Integer
Dim StartPos As Integer
Dim i As Integer
Dim MonthNumber As Integer
MonthNumber = 0
StartPos = InStr(1, "янв.08,фев.08,мар.08,апр.08,май.08,июн.08,июл.08,авг.08,сен.08,окт.08,ноя.08,дек.08", ТекстЗнач)
For i = 1 To StartPos
If Mid$("янв.08,фев.08,мар.08,апр.08,май.08,июн.08,июл.08,авг.08,сен.08,окт.08,ноя.08,дек.08", i, 1) = "," Then
MonthNumber = MonthNumber + 1
End If
Next i
ПолучитьНомерМесяца = MonthNumber + 1
End Function

Sub Sunnych_current_txt()
' Саныч Макрос
' Макрос записан 5.02.2008 (Sunnych)
Dim SH As Worksheet
Dim iCol As Integer
Dim iStartCol As Integer
Dim iMaxCol As Integer
Dim iRow As Integer
Dim iMaxRow As Integer
Dim vVar1 As Variant
Dim strT1 As String
Dim intOffset As Integer

Set SH = ПолучитьЛист("Лист3")
iStartCol = 0
iMaxCol = Sheets("Лист1").UsedRange.Columns.Count + Sheets("Лист1").UsedRange.Column - 1
For iCol = 3 To iMaxCol
Debug.Print Sheets("Лист1").UsedRange.Columns(iCol).Width
If (Sheets("Лист1").UsedRange.Columns(iCol).Width > 1) And (iStartCol = 0) Then
iStartCol = iCol
Exit For
End If
Next iCol
intOffset = iStartCol - ПолучитьНомерМесяца(LCase(Trim$(Sheets("Лист1").Cells(8, iStartCol).Text)))
For iCol = iStartCol To iMaxCol
Debug.Print Sheets("Лист1").UsedRange.Columns(iCol).Width
If Sheets("Лист1").UsedRange.Columns(iCol).Width > 3 Then
strT1 = Trim$(Sheets("Лист1").Cells(8, iCol).Text)
If ЭтоМесяц(strT1) = False Then
Exit For
End If
SH.Cells(1, ПолучитьНомерМесяца(strT1)).FormulaR1C1 = strT1
SH.Cells(1, ПолучитьНомерМесяца(strT1)).NumberFormat = "[$-419]mmmm yyyy"
End If
Next iCol
iMaxCol = iCol - 1

iRow = 9
Do While Trim$(Sheets("Лист1").Cells(iRow, 1).Text) <> ""
For iCol = iStartCol To iMaxCol
strT1 = Trim$(Sheets("Лист1").Cells(iRow, iCol).Text)
If sText = "" Then
sText = "0"
ElseIf sText = "резерв" Then
sText = "0R"
ElseIf sText = "с 15" Then
sText = "занят с 15"
ElseIf sText = "до 15" Then
sText = "занят до 15"
Else
sText = "1"
End If
SH.Cells(iRow - 7, iCol - intOffset).NumberFormat = ""

Next iCol
iRow = iRow + 1

Loop

For iCol = 1 To SH.UsedRange.Columns.Count
If SH.Cells(1, iCol).Text <> "" Then
iStartCol = iCol
Exit For
End If
Next iCol
SH.Activate
For iCol = 1 To iStartCol - 1
SH.Range(Cells(2, iStartCol), Cells(SH.UsedRange.Rows.Count, iStartCol)).Select
Selection.Copy
SH.Cells(2, iCol).Select
SH.Paste
Next iCol

SH.Select
For iCol = SH.UsedRange.Columns.Count + 1 To 12
SH.Range(Cells(2, SH.UsedRange.Columns.Count), Cells(SH.UsedRange.Rows.Count, SH.UsedRange.Columns.Count)).Select
Selection.Copy
SH.Cells(2, iCol).Select
SH.Paste
Next iCol

SH.Activate
SH.Range(SH.Cells(1, 1), SH.Cells(SH.UsedRange.Rows.Count, SH.UsedRange.Columns.Count)).Select
Selection.Copy

End Sub
Автор: SAS888
Дата сообщения: 18.02.2008 13:01
Так ведь еще проще. Функция Month(ячейка в формате "Datе") вернет порядковый номер месяца.
Автор: abasov
Дата сообщения: 18.02.2008 14:02
Коллеги помогите решить задачу.

Как выставить столбец "С" относительно всех совпадающих строк в столбце "а".

а b c
-------------
1 1 Иванов
1 2 петров
1
2
2
2
1
1

Что бы в итоге получилось:
1 Иванов
1 Иванов
1 Иванов
2 петров
2 петров
2 петров
Автор: Zakkazak
Дата сообщения: 18.02.2008 14:06
Друзья! Есть такая проблема. Смастерил в сабже простенькую систему учета, для магазинчика хозтоваров.
Хотелось бы чтоб оператор после ввода чисел в ячейку (незащищенную) не мог ее подкорректировать, то есть после нажатия Ентер ячейка становилась red-only (защищенной). Учет ведеться на защищенных листах. Исходные ячейки не защищенные..
Автор: Sunnych
Дата сообщения: 18.02.2008 14:27
SAS888 я не рублю в VBA по этому и спросил, так как пересмотрел help и не смог разобраться, какой нибудь конкретный пример привести можете/
и в любом случае мне нужно будет использовать функцию
Function Month(Date)
Автор: SergD1973
Дата сообщения: 18.02.2008 15:12
abasov

Цитата:
Как выставить столбец "С" относительно всех совпадающих строк в столбце "а".


Для этого используется функция ВПР. В третьем столбике ставишь так:

=ВПР($A3;B$1:$C$2;2;ЛОЖЬ)

Правда это не VBA
Автор: sadmn
Дата сообщения: 18.02.2008 17:40
может, тут мне поможете, наведёте на мысль,

Цитата:
как сделать так, чтобы определённый код (часть макроса) выполнялся при нажатии клавиши (любой) на клавиатуре?
а.и:

Цитата: Private Sub ???_???()
Dim i As Integer
Dim j As Integer

Select Case KeyAscii
Case 8, 46
i = 0
j = j + 1
Case 32, 13
i = i + 1
End Select
Автор: SAS888
Дата сообщения: 19.02.2008 04:59
Zakkazak

Цитата:
Хотелось бы чтоб оператор после ввода чисел в ячейку (незащищенную) не мог ее подкорректировать, то есть после нажатия Ентер ячейка становилась red-only (защищенной). Учет ведеться на защищенных листах. Исходные ячейки не защищенные..

Один из возможных вариантов:
Пусть, например, столбец "B" исходно не защищенный от редактирования на защищенном листе, требует Ваших инструкций. Тогда, если ячейка столбца пуста - ввод возможен, а если нет - снимаем защиту листа, защищаем ячейку и вновь устанавливаем защиту листа. Это реализует следующий макрос, расположенный в модуле соответствующего листа.

Код: Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If (Not IsEmpty(Target.Value)) And Target.Column = 2 Then
ActiveSheet.Unprotect
ActiveCell.Locked = True
ActiveSheet.Protect Scenarios:=True, UserInterfaceOnly:=True
End If
End Sub
Автор: abasov
Дата сообщения: 19.02.2008 08:07
SergD197 спасибо, формулой даже удобнее...
OpenOffice оказывается с формулами работает намного быстрее, просчет 30 000 строк - 3 сек, у мсофис 10 сек
Автор: Zakkazak
Дата сообщения: 19.02.2008 10:51
SAS888
Спасибо огромное, работает , остальное попробую доделать сам.
Автор: sadmn
Дата сообщения: 19.02.2008 19:18
SAS888
за наводку спасибо, но к сожалению так у меня не получится (вопрос изначально из вордовской ветки). в ворде, похоже, это вообще не осуществимо. ((
Автор: Vladimir312
Дата сообщения: 21.02.2008 02:06
Уважаемые, подскажите ...
типа, задачка, табличка в Excel:
- Цвет строки должен быть зеленый, если отсутствует в любой ячейке этой строки знак +.
- Цвет строки должен быть желтый, если в любой ячейке строки появился знак + . (кроме последней колонки).
- Цвет строки должен быть красный, если сегодняшняя дата больше или равна дате в графе «Срок выполнения».
- Цвет строки должен быть синий, если знак + оказался в последней графе.

'так выделяем диапазон:

Код: Dim DiapazonRange As Range
Set DiapazonRange = Range("B3:G3,I3:M3")
Range("B3:G3, I3:M3").Select
Автор: ol7ca
Дата сообщения: 21.02.2008 04:26
Подскажите, пожалуйста, как решить следующую задачку:
имеется список (около 1000 строк) из 3-х колонок, где есть счет (число), название счета (текст) и остаток счета (число). Я присвоил имена каждому остатку счета (потом использую это как ссылку на имена). Каждый месяц остатки по счетам меняются, и могут добавляться новые счета, и я обновляю этот файл (1). Мне нужно в другом файле (2) иметь точно такую же таблицу с уже присвоенными именами и обновлять ее, но
1.    как сделать, чтобы счета и их названия из прошлого месяца в файле (2) оставались как есть, а обновлялись только остатки
2.    новые счета (которых не было в прошлом месяце) добавлялись в конец списка в том же формате: счет-название-остаток-имя (взять в файле (2)) и выделялись жирным красным шрифтом.
3.    в следующем месяце, перед очередной процедурой, «красные» счета должны становиться обычными (т.к. они уже становятся не новыми) и список сортировался по полю «счета».
Далее все повторяется.

Буду благодарен за помощь.
Автор: SAS888
Дата сообщения: 21.02.2008 07:01
Vladimir312
Предлагаю такое решение Вашей задачи:

Код: Sub Colors()
Dim DiapazonRange As Range, x As Object, Lcol As Integer
Set DiapazonRange = Range("B3:G3,I3:M3")
DiapazonRange.Select
With Selection
Lcol = .Areas(.Areas.Count).Column + .Areas(.Areas.Count).Columns.Count - 1
'Lcol - номер последнего столбца в последней выделенной области
Set x = .Find(what:="+", LookAt:=xlPart)
If Not x Is Nothing Then
If x.Column = Lcol Then
.Interior.ColorIndex = 5
Cells(x.Row, Lcol).Interior.ColorIndex = 0 ' последняя ячейка в строке
Else: .Interior.ColorIndex = 6
End If
Else
.Interior.ColorIndex = 4
End If
'Пусть в ячейке "A1" - срок выполнения, тогда:
If Date >= Range("A1") Then .Interior.ColorIndex = 3
End With
Range("A1").Select 'снимаем выделение диапазона
Set x = Nothing ' уничтожаем использованный объект
End Sub
Автор: DavidKATS
Дата сообщения: 21.02.2008 12:50
Всем привет! Подскажите, как сделать так, чтобы в Combobox, находящийся в форме, автоматически строился список элементов, который находится в другой книге, или на другом листе?
Автор: DocBeen
Дата сообщения: 21.02.2008 13:36
Ребята подскажите как можно реализовать следующее

Исходная Таблица

Петров - 100
Петров - 100
Иванов - 50
Сидоров - 30
Сидоров - 34
Петров - 10


Надо получить

Петров - 210
Иванов - 50
Сидоров - 64


Т.е извлечение уникальных имен из первой таблицы - и дальнейшее суммирование данных в соответвии с исходной таблицы ...
Автор: ecolesnicov
Дата сообщения: 21.02.2008 14:26
DavidKATS
У Combobox-а есть свойство RowSource - вот в нем то и надо писать "ссылку" на диапазон. Формат ссылки - такой-же как и когда вы в формуле ссылаетесь на другую страницу и/или книгу. Т.е. например =[Книга2]Лист1!$A$1:$A$9. Что будет значить что combobox будет показывать данный из Листа1 Книги2 (мы сейчас в какой-то другой книге).
Автор: DavidKATS
Дата сообщения: 21.02.2008 14:34
DocBeen

Цитата:
Ребята подскажите как можно реализовать следующее

Исходная Таблица

Петров - 100
и т.д.....

В Экселе есть встренная функция "Промежуточные итоги". Снача нужно отсортировать список от А до Я, чтобы одинаковые фамилии оказались рядом друг с другом. Затем выделить весь диапазон фамилий и на вкладке "Данные" (пакет Офис 2007) воспользоваться функцией ПРОМЕЖУТОЧНЫЕ ИТОГИ. Результат будет выглядеть примерно так:
Артурунян - 20
Артурунян - 32
ИТОГО Артурунян - 52
Борисов - 12
Борисов - 2
Борисов - 8
ИТОГО Борисов - 22
...
и т.д.
Понятно, что операцию сортировки и применение функции промежуточных итогов можно использовать программно. Затем, циклом вывести строки, начинающиеся с ИТОГО в нужное место.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133

Предыдущая тема: Написание своего HyperTerminal для считывания данных


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