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

» Excel VBA

Автор: Yuk
Дата сообщения: 26.07.2006 19:10
agrippa
yuk4pub at gmail com
Автор: agrippa
Дата сообщения: 26.07.2006 19:39
ээээ.... Пошли мне чё-нить... А то я не понял, какой у тя адрес...
Автор: RobinStone
Дата сообщения: 27.07.2006 04:13
спасибо тем кто ответил
обратиться к элементу по имени я теперь могу:
NameVar = "someControl"
Form_MyForm.Controls(NameVar).Value = "Something"

А вот как создать элемент которого не сущестует
собственно задача:
есьт таюлица в ней два поля Имя и Значение
надо на форму вывести некое количество элементов Надпись с Caption=Имя
И несколько полей с Value=Значение

Пытаюсь делать так
Application.CreateControl("MyForm", ........)
не помню как точно там параметры, но указываю по стправке
в ответ на это выдает ошибку: "...возможно только в режиме конструктора"

как добавить? - подскажите!!
Автор: Yuk
Дата сообщения: 27.07.2006 05:21
RobinStone
Не понял. В Экселе элемент формы создается через Form.Controls.Add, a CreateControl вроде из Аксесса.
Автор: Yuk
Дата сообщения: 27.07.2006 16:33
agrippa
Файлы получил. Текстовые. Запятые вперемешку с точками.
Вот как это выглядит на самом деле:
Код: 18,07    .06    испыт    ание N    5    Стенд    N 5    уст.N 1    МРЧ    N 8    кол. зон 2
T= 0,    25 c                                    

0,25                                        
548    504.0    0.0    0.0    0.0    108.0    540.0    2944.0    3040.0    624.0    2284.0
0,5                                        
552    504.0    0.0    0.0    0.0    120.0    536.0    2948.0    3040.0    616.0    2296.0
......
Автор: zQuatroz
Дата сообщения: 28.07.2006 00:40
Спасибо за помощь RedPromo & agrippa.
agrippa
благодарю за помощь. Записнушка была написана по сходному алгоритму(дали пару советов добрые люди) так что считаю вопрос исчерпаным.
Еще раз спасибо.
Автор: jtyler
Дата сообщения: 28.07.2006 14:14
Подскажите как проверить формат ячейки и если он не числовой исправить на числовой?

Добавлено:
Я имею ввиду то, что в ячейках содержаться числа вида 23,2345334 но в формате string
как их преобразовать в double, чтобы сравнивать

Добавлено:
При нажатии на кнопку создается chart с графиком как к нему обратится, чтобы удалит во время события Worksheet_SelectionChange ?

Автор: Yuk
Дата сообщения: 28.07.2006 17:10
jtyler

Цитата:
Подскажите как проверить формат ячейки и если он не числовой исправить на числовой?
Если через формулу:
Код: =ЕСЛИ(ЕЧИСЛО(A1);A1;ЗНАЧЕН(A1))
Автор: agrippa
Дата сообщения: 28.07.2006 19:46
Yuk


Там должны быть только числа.
0,25
548 504.0 0.0 0.0 0.0 108.0 540.0 2944.0 3040.0 624.0 2284.0
0,5
552 504.0 0.0 0.0 0.0 120.0 536.0 2948.0 3040.0 616.0 2296.0



Просто в первом столбце у меня даты были текстом написаны... Т.е. вместо 0,25 было янв.25
.... И т.д.
А разделитель должен быть одинаковым...
Автор: Yuk
Дата сообщения: 28.07.2006 20:01
jtyler

Цитата:
При нажатии на кнопку создается chart с графиком как к нему обратится, чтобы удалит во время события Worksheet_SelectionChange ?

Добавляем в начало модуля с твоей функцией
Код: Public crt As String
Автор: jtyler
Дата сообщения: 31.07.2006 12:43
Yuk

Спасибо!!


А можно для удобства какимн-нибудь образом сгрупировать диаграмму, т.е. чтобы при её выделении куда бы не кликал мышкой диагрмма выделялась вся, а то если мышкойкликнуть на область например графика, то выделится только он ?
Автор: Yuk
Дата сообщения: 31.07.2006 16:34
jtyler
Можно. Используя 2-й способ из моего предыдущего поста, через класс, наследующий объект Chart. В нем прописываем реакцию на событие Select. Идея такая, что куда бы юзер ни кликнул при выделении графика, выделится весь график.

Поподробнее:

Создаем новый class module. Переименуем его в myChartClassModule.
В его коде пишем
Код: Public WithEvents myChartClass As Chart

Private Sub myChartClass_Select(ByVal ElementID As Long, ByVal Arg1 As Long, ByVal Arg2 As Long)
myChartClass.ChartArea.Select
End Sub
Автор: sakhsnake
Дата сообщения: 01.08.2006 03:26
Доброго всем времени суток.
Подскажите пожалуйста как можно сделать вот такую весчь.
Дано:
Два массива.
Первый - Dim(10000,2). Наименование, количество и точка.
Второй - Dim(10000,2). Наименование (полный список), количество и точка.
Один из массив содержит болше данных (т.е. полный список товара и его наличие)
Количество записе в обоих массивах известно.
Вопрос:
Как получить массив вот такого вида:
Dim(10000,3) где
Dim(0,0) - Наименование.
Dim(0,1) - наличие из полного списка
Dim(0,2) - наличие на точке
Dim(0,3) - точка.
Автор: dneprcomp
Дата сообщения: 01.08.2006 03:54
sakhsnake
Примерно так. Только разберись что из какого массива идет. А то ты массивы совершенно одинаково описал.

Dim ar1(10000,2)
Dim ar2(10000,2)
Dim ar3(10000,3)

Dim X as Integer
Dim Y as Integer

For X = 0 To 10000
For Y = 0 To 3
If Y < 3 then
'Наименование, наличие из полного списка, наличие на точке
ar3(X,Y)=ar1(X,Y)
Else
ar3(X,Y)=ar2(X,Y) точка
End If
Next X
Автор: sakhsnake
Дата сообщения: 01.08.2006 04:28
dneprcomp


Цитата:
ar3(X,Y)=ar1(X,Y) Наименование, наличие из полного списка, наличие на точке

эта строка выдает ошибку.

массивы у меня не одинаковые т.е. количество записей в них разное и расположение одинаковых элементов в самих массивах разное.

Я попробовал зделать вот так:

Цитата:

Sub слияние(db_min, db_max, min, max)
' db_min - массив с мЕньшим количеством записей
' db_max - массив с бОльшим количеством записей
' min - количество записей в минимальном массиве
' max - количество записей в максимальном массиве
For i = 1 To min
tovar_name = db_min(i, 0)
tovar_kol = db_min(i, 1)
tochka = db_min(i, 2)
For count = 1 To max
all_data_db(count, 0) = db_max(count, 0)
all_data_db(count, 1) = db_max(count, 1)
all_data_db(count, 2) = db_max(count, 2)
If tovar_name = db_max(count, 0) Then
If tochka = db_max(count, 2) Then
all_data_db(count, 0) = tovar_name
all_data_db(count, 1) = tovar_kol
all_data_db(count, 2) = tochka
all_data_db(count, 3) = db_min(i, 1)
End If
End If
Next count
Next i

Но уменя это работает неправильно.
Может я что-то здесь перемудрил?
Автор: dneprcomp
Дата сообщения: 01.08.2006 05:36
sakhsnake
Я не утверждал, что массивы одинаковые. Я понятия не имею. Я отметил, что ты их описал одинаково.
Зачем происходит заполнение массива 2-а раза?

Цитата:
For count = 1 To max
all_data_db(count, 0) = db_max(count, 0)
all_data_db(count, 1) = db_max(count, 1)
all_data_db(count, 2) = db_max(count, 2)
и затем теже елементы перезаписываешь

Цитата:
If tochka = db_max(count, 2) Then
all_data_db(count, 0) = tovar_name
all_data_db(count, 1) = tovar_kol
all_data_db(count, 2) = tochka
all_data_db(count, 3) = db_min(i, 1)



Цитата:
Цитата:ar3(X,Y)=ar1(X,Y) Наименование, наличие из полного списка, наличие на точке

эта строка выдает ошибку
А коментарии убирать пробовал?
Мой пример(я кстати его подредактировал) расчитан на то, что массивы уже ОДИНАКОВО отсортированы и в них одинаковое количество елементов(так как ты описывал).
Ты уверен что count и i начинаются с 1, а не с 0?
Похоже, что происходит путаница с переменными. Дай нормальное описание, что хранится в массиве db_max и чем значения tovar_kol в db_min логически отличаются от значения в массиве db_max.
Автор: sakhsnake
Дата сообщения: 01.08.2006 06:17
dneprcomp

С коментариями я понял, но ошибка была out of range, но не в этом дело.
Да моя проперуха. Не так объяснил что мне необходимо сделать. А нужно вот что:

В db_min содержится:
db_min(0,0) - наименование товара
db_min(0,1) - количество товара на точке
db_min(0,2) - название точки

В db_max содержится:
db_max(0,0) - наименование товара
db_max(0,1) - количество товара на складе
db_max(0,2) - название точки

min - количество записей в db_min
max - количество записей в db_max

В all_data_db необходимо получить:
all_data_db(0,0) - наименование товара
all_data_db(0,1) - количество товара на точке
all_data_db(0,2) - количество товара на складе
all_data_db(0,3) - название точки

Автор: dneprcomp
Дата сообщения: 01.08.2006 08:46
sakhsnake

for x=0 to max
all_data_db(x,0) = db_max(x,0) 'наименование товара
all_data_db(x,2) = db_max(x,1) 'количество товара на складе
all_data_db(x,3) = db_max(x,2) 'название точки
for y=0 to min
if db_max(x,0) = db_min(y,0) then
if db_max(x,2) = db_min(y,2) then
all_data_db(x,1) = db_min(y,1) 'количество товара на точке
exit for
end if
end if
next y
next x

Добавлено:
out of range был скорее всего от того, что размерность массивов не совпадала.
Автор: sakhsnake
Дата сообщения: 01.08.2006 09:37
dneprcomp

Огромное тебе спасибо. Но видимо проблема не в этом т.к. твой вариант отрабатывает точно так же как и мой. У меня есть еще подозрение что какая-то несостыковка идет в наименованиях. Т.к. (допустим: 100% ХИТ ОТ РУССКОГО РАДИО) если просто зделать поиск данного наименования то вылетает сообщение что данные не обнаружены, но обноружено что в запросе (поисковом) обнаружены символы форматирования. Можно ли с таким как-то боротся??? Всмысле как это вообще влияет на данные в массивах? Может я неправильно их объявляю? (делаю так: Dim all_data_db(10000, 3) As Variant)
Автор: dneprcomp
Дата сообщения: 01.08.2006 10:01
sakhsnake
Честно говоря, я не совсем понимаю что ты делаешь. И в чем. Какие поисковые запросы в Excel? Может ты в Access пишешь? Объяснил бы подробнее в чем проявляется ошибка. Код "поиска" показал бы ...
PS. Если ты ищешь именно фразу "100% ХИТ ОТ РУССКОГО РАДИО", то % и может оказаться "символом форматирования"
Автор: sakhsnake
Дата сообщения: 01.08.2006 10:53
dneprcomp
Да нет пишу в Excel. Я говорил про обычный ексцеловский поиск. Вот он то и выдавал сообщение про которое я говорил в предыдущем посте. А возможно ли избавится от этого? Всмысле чтобы наименование воспринималось только как текст, а не какие-то там символы форматирования.

P.S. Если интересно вот здесь положил файл 1.xls и модуль
Автор: alin
Дата сообщения: 01.08.2006 10:56
Помогите советом!
Имеется форма, в которой, установив флаг (CheckBox), заносится необходимая формула в определённую ячейку. Как сделать, чтобы формула заносилась не в момент установки флага, а после нажатия на OK и после нажатия кнопки UndoButton данные на листе оставались без изменений?
Возможно ли все нижеприведенное объединить в один код?...
Хотелось бы облагородить страничку расчетов на работе...
Заранее благодарен!

Private Sub CommandButton1_Click()
Menu.Show
End Sub

Private Sub OK_Click()
If CheckBox1.Value = True Or CheckBox2.Value = True Or CheckBox3.Value = True _
Then Unload Me
If CheckBox1.Value And CheckBox2.Value And CheckBox3.Value _
Or CheckBox1.Value = False And _
CheckBox2.Value = False And CheckBox3.Value = False _
Then MsgBox "Определитесь с операцией!"
End Sub

Private Sub UndoButton_Click()
Unload Me
End Sub

Private Sub CheckBox1_Click()
If CheckBox1.Value = True Then
Range("I3").Formula = "=H3-C3"
CheckBox2.Value = False
CheckBox3.Value = False
Range("I3").Select
With Selection.Interior
.ColorIndex = 4
.Pattern = xlSolid
End With
End If
If CheckBox1.Value = False Then
Selection.ClearContents
Range("I3").Select
With Selection.Interior
.ColorIndex = 0
.Pattern = xlSolid
End With
End If
End Sub.....

Автор: jtyler
Дата сообщения: 01.08.2006 15:58
for YUK


Создаем новый class module. Переименуем его в myChartClassModule.
В его коде пишем
Код: Public WithEvents myChartClass As Chart

Private Sub myChartClass_Select(ByVal ElementID As Long, ByVal Arg1 As Long, ByVal Arg2 As Long)
myChartClass.ChartArea.Select
End Sub
Автор: Yuk
Дата сообщения: 01.08.2006 17:20
jtyler

Цитата:
А где потом исспользуется myChartClass_Select

Это событие (event), запускается при выделении графика.

Цитата:
что это за параметры (ByVal ElementID As Long, ByVal Arg1 As Long, ByVal Arg2 As Long) ?

Это параметры функции-обработчика события Select. ElementID передает в функцию, какой конкретно элемент графика выделен (оси, серии данных, заголовок и т.п.). Arg1 и Arg2 передают некие состояния этих элементов в зависимости от их типа.

Вообще, читайте хелп VBA. Там все расписано довольно подробно.



Добавлено:
alin
Какие проблемы? Просто перенеси конструкцию
Код: If CheckBox1.Value = True Then
...
End If
If CheckBox1.Value = False Then
...
End If
Автор: dneprcomp
Дата сообщения: 01.08.2006 19:41
Yuk

Цитата:
Цитата:for x=0 to max
...
for y=0 to min

Имхо тут на 1 элемент больше. Надо или max-1 и min-1
sakhsnake указывал что массивы начинаются с 0 : all_data_db(0,0), db_max(0,0), db_min(0,0)

sakhsnake
У меня поиск тоже нормально работает. Но какое отношение поиск имеет к реализации алгоритма работы с массивами? При переносе в массив какие именно ошибки?

Добавлено:
Yuk

Цитата:
If CheckBox1.Value = True - масло масляное.
If CheckBox1.Value или If Not CheckBox1.Value вполне достаточно.
В данной версии языка достаточно. А в следующей вполне может показываться другое свойство по дефолту. Что собственно и произошло в VB с контролом lable. Пришлось чистить весь код.
Автор: Yuk
Дата сообщения: 01.08.2006 20:07
dneprcomp

Цитата:
sakhsnake указывал что массивы начинаются с 0

OK. Но так как max и min - количество записей, а не максимальный индекс, в цикле должно быть 0 to max-1.

Цитата:
Пришлось чистить весь код.

Даже если CheckBox1.Value станет не булевая (в чем я очень сомневаюсь), то код придется чистить именно в первом случае с CheckBox1.Value = True. Второй вариант возьмет как булевые, так и целые значения. Или я что-то не так понял?

Автор: dneprcomp
Дата сообщения: 01.08.2006 20:50
Yuk
С min ты прав. Недоглядел я. В голове UBound крутился все время
А вот с CheckBox... IMHO лучше явно определять. При явном в случае замены дефолтного значения вылезит error. А в использовании по дефолту придется разбираться где не идет. Но, впрочем, это в какой-то степени вопрос вкуса и привычек
Автор: Yuk
Дата сообщения: 01.08.2006 22:08
dneprcomp

Цитата:
При явном в случае замены дефолтного значения

Стоп. Я кажется понял, где тут недопонимание.
В конструкции CheckBox1.Value = True идет присваивание, и если это происходит впервые в коде, идет замена дефолтного значения. И здесь я с тобой абсолютно согласен, что оставлять это на произвол разработчиков не стоит.
В случае же If CheckBox1.Value = True Then идет сравнение, и сравнивать булевую переменную с булевой константой, получая булевый же результат особого смысла не имеет. Разве что для некоторого удобства чтения, что действительно дело привычки.

Автор: dneprcomp
Дата сообщения: 01.08.2006 22:33
Yuk
Тогда на этом и сойдемся
Автор: sakhsnake
Дата сообщения: 02.08.2006 02:43
Yuk
Насчет поиска я просто привел маленьки пример. Так сказать чтобы убедится что некоторые названия (в моём случае) представляются не просто как текст, а еще как-то. Как я понимаю и с подсказки dneprcomp впринципе так оно и получается. Про динамические массивы я уже подумывал, но это меня пока не беспокоит. Мне щас с другим разобратся надо.

dneprcomp
Поиск никаким образом не относится к созданию массивов. Но заковырка-то в том что db_min и db_max создаются нормально, а вот при их слиянии в all_data_db получается какая-то фигня. Я почему и полез на форум. Может я что-то не так делаю - оказалось что код который ты предложил отрабатывает точно также как и мой. Т.е. при слиянии в all_data_db неверные данные. Я и начал искать может что со входными данными не то?

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

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


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