Электростальский форум

Hi-Tech => Компьютеры, периферия, мультимедиа и ПО => Тема начата: Digger от 13.12.09, 16:36:58

Название: Требуется помощь в решении задачи на VBA
Отправлено: Digger от 13.12.09, 16:36:58
Ребят помогите пожалуйста! Надавали в универе задач на VBA, но имел дело ток с QBasic и Delphi, поэтому решаю задачу по аналогии, но что-то не догоняю как на этом языке написать некоторые вещи. Сообщения типа читай мануал или делай сам писать не надо, ибо я тут не халявы ищу а помощи.
Задача такая:
Вообщем нужно ввести одномерный массив, вывести его. Затем из положительных элементов сформировать другой массив и вывести; из отрицательных сформировать третий и вывести.
Вообщем на форме я создал TextBox для ввода размерности массива, кнопку вычислить, textbox для вывода результата.
Вообщем код такой:
Private Sub cmdVich_Click()
Dim A() As Integer
Dim B() As Integer
Dim C() As Integer
Dim k As Integer
Dim q As Integer
Dim i As Integer
Dim n As Integer
n = Val(txtN.Text)
Dim rez As String
ReDim A(n) As Integer
txtRez = ""
rez = rez & " ИСХОДНЫЕ ДАННЫЕ" & vbCrLf & vbCrLf
For i = 1 To n
             
             A(i) = InputBox("Введите элемент A(" & i & _
              ")", "Ввод массива A(" & n & ")")
              rez = rez & "A(" & i & ")= " & A(i) & Space(4)
    Next i
    rez = rez & vbCrLf & vbCrLf
    txtRez = rez
    k = 0
    q = 0
    For i = 1 To n
    If A(i) >= 0 Then k = k + 1:   B(k) = A(i)
   If A(i) < 0 Then q = q + 1: C(q) = A(i)
    Next i
    For i = 1 To k
    rez = rez & k & vbTab
    Next i
    rez = rez & vbCrLf
    txtRez = rez
    For i = 1 To q
    rez = rez & q & vbTab
    Next i
    txtRez = rez
End Sub

Private Sub cmdVihod_Click()
Unload Me
End Sub
Вообщем всё что красным работает. то есть массив ввожу и он выводится. Далее я не понимаю как индексу второго массива присвоить индекс первого. То есть в зелёных строках ошибка. И как потом вывести на результат другие два массива????????????????????
Название: Re: Требуется помощь в решении задачи на VBA
Отправлено: LEND от 13.12.09, 20:32:27
А Вы как, для B и C массив открыть не хотите?
Естественно, без этих массивов будет ошибка.

Значит так:
После строки
ReDim A(n) As Integer
вставьте еще две строки

ReDim B(n) As Integer
ReDim C(n) As Integer


Также измените код:

    For i = 1 To k
    rez = rez & k & vbTab
    Next i
    rez = rez & vbCrLf
    txtRez = rez
    For i = 1 To q
    rez = rez & q & vbTab
    Next i


        на

    For i = 1 To k
     rez = rez & B(i) & vbTab
    Next i
     rez = rez & vbCrLf
     txtRez = rez
    For i = 1 To q
     rez = rez & C(i) & vbTab
    Next i
   

Тогда все получится.
Успехов.
LEND
Название: Re: Требуется помощь в решении задачи на VBA
Отправлено: Digger от 13.12.09, 20:46:26
А Вы как, для B и C массив открыть не хотите?
Естественно, без этих массивов будет ошибка.

Значит так:
После строки
ReDim A(n) As Integer
вставьте еще две строки

ReDim B(n) As Integer
ReDim C(n) As Integer


Также измените код:

    For i = 1 To k
    rez = rez & k & vbTab
    Next i
    rez = rez & vbCrLf
    txtRez = rez
    For i = 1 To q
    rez = rez & q & vbTab
    Next i


        на

    For i = 1 To k
     rez = rez & B(i) & vbTab
    Next i
     rez = rez & vbCrLf
     txtRez = rez
    For i = 1 To q
     rez = rez & C(i) & vbTab
    Next i
   

Тогда все получится.
Успехов.
LEND
Спасибо большое! Всё таки есть в мире добрые люди)) Насчет открытия массивов... До ужаса не внимателен :bh:
Название: Re: Требуется помощь в решении задачи на VBA
Отправлено: Pavv от 06.04.10, 09:21:11
Чтоб не плодить похожие темы спрошу тут.

Как оптимизировать вот такой код (может в цикле как) ?

Sub GroupCheckBox()
    Dim i, j As Integer
   
    If OptionButton1.Value = True Then
        i = Worksheets("Work").Range("B1")
        j = Worksheets("Work").Range("F1")
    End If
   
    If OptionButton2.Value = True Then
        i = Worksheets("Work").Range("C1")
        j = Worksheets("Work").Range("G1")
    End If
   
    If OptionButton3.Value = True Then
        i = Worksheets("Work").Range("D1")
        j = Worksheets("Work").Range("H1")
    End If
   
    If OptionButton4.Value = True Then
        i = Worksheets("Work").Range("E1")
        j = Worksheets("Work").Range("I1")
    End If
   
    If OptionButton5.Value = True Then
        i = Worksheets("Work").Range("B2")
        j = Worksheets("Work").Range("F2")
    End If
   
    If OptionButton6.Value = True Then
        i = Worksheets("Work").Range("C2")
        j = Worksheets("Work").Range("G2")
    End If
   
    If OptionButton7.Value = True Then
        i = Worksheets("Work").Range("D2")
        j = Worksheets("Work").Range("H2")
    End If
   
    If OptionButton8.Value = True Then
        i = Worksheets("Work").Range("E2")
        j = Worksheets("Work").Range("I2")
    End If
   
    If OptionButton9.Value = True Then
        i = Worksheets("Work").Range("B3")
        j = Worksheets("Work").Range("F3")
    End If
   
    If OptionButton10.Value = True Then
        i = Worksheets("Work").Range("C3")
        j = Worksheets("Work").Range("G3")
    End If
   
    If OptionButton11.Value = True Then
        i = Worksheets("Work").Range("D3")
        j = Worksheets("Work").Range("H3")
    End If
   
    If OptionButton12.Value = True Then
        i = Worksheets("Work").Range("E3")
        j = Worksheets("Work").Range("I3")
    End If
    i = i + j
    Worksheets("Work").Range("N1").FormulaR1C1 = "=" & i
End Sub

OptionButton-он планируется 30 штук
Название: Re: Требуется помощь в решении задачи на VBA
Отправлено: LEO от 06.04.10, 18:34:34
1. создать массив опшнов. (задаешь одинаковое имя и свойство index)
2. задать свойство Tag опшнов нужным образом. Перебирать циклом дочерние контролы (свойство Controls формы или другого элемента-контейнера) и проверять их сначала на типа опшн-батна, потом смотреть тег (скажем, можешь сделать тег 2 буквы - соответствующие ячейки для i и j)
Название: Re: Требуется помощь в решении задачи на VBA
Отправлено: Pavv от 07.04.10, 13:25:30
Спасибо попробую.