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

» Excel VBA

Автор: alin
Дата сообщения: 15.12.2006 20:59
Помогите советом!
1) Имеется лист, на котором значения в ячейках A1, A2, A3, A4 (связь с базой данных) увеличиваются, через каждые ~2 сек. Задача следующая: пользователь заносит в ячейку F1 какое-либо условие (выбор из списка), в этот момент значения из ячеек A1…A4, должны копироваться в ячейки B1…E1.
Далее, через некоторое время, пользователь заносит в ячейку F2 какое-либо условие (выбор из списка), в этот момент в ячейки B2…E2 должны заносятся значения после вычисления B2=A1-B1, C2=A2-C1, D2=A3-D1, E2=A4-E1.
Затем, через некоторое время, пользователь заносит в ячейку F3 какое-либо условие (выбор из списка), в этот момент ячейки B3…E3 должны заносятся значения после вычисления B3=A1-(B1+B2), C3=A2-(C1+C2), D3=A3-(D1+D2), E3=A4-(E1+E2).
Т.е. нужно получать разницу между значениями столбца A1….A4 и теми значениями, которые были получены ранее в строке B1…E1, B2…E2 и т.д.
Заранее благодарен!
2) Как можно обратится к базе Access с меньшими тормозами чем Web Service References… По этому методу слишком долго идет обсчет данных?
Автор: mrdime
Дата сообщения: 16.12.2006 15:44
Yuk

ОГРОМНОЕ СПАСИБО! Спасибо, что хватает времени и энтузиазма отвечать на все вопросы и всем помогать.

Автор: aalleexxaa
Дата сообщения: 17.12.2006 11:07
как сделать так чтобы при выделении любой из ячеек диапазона A1:L1 выделялся бы весь диапазон ячеек A1:L1 и т.д. A2:L2, A3:L3

и как получить при этом значение A1, A2 , ...
Автор: jONES1979
Дата сообщения: 17.12.2006 14:24
aalleexxaa

вроде бы, чтобы выделить весь столбец от A1:L1 до A65536:L65536 надо просто по заголовкуам выделять. Или тебя интересует код на vba???
тогда что-то вроде


Код: ActiveSheet.Columns("A:L").Select
Автор: aalleexxaa
Дата сообщения: 17.12.2006 23:33
jONES1979
не, если ты так сделаеш, то веделится весь диапазон от A1 до L ****
а мне нужно чтоб только эта строчка выделялась.
значения я уже получил
Автор: The okk
Дата сообщения: 18.12.2006 06:34
aalleexxaa

Код:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim RowCounter As Long

For RowCounter = 1 To ActiveSheet.UsedRange.Rows.Count
If Not Intersect(Target, Range(Cells(RowCounter, 1), Cells(RowCounter, 12))) _
Is Nothing Then
Application.EnableEvents = False
Range(Cells(RowCounter, 1), Cells(RowCounter, 12)).Select
Application.EnableEvents = True
End If
Next

End Sub
Автор: Yuk
Дата сообщения: 18.12.2006 08:42
aalleexxaa
Типа такого:
Код: Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Column < 13 Then
Application.EnableEvents = False
Range(Cells(Target.Row, 1), Cells(Target.Row, 12)).Select
Debug.Print Selection.Cells(1, 1).Value
Application.EnableEvents = True
End If
End Sub
Автор: The okk
Дата сообщения: 18.12.2006 09:11
Yuk

Цитата:
А цикл-то зачем?

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

Код:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim RowCounter As Long
Dim SelectedRows As Long
Application.EnableEvents = False
For RowCounter = 1 To ActiveSheet.UsedRange.Rows.Count
If Not Intersect(Target, Range(Cells(RowCounter, 1), Cells(RowCounter, 12))) _
Is Nothing Then
SelectedRows = SelectedRows + 1
End If
Next
Range(Cells(Target.Row, 1), Cells(Target.Row + SelectedRows, 13)).Select

Application.EnableEvents = True
End Sub
Автор: alin
Дата сообщения: 18.12.2006 11:02
Private Sub ToggleButton3_Click()
If ToggleButton3.Value = True Then
Range("BD30").Formula = "=BD21-BD23-BD24"
Range("BE30").Formula = "=BE21-BE23-BE24"
Range("BF30").Formula = "=BF21-BF23-BF24"
Range("BG30").Formula = "=BG21-BG23-BG24"
Range("BD30:BG30").Select
Selection.Copy
Range("BD25:BG25").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
Range("BC25").Select
Else
ToggleButton3.Value = False
Range("BD25:BH25").ClearContents
End If
End Sub
Работает медленно, можно ли как-то ускорить процесс вычисления?
Автор: Troitsky
Дата сообщения: 18.12.2006 11:29
alin
например, попробовать обойтись без всяких выделений-копирований-вставок подобным образом:
Код: Range("BD25").Value = Range("BD30").Value
Range("BE25").Value = Range("BE30").Value
Range("BF25").Value = Range("BF30").Value
Range("BG25").Value = Range("BG30").Value
Автор: The okk
Дата сообщения: 18.12.2006 12:11
alin
Может, будет проще, если ты скажешь, что должен делать макрос?
Автор: alin
Дата сообщения: 18.12.2006 12:17
Troitsky
Спасибо, работает как часы!

Private Sub ToggleButton3_Click()
If ToggleButton3.Value = True Then
Range("BD30").Formula = "=BD21-BD23-BD24"
Range("BE30").Formula = "=BE21-BE23-BE24"
Range("BF30").Formula = "=BF21-BF23-BF24"
Range("BG30").Formula = "=BG21-BG23-BG24"
Range("BD25:BG25").Value = Range("BD30:BG30").Value
Else
Range("BD25:BH25").ClearContents
End If
End Sub

Добавлено:
The okk
Здесь[more]Помогите советом!
1) Имеется лист, на котором значения в ячейках A1, A2, A3, A4 (связь с базой данных) увеличиваются, через каждые ~2 сек. Задача следующая: пользователь заносит в ячейку F1 какое-либо условие (выбор из списка), в этот момент значения из ячеек A1…A4, должны копироваться в ячейки B1…E1.
Далее, через некоторое время, пользователь заносит в ячейку F2 какое-либо условие (выбор из списка), в этот момент в ячейки B2…E2 должны заносятся значения после вычисления B2=A1-B1, C2=A2-C1, D2=A3-D1, E2=A4-E1.
Затем, через некоторое время, пользователь заносит в ячейку F3 какое-либо условие (выбор из списка), в этот момент ячейки B3…E3 должны заносятся значения после вычисления B3=A1-(B1+B2), C3=A2-(C1+C2), D3=A3-(D1+D2), E3=A4-(E1+E2).
Т.е. нужно получать разницу между значениями столбца A1….A4 и теми значениями, которые были получены ранее в строке B1…E1, B2…E2 и т.д.
Заранее благодарен!
2) Как можно обратится к базе Access с меньшими тормозами чем Web Service References… По этому методу слишком долго идет обсчет данных?[/more]
Автор: The okk
Дата сообщения: 18.12.2006 12:52
Yuk
Можешь изобразить пример, как через СМЕЩ и ПОИСКПОЗ (они же offset и match) искать в неограниченном несортированном массиве:
как должна выглядеть формула поиска, если в первом листе:
СтолбецA СтолбецB
777 Доски
555 Компьютеры
666 Плюшевый сатана
911 Набор юного спасателя
... в общем, длинный такой список номенклатуры, размер которого не ограничен и может растягиваться.

А во втором листе просто числа:
СтолбецA
911
555
И надо подставить в столбецB наименование товара через поиск.
Автор: alin
Дата сообщения: 18.12.2006 13:05
The okk
Если не ошибаюсь, на другой странице ПОИСКПОЗ работать не будет. И данные в столбце А, вэтом случае, должны быть упорядочены по возростающей.
Автор: The okk
Дата сообщения: 18.12.2006 13:16
alin
Чтобы работало на другой странице, можно присвоить диапазону имя - обычно работает.
А что до сортировки, так ПОИСКПОЗ и нужен как раз там, где массив не сортированный. Иначе применил бы ВПР или ПРОСМОТР - и не надо было бы всякие СМЕЩ и ИНДЕКС брать.

Добавлено:
Все, сорри, уже в другой теме разобрались
Автор: alin
Дата сообщения: 18.12.2006 14:38
Если вычисления в таблице Excel происходят автоматически, можно ли макросом приостановить вычисления, а затем запустить вычисления?
The okk
ОК!
Автор: The okk
Дата сообщения: 18.12.2006 14:50
alin

Код:
Application.Calculation = xlCalculationManual 'отменяем автокалькуляцию
Автор: aalleexxaa
Дата сообщения: 18.12.2006 15:15
The okk
Премного благодарен
Автор: alin
Дата сообщения: 18.12.2006 15:41
The okk
Спасибо!
Автор: The okk
Дата сообщения: 19.12.2006 07:30
Столкнулся с таким глюком в ListView:
У меня на форме две страницы. На обеих по одному Listview с чекбоксами.
Ставлю галочку в первый чекбокс на первой странице, переключаюсь на вторую, потом опять на первую - чексоксы исчезли из виду, вместо них пустое место.
Если по ним покликать, они станут видны, но меня такое положение не устраивает. Почему не работает нормально?
Автор: aks sv
Дата сообщения: 19.12.2006 08:48
Помогите решить такую проблемму. Имеется таблица с данными сотрудников. ФИО (только) отображаются в ListBox на форме. На форме имеются две кнопки "вверх" и "вниз" при помощи которых в ListBox перемещаются ФИО и кнопка "ОК". Как сделать, чтобы при нажатии "ОК" измененные положения ФИО в ListBox изменили расположение данных сотрудников в таблице. Заранее благодарен.
Автор: The okk
Дата сообщения: 19.12.2006 09:10
aks sv
насколько я понял, количество не меняется, а меняется только порядок. Так? тогда по нажатию на ОК можно просто заполнить диапазон листа, где лежат ФИО, данными из listbox. По-моему, это гораздо проще, чем отслеживать (или, не дай бог, искать), что изменилось, а потом долго и упорно по каждому изменению делать кучу действий по перестановке записи на листе.
Я listbox сейчас не использую (ListView намного мощнее), но помнится мне, там была такая фишка, как RowSource. Ты ListBox через нее заполнял?
Автор: aks sv
Дата сообщения: 19.12.2006 09:16
Antananarivu
Можешь поподробнее описать как ты сделал смену раскладки клавиатуры с англ. на русскую

Добавлено:
The okk
Дело в том, что в ListBox заполняются только ФИО с помощью AddItem, а данные на сотрудников в Label при выделении в ListBox ФИО:

Private Sub ListBox1_Click()
Dim EmpFound As Range
With Range("EmpList")
Set EmpFound = .Find(ListBox1.Value)
If EmpFound Is Nothing Then
Label2.Caption = ""
Else
With EmpFound
Label2.Caption = " Имя: " & .Offset(, 2).Value & vbLf & _
" Отчество: " & .Offset(, 3).Value & vbLf & _
" Должность: " & .Offset(, 4).Value & vbLf & _
" Принят на работу: " & .Offset(, 5).Value & vbLf & _
" Оклад:" & .Offset(, 6).Value & vbLf & _
" Табельный номер:" & .Offset(, 7).Value
End With
End If
End With
End Sub
Автор: The okk
Дата сообщения: 19.12.2006 10:12
aks sv
Ну, тогда придется заполнять лист из того, что есть - то бишь из Label
Как вариант могу предложить:
1. сделать некий спрятанный (visible = false) лист-справочник, где будут все работники и их данные в любом порядке.
2. Сделать видимый лист таким образом:
столбецA СтолбецБ и т.д.
Фамилия1 формула1
Фамилия2 формула2
Фамилия3 формула3
....

Формула = ИНДЕКС(массив_в_первом_листе;ПОИСКПОЗ(A1;массив_в_первом_листе;0);номер_столбца)

Тут:
массив в первом листе - это диапазон на скрытом листе, где размещены справочные данные.
A1 - это ссылка на ячейку.
номер столбца - ну, собственно, и есть номер столбца. Для Имени - 2, для отчества - 3 и т.д.
Формула находит по фамилии, указанной в столбце А, все данные сотрудника.

При такой организации можно смело вертеть столбцом А видимого листа. В частности, записывать в него Item'ы из Listbox, а вся остальная часть таблицы будет мгновенно перестраиваться сама, благодаря формуле.

Добавлено:
Как определить количество используемых строк в отдельно взятом столбце? (как UsedRange для листа)?
Автор: aks sv
Дата сообщения: 19.12.2006 11:49
The okk
Спасибо за совет, попробую.
На твой вопрос, если я правильнр понял:

Sub Число_строк()
Dim LastRow As Long
LastRow = Range("A65536").End(xlUp).Row
MsgBox "Число строк" & LastRow
End Sub
Автор: The okk
Дата сообщения: 19.12.2006 12:10
aks sv
ок. спс.

Добавлено:
Вот пример с ListView. Запустите макрос testform. В форме перейдите сначала на 2 потом опять на 1 страницу. - Чекбоксы пропадают. Самое плохое - при переходе от одной страницы к другой они еще ВСЕ устанавливаются в True.

Кто-нибудь знает, как это исправить?

Добавлено:
Устранил проблему. Вот как "лечил":
сделал событие - когда меняется чекбокс, сделать Item жирным.
Другое событие - при смене страницы все жирные сделать выделенными (Checked = True), остальные сделать не выделенными (Checked = False)

Добавлено:
Теперь разбираюсь, как мне удалить выбранный элемент.
Автор: The okk
Дата сообщения: 20.12.2006 07:24
С удалением разобрался - не заметил, что там метод ListItems.Remove аргумент требует, поэтому искал метод для ListItem
В итоге, чтобы удалить выбранный (Selected) элемент, надо:

Код: ListView1.ListItems.Remove(SelectedItem.Index)
Автор: aks sv
Дата сообщения: 20.12.2006 11:25
The okk
Никогда не использовал ListView, вышли мне код помылу: asv_99@mail.ru
Автор: jONES1979
Дата сообщения: 20.12.2006 12:05
aks sv


Цитата:
Antananarivu
Можешь поподробнее описать как ты сделал смену раскладки клавиатуры с англ. на русскую


Итак, как на VBA делать смену раскладки:

Код:
Public Const HKL_NEXT = 1
Public Const HKL_PREV = 0

Public Const kb_lay_ru = 68748313
Public Const kb_lay_en = 67699721

Public Declare Function ActivateKeyboardLayout Lib "user32" ( _
ByVal HKL As Long, _
ByVal flags As Long) As Long

' Так активируем следующую 'ActivateKeyboardLayout HKL_NEXT, 0
' Или так. Активируем предыдущую. 'ActivateKeyboardLayout HKL_PREV, 0

Public Sub ActivateKeyboardLayoutRU()
ActivateKeyboardLayout kb_lay_ru, 0
End Sub

Public Sub ActivateKeyboardLayoutEN()
ActivateKeyboardLayout kb_lay_en, 0
End Sub
Автор: The okk
Дата сообщения: 20.12.2006 12:07
aks sv
Код чего?
Ты скажи, что не получается - может, подскажу. Я тут уже немного разбираться стал.

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

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


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