Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 09.01.2009, 19:07   #11
SIV84
Пользователь
 
Регистрация: 09.01.2009
Сообщений: 44
По умолчанию

Уважаемый tolikman.
Вся проблема заключается в том, что подобный код у меня есть. Вопрос в другом: что с ним делать - я не представляю. У меня достаточно поверхностные знания (к сожалению). И паралельно возникает вопрос: формированием моей задачи являестся совместные данные, получаемые при заполнении трех текстбоксов в одном ряду. Возможно есть вариант, при помощи текста, приведенного Вами, прописать три разные процедуры для определенных текстбоксов?
SIV84 вне форума
Старый 09.01.2009, 19:18   #12
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
TextBox451.Value = Sheets("Cчет-фактура").Cells(1, 3)
TextBox453.Value = ""
Круто Я бы не смог удерживать в своей памяти информацию о том, что хранится в 450 текстбоксах...

Цитата:
GoTo 15566
GoTo 33317
GoTo 15570
Если Вы смогли сделать ЭТО (не запутавшись в 6 265 (!) строках кода), - всё остальное мелочи.


Кстати, вместо форм типа



лучше использовать код вроде этого:
Код:
Select Case MsgBox("Печатать акт оплаты за товар?", 36, "Печать")
    Case 6    ' Да
        MsgBox "Нажата кнопка ДА"
    Case 7    ' Нет
        MsgBox "Нажата кнопка НЕТ"
    End Select
Для формирования этого кода есть даже специальная прога: MsgBox Generator.exe
Найти её (и другие полезные программы для VBA) можно в этом сообщении.

Ну а так, наработки весьма и весьма серьёзные...
С текстбоксами что-нибудь придумаем.

Последний раз редактировалось EducatedFool; 09.01.2009 в 19:29.
EducatedFool вне форума
Старый 09.01.2009, 19:24   #13
tolikman
Форумчанин
 
Регистрация: 25.08.2008
Сообщений: 159
По умолчанию

Каким именно необходимо присвоить события?

Последний раз редактировалось tolikman; 09.01.2009 в 19:28.
tolikman вне форума
Старый 09.01.2009, 19:28   #14
SIV84
Пользователь
 
Регистрация: 09.01.2009
Сообщений: 44
По умолчанию

Спасибо за одобрение и за совет. Не судите строго, я вообще экономист по образованию, по этому, если не сложно - высказывайте свои замечания в отношении текста программы. Я, как говорится, ещё не волшебник, по этому буду признателен любым советам и исправлениям.
SIV84 вне форума
Старый 09.01.2009, 19:30   #15
SIV84
Пользователь
 
Регистрация: 09.01.2009
Сообщений: 44
По умолчанию

Уважаемый tolikman.
Я все текстбоксы рисовал в ручную. Не знаю как это можно сделать по-другому. Именно по этому у меня, наверное, и получилось. Не знаю что ещё сказать.
SIV84 вне форума
Старый 09.01.2009, 19:43   #16
tolikman
Форумчанин
 
Регистрация: 25.08.2008
Сообщений: 159
По умолчанию

создайте еще два класса подобно первому. В классе один где
public sub tb_change() пропешите что надо делать, если изменяется первая ячейка.
во втором классе - тоже самое только для второй ячейки/текстБокса,
и соответсвеноо в 3.
также два массива этих классов. И дальше как в моем предидущем примере перебирайте все элементы TextBox'ов и через select case проверяй их координату по горизонтали
Код:
public arr1() as New class1
public arr2() as New class2
public arr3() as New class3
....
sub 
....
pos1 = 0 'координата первого тектБокса
pos2 = 100 'Координата второго текстБокса
pos3 - 200 '3-го
Select case i.left
  case pos1
    redim preserve arr1(Ubound(arr1,1)+1)  
    set arr1(ubound(arr1,1)).tb = i
  case pos2
    redim preserve arr2(Ubound(arr2,1)+1)  
    set arr2(ubound(arr2,1)).tb = i
  case pos3
    redim preserve arr3(Ubound(arr3,1)+1)  
    set arr3(ubound(arr3,1)).tb = i
  case else
   'все остальное
end select
...
end sub
tolikman вне форума
Старый 09.01.2009, 19:45   #17
SIV84
Пользователь
 
Регистрация: 09.01.2009
Сообщений: 44
По умолчанию

Уважаемый tolikman.

Обратите внимание на 27 форму. Принцип работы следующий. при заполнени кода товара высвечивается информация о товаре и единицах измерения, при заполнении количества формируется цена и сумма с и без НДС. При этом при изменении цены за единицу товара с НДС проводятся дополнительные изменения в формировании цен и суммы. Вот именно эти три фактора и необходимо связать. (все они описанны отдельно в этой же форме)
SIV84 вне форума
Старый 09.01.2009, 20:05   #18
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Вот Вам ещё один вариант решения вопроса.

Далеко не самый лучший и эффективный способ (с использованием классов было бы правильнее, да делать долго...),
но, учитывая, что Вы создали все эти текстбоксы в нужном порядке, может подойти.

Для начала запускаем макрос GenerateCodeForTextBoxes

Код:
Sub GenerateCodeForTextBoxes()
    Dim cont As Control
    For Each cont In UserForm27.Controls
        If cont.Name Like "TextBox*" Then res = res & CodeForTextBox(cont.Name)
    Next
    MsgBox res
End Sub

Function CodeForTextBox(ByVal Cname As String)
    num = Replace(Cname, "textbox", "", , , vbTextCompare)
    CodeForTextBox = "Private Sub " & Cname & "_Change()" & vbNewLine
    CodeForTextBox = CodeForTextBox & "    Изменения_в_текстбоксе " & num & vbNewLine
    CodeForTextBox = CodeForTextBox & "End Sub" & vbNewLine & vbNewLine
End Function
В переменной res получаем готовый листинг кода для обработки событий текстбоксов.

Вставляем этот код в модуль формы 27, и где-нибудь вставляем следующий макрос:
Код:
Sub Изменения_в_текстбоксе(ByVal num As Integer)
    строка = "  в строке  " & num \ 9 + 1
    Select Case num Mod 9
    Case 2: MsgBox "Изменено значение в текстбоксе  " & num & "  в столбце КОД" & строка
    Case 3: MsgBox "Изменено значение в текстбоксе  " & num & "  в столбце ХАРАКТЕРИСТИКА" & строка
    Case 4: MsgBox "Изменено значение в текстбоксе  " & num & "  в столбце ЕДИНИЦА ИЗМЕРЕНИЯ" & строка
    Case Else: MsgBox "Изменено значение в текстбоксе  " & num & "  в другом столбце" & строка
    End Select
End Sub
Этот макрос получает в качестве параметра номер запустившего его текстбокса,
по этому номеру вычисляет строку и столбец, в котором находится нужный текстбокс,
и в зависимости от этого выполняет нужное действие.
EducatedFool вне форума
Старый 09.01.2009, 20:07   #19
SIV84
Пользователь
 
Регистрация: 09.01.2009
Сообщений: 44
По умолчанию

Уважаемый tolikman.
Все было бы так хорошо, если бы я ещё хоть что-то пониммал и вышенаписанного. Проблема в том, что видет бог я пытался в классах описать алгоритм выполнения задачи. Но понятие textbox в классмодуле не воспринимается (по крайней мере у меня), а споймать нумерацию или какуюто привязку к теме я не могу. не могу понять зачем формируестя масиив. По примеру который я делал он набивается пустыми значениями. Скорее всего для формирования класса. Но все же сталкиваюсь с проблемой написания кода в классе. Подскажи или посоветуй по возможности!
SIV84 вне форума
Старый 09.01.2009, 20:22   #20
tolikman
Форумчанин
 
Регистрация: 25.08.2008
Сообщений: 159
По умолчанию

SIV84 я сейчас переписываю ваш файл, подождите минут 15. я отвечу
tolikman вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц