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

» Excel VBA (часть 3)

Автор: grinchukav
Дата сообщения: 08.04.2016 16:54
DJMC

Думаю, этот вопрос можно решить и без VBA. Вводите в ячейке U2 формулу вроде =100*B2+10*C2+D2,
распространяете (копируете) в остальные ячейки столбца U. Варианту 2 1 2 будет соответствовать число 212 в столбце U. Ну а строки с 212 элементарно фильтруете
Автор: DJMC
Дата сообщения: 08.04.2016 17:15
grinchukav
все так легко, большое вам спасибо, буду пробовать.
Автор: gogaman
Дата сообщения: 26.04.2016 15:39
Подскажите есть табличка к примеру с 15 строками 10 столбиками в конце строки идет подсчет сумы. Нужно на основании этой таблицы сформировать новую но без учета нулевой сумы в некоторых строках
Автор: ALeXkRU 123
Дата сообщения: 26.04.2016 16:50
gogaman
можно начать с знакомства со сводными таблицами (раз и два)...
Если их возможностей недостаточно, тогда - подробнее вопрос (и, в очередной раз , очень желательно пример файла приводить, с описанием, что требуется и в каком виде оно должно получиться... Чтобы помогающий не сидел, сочиняя и пытаясь догадаться, что ж там такое есть, где и как оно выглядит...)

опа! извиняюсь, не заметил а оно точно на VBA надо?
Автор: gogaman
Дата сообщения: 26.04.2016 17:26
ALeXkRU 123
спасибо гляну

Цитата:
а оно точно на VBA надо?

это не принципиально
я точно не знал где спросить поэтому написал сюда
Автор: Megallim
Дата сообщения: 13.05.2016 12:53
[more] Здравствуйте! Нужно написать прграммку на VBA. На форме должны появляться множество точек (или маленьких кружочков), которые случайно разбросаны. Эти точки как бы являются "звёздами" и со временем они должны мерцать. Мерцание можно сделать двумя способами.
1) С помощью Timer сделать так, чтобы некоторые, так сказать, "звёзды" через несколько секунд (у каждой "звезды" рандомное время мерцания) после появления начали становиться больше, затем меньше, затем опять больше и так далее (бесконечный цикл).
2) Или с помощью опять того же таймера сделать так, чтобы появившиеся "звёзды" через несколько секунд пропадали (у каждой "звезды" рандомное время мерцания), потом опять появлялись на том же месте, пропадали и т.д. (бесконечный цикл).

Вот впрочем и всё описание моего задания. Изучаю Java, Haskell, CSS и начал изучать VBA, который по мнению многих программистов является одним из самых лёгких языков и прекрасно подходит для изучения новичкам. Но я бы не сказал так. VBA мне по каким-то причинам пока даётся трудом. Да и учебников хороших нет, чтобы всё по полочкам разложено было. Все "учебники" на самом деле являются справочниками.

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

Код:
Private Sub UserForm_Activate()
''' resets the repiant thing for ellipse
Range("repaint_mode") = 0
End Sub

Private Sub UserForm_Deactivate()
CleanUpLine 'cleans up, realse objects etc
CleanUpEllipse
''' resets the repiant for thing ellipse
Range("repaint_mode") = 0
End Sub

Private Sub UserForm_Initialize()
'sets things up for drawing - see sub
Setup
'sethting up for drawing see sub
drawellipsetest
End Sub

Private Sub UserForm_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As Single, ByVal y As Single)
If Button = 1 Then
SetDrawStart x, y
ElseIf Button = 2 Then
'''set start points
lXs = x
lYs = y
Else: End If
End Sub
Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As Single, ByVal y As Single)
'Pass the mouase positin to subs
If Button = 1 Then
Draw x, y
ElseIf Button = 2 Then
If Range("repaint_mode") = 1 Then
DrawEllipseNoRepaint x, y
Else
DrawEllipse x, y
End If
End If
End Sub
Автор: Alexzzy
Дата сообщения: 14.05.2016 00:59
Я бы не посоветовал изучать программирование с VBA. Это узко специализированный язык для автоматизации приложений. Как делать анимацию наверное никто и не посоветует, в основном не для этого VBA пользуют...
Автор: Megallim
Дата сообщения: 14.05.2016 13:52
Alexzzy, я был бы и рад не изучать язык VBA, так как, как я уже сказал, он мне не совсем понятен. Но дело в том, что я изучаю его по требованию преподавателя, который дал мне задание. Написал тут с надеждой на то, возможно кто подскажет, как начинать. Спасибо вам за отклик!
Автор: NJCorp
Дата сообщения: 15.05.2016 19:10
есть некая форма, на ней чекбоксов дофига (12 рядов * 8 столбцов)
есть некая функция которая расставляет галочки в нужное место согласно некоему условию.
Надо добавить возможность вручную доставлять/снимать галочки и соответственно внести некие изменения в зависимости от положения cb на форме.
Помогите разобратся: на основе какого собития делать ручное изменение, или как програмно ставить галочки, чтоб не срабатовало сибитие Click/Change
Автор: ptr73
Дата сообщения: 16.05.2016 08:26
Megallim
1) начни просто с рисовки новых объектов на форме: точки, кружочки и т.п.
рисовка на канве формы
x и y - координаты от угла канвы

2) создавай новые объекты через инкрементный цикл, рандомно задавай объектам параметры: точка/кружок/радиус/время жизни/период до активации и т.д.

цикл пусть идёт от 1 до бесконечности

3) заставь объекты изменяться в зависимости от текущего номера цикла

4) прикрути таймер и инкрементируй цикл только по срабатыванию таймера, например, через каждые полсекунды
Автор: Megallim
Дата сообщения: 16.05.2016 15:19
Спасибо за ответ! Обязательно попытаюсь сделать вашим способом. Осталось разобраться в некоторых понятиях, которые вы привели)
Автор: Megallim
Дата сообщения: 18.05.2016 19:21
[more] Один круг получилось "нарисовать" на форме при нажатии на кнопку.


Код: Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetDC Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function Ellipse Lib "gdi32" (ByVal hDC As Long, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Private Declare Function CreateSolidBrush Lib "gdi32" (ByVal crColor As Long) As Long
Private Declare Function SelectObject Lib "gdi32" (ByVal hDC As Long, ByVal hObject As Long) As Long
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Private Declare Function CreatePen Lib "gdi32" (ByVal nPenStyle As Long, ByVal nWidth As Long, ByVal crColor As Long) As Long

Private Sub CommandButton_Click()
Dim hWnd As Long, hDC As Long, hBrush As Long, hPen As Long
hWnd = FindWindow("ThunderDFrame", Me.Caption)
hDC = GetDC(hWnd)
hBrush = CreateSolidBrush(vbBlack)
hPen = CreatePen(1, 2, vbBlack)
SelectObject hDC, hBrush
SelectObject hDC, hPen
Ellipse hDC, 0, 0, 10, 10
DeleteObject hBrush
DeleteObject hPen
End Sub
Автор: Megallim
Дата сообщения: 22.05.2016 15:14
Всё, помощь не нужна! Задача решена! Всем спасибо!
Автор: dmention
Дата сообщения: 26.05.2016 15:49
После вставки макросом гиперссылки на лист, меняются требования к использованию в коде разделителя, при указании диапазона со знака "," на знак ";"


Sub Макрос1()

ActiveSheet.Hyperlinks.Add Anchor:=ActiveSheet.Cells(1, 1), Address:="C:\Книга1.xls", TextToDisplay:="Ссылка"

' Если выполняется предыдущая строка, то в следующей необходимо использовать разделитель ";"
' а если не выполняется (удалить или закомментировать), то разделитель ","! Чудеса!

Range("C4:C12;E4:E10;G4:G16").Select

End Sub

В чем может быть причина такого поведения Excel и VBA?
Автор: ALeXkRU 123
Дата сообщения: 26.05.2016 18:33
dmention
если не изменяет память, разделители в экселе зависят от локали (в русскоязычном ; а в ангийском - зпт)...
возможно, с этим связано...

после выполнения оператора почему-то меняется локаль...
Автор: dmention
Дата сообщения: 06.06.2016 13:40
ALeXkRU 123 А можно в кодом VBA это как-то определить/установить?
Автор: KDPoid
Дата сообщения: 07.06.2016 14:47
dmention,
Application.DecimalSeparator


Автор: Alexzzy
Дата сообщения: 07.06.2016 15:48

Цитата:
Application.DecimalSeparator

А какая связь числового сепаратора со строковым?
Автор: KDPoid
Дата сообщения: 08.06.2016 06:42
Alexzzy
Упс, прогнался... Невнимательно прочитал откуда обсуждение началось.

Добавлено:
dmention
Воспользуйтесь:

Код: Union(Range("C4:C12"), Range("E4:E10"), Range("G4:G16")).Select
Автор: dmention
Дата сообщения: 08.06.2016 08:52
KDPoid
Предпочитаю устранить проблему, а не бороться с последствиями. К тому же Ваше решение при большом количестве диапазонов превращается в гигантский труд.

Я нашел такой выход. Заменил вставку гиперссылки:
ActiveSheet.Cells(1, 1).FormulaR1C1 = "=HYPERLINK(" & Chr(34) & Путь & Chr(34) & ", " & Chr(34) & Ссылка & Chr(34) & ")"

Почему заменяется разделитель остается на совести Майкрософт. Заметил, что какой бы ни был шрифт в ячейке до вставки гиперссылки, после вставки гиперссылки он заменяется на Calibri. Возможно с этим как-то связано.

Добавлено:
KDPoid Все равно, спасибо Вам и всем откликнувшимся!
Автор: 4t
Дата сообщения: 22.06.2016 20:05
Всем привет!

На кнопку нужно повесить функцию, которая будет возвращать True/False.
Сама функция выполняет следующую задачу: пользователь указывает файлы Excel, и если они соответствуют определенной структуре - тогда True, иначе - False
Структура файлов следующая: обязательное наличие листов - "таблица 1", "таблица 2", "таблица 3", "таблица 4", "таблица 5", "таблица 6"
Содержимое ячеек
В "таблица 1" ячейки B10 = 1, B50 = 2
В "таблица 2" ячейки B10 = 3, B50 = 4
В "таблица 3" ячейки B10 = 6, B50 = 6
В "таблица 4" ячейки B10 = 10, B50 = 20
В "таблица 5" ячейки B10 = 20, B50 = 40
В "таблица 6" ячейки B10 = 30, B50 = 60
Автор: kser
Дата сообщения: 20.08.2016 17:39
Здравствуйте.
Окажите пожалуйста посильную помощь (модификация макроса).
В интернете нашел макрос для добавления примечаний из значений в ячейках.
Макрос работает, но есть необходимость добавлять примечания не в тот же диапазон ячеек из которого берутся данные выделением, а со сдвигом в лево на 4 столбца, плюс надо к значению добавлять ещё и слово "пластик".

Буду благодарен за любую помощь.

Собственно сам макрос:

Sub КОММЕНТАРИИ()
'копирует значение ячейки в комментарий в видимом диапазоне
Dim c As Range, cc As Range
Application.DisplayCommentIndicator = xlCommentIndicatorOnly
Set cc = Selection
'если выделили 1 ячейку, то выход
If cc.Rows.Count = 1 And cc.Columns.Count = 1 Then
MsgBox "Выделено слишком мало ячеек!", , "Ошибка"
End
End If
Set cc = Selection.SpecialCells(xlCellTypeVisible)
For Each c In cc
If c.Value <> Empty Then
c.AddComment CStr(c.Value)
i = i + 1
End If
Next
MsgBox "Добавлено " & i & " комментарий!"
Exit Sub
End Sub
Автор: asrfarr
Дата сообщения: 20.08.2016 20:54
kser
Если я правильно понял то:
эту строчку:
c.AddComment CStr(c.Value)
замените вот этой:
c.Offset(0, -4).AddComment CStr(c.Value & " пластик")
Автор: kser
Дата сообщения: 20.08.2016 21:51
asrfarr Благодарю!
Автор: Fsp050
Дата сообщения: 07.09.2016 16:18
Ребзя, помогите справиться с задачей
в экселе 4 таблицы.
2. исходные.
из них нужно сделать такие же как, под ними, т.е. такого же формата.
0 и 1 это категории(да , нет. Возможно несколько)
Группа - это номер группы 1 и 2
нужная таблица имеет вид
28/78(35,9%)
где 28 это n т.е. абсолютное число , 78 это сумма абсолютных значений первой и второй категории 28+50=78.
35,9% это соответствует p (пропорция -0,359 категории 0)

вторая таблица отличается тем, что там добавлены ещё визиты.
групп и визитов может быть несколько
но формат отображения данных такой же
71/78(91%).

каждая из этих двух таблиц представлена отдельно, они не вместе в экселе сопровождаются

ссылка на данные
https://www.sendspace.com/file/5c7m1c
Автор: Dronton2
Дата сообщения: 07.09.2016 17:45
Fsp050
А не хотите решить эту задачу в базе данных, без извращений в экселе?
Категории, группы, визиты - это 3 независимых измерения. Разбор экселевской таблицы с исходными данными для 3 измерений - непростая задача, особенно, если учесть, что количество значений в измерениях может измениться. А если заказчик захочет добавить ещё парочку измерений?
В базе данных (например, MS Access) нужно для каждого измерения создать по табллице, в которых перечислить допустимые значения для измерений (для контроля целостности) и одну таблицу, в которую будут вноситься данные о больных и посещениях.
Простыми SQL запросами, состоящими из пары строк текста, можно будет формировать итоговые таблицы. И при изменении количества значений в измерениях, ничего не нужно будет менять.
И бонус: пропорции можно вычислять в этом же запросе к таблицам.
Автор: Leojse
Дата сообщения: 08.09.2016 23:02
Добрый вечер, уважаемые форумчане!
Очень надеюсь на Вашу помощь!
Есть большое количество книг. В этих книгах несколько десятков листов. Мне бы очень хотелось, чтобы макрос копировал из книг "1 и 2" с листов "2. Нужный лист" строки по условию в книгу "результат". Условие такое - необходимо найти определенное значение в "столбце 18" книг "1 и 2" и, если значения найдены, то полностью скопировать строки в "результат". Значения, которые нужно будет искать, заранее я не знаю, поэтому, хотелось бы вбивать их в окошко запроса типа "искомые значения" (если я ничего не путаю, окошко называется inbox). А вообще, подойдет любой другой вариант, чтобы задать эти самые значения для поиска в книгах 1 и 2.
Также хотелось бы, чтобы при копировании новых строк в книгу "результат" старые данные не стирались, а новые строки просто копировались бы ниже старых.
И, если, это возможно, хотелось бы, чтобы в книге "результат" в столбце А отображалось имя книги, откуда строка была скопирована.
В книгах "1 и 2" данные могут быть отфильтрованы по любому столбцу, строки и столбцы могут быть скрыты и поэтому хотелось бы, чтобы макрос просто игнорировал фильтр и просматривал скрытые строки. Примере искомые значения такие - "Туловище, Рука, Расческа, Фанта, Сок".
http://rgho.st/8NhF8tVQn

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127

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


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