слишком большая процедура

Программирование на Visual Basic for Applications
abracadabra
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 80
Зарегистрирован: 30.11.2004 (Вт) 17:36
Откуда: Lviv Ukraine

слишком большая процедура

Сообщение abracadabra » 10.07.2006 (Пн) 17:41

Не хочет выполняться процедура, пишет - слишком большая процедура.
У меня там много кода, много циклов, а вставляю в другую процедуру - не работает, т.к. основной цикл у меня в другой процедуре - и его не видит :).
Что делать? .
Крокодил, крокодю и буду крокодить!

Al Khamid
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 274
Зарегистрирован: 11.02.2004 (Ср) 10:00
Откуда: Москва, Ховрино

Сообщение Al Khamid » 11.07.2006 (Вт) 9:45

(©К.С
Последний раз редактировалось Al Khamid 06.11.2007 (Вт) 14:39, всего редактировалось 1 раз.

Nicky
Постоялец
Постоялец
 
Сообщения: 519
Зарегистрирован: 12.08.2004 (Чт) 12:14

Сообщение Nicky » 11.07.2006 (Вт) 9:51

Вынести в процедуру тело цикла

abracadabra
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 80
Зарегистрирован: 30.11.2004 (Вт) 17:36
Откуда: Lviv Ukraine

Сообщение abracadabra » 11.07.2006 (Вт) 14:56

что такое тело цикла?
Я разбиваю, но у меня слишком навороченный код. другая процедура из моей не читается. почемуто.
Крокодил, крокодю и буду крокодить!

abracadabra
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 80
Зарегистрирован: 30.11.2004 (Вт) 17:36
Откуда: Lviv Ukraine

Сообщение abracadabra » 11.07.2006 (Вт) 14:58

В этом постинге было под сотню килобайт кода.
Неотформатированного.

Впрочем, если бы он был отформатированным, ситуация существенно не менялась бы.

В следующий подобный безмозглый постинг будет удалён вместе с автором, до изучения последним смысла слова "аттач".

-- GSerg
Крокодил, крокодю и буду крокодить!

FaKk2
El rebelde gurú
El rebelde gurú
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Сообщение FaKk2 » 11.07.2006 (Вт) 19:07

Я на месте компилятора тоже послал бы тебя подальше.

abracadabra
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 80
Зарегистрирован: 30.11.2004 (Вт) 17:36
Откуда: Lviv Ukraine

Сообщение abracadabra » 12.07.2006 (Ср) 10:44

:)
спасибо,
Вы настоящие друзья
Крокодил, крокодю и буду крокодить!

Nicky
Постоялец
Постоялец
 
Сообщения: 519
Зарегистрирован: 12.08.2004 (Чт) 12:14

Сообщение Nicky » 12.07.2006 (Ср) 10:57

Код: Выделить всё
For i ...
  'тело цикла
Next i

abracadabra
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 80
Зарегистрирован: 30.11.2004 (Вт) 17:36
Откуда: Lviv Ukraine

Сообщение abracadabra » 13.07.2006 (Чт) 11:22

у меня тело цикла - конструкция With
With Application.Selection
Worksheets(1).Range(Cells(RowPos, 4), Cells(RowPos, 4)).Value = Laborwert.Parametername
Worksheets(1).Range(Cells(RowPos, 5), Cells(RowPos, 5)).Value = Laborwert.Zeit
Worksheets(1).Range(Cells(RowPos, 6), Cells(RowPos, 6)).Value = Laborwert.Datum
Worksheets(1).Range(Cells(RowPos, 7), Cells(RowPos, 7)).Value = Laborwert.Ergebnistext
Worksheets(1).Range(Cells(RowPos, 8), Cells(RowPos, 8)).Value = Laborwert.Normalwert
Worksheets(1).Range(Cells(RowPos, 9), Cells(RowPos, 9)).Value = Laborwert.Minwert
Worksheets(1).Range(Cells(RowPos, 10), Cells(RowPos, 10)).Value = Laborwert.Maxwert
Worksheets(1).Range(Cells(RowPos, 11), Cells(RowPos, 11)).Value = Laborwert.Messwert
Worksheets(1).Range(Cells(RowPos, 12), Cells(RowPos, 12)).Value = Laborwert.Einheit
Worksheets(1).Range(Cells(RowPos, 13), Cells(RowPos, 13)).Value = Laborwert.Gw
Worksheets(1).Range(Cells(RowPos, 14), Cells(RowPos, 14)).Value = Laborwert.Datum

End With

А цикл If - End If

Я пробовал выносить - но из этой процедуры основная данные не считывает
Крокодил, крокодю и буду крокодить!

Nicky
Постоялец
Постоялец
 
Сообщения: 519
Зарегистрирован: 12.08.2004 (Чт) 12:14

Сообщение Nicky » 13.07.2006 (Чт) 11:35

abracadabra писал(а):у меня тело цикла - конструкция With
With Application.Selection
Worksheets(1).Range(Cells(RowPos, 4), Cells(RowPos, 4)).Value = Laborwert.Parametername
Worksheets(1).Range(Cells(RowPos, 5), Cells(RowPos, 5)).Value = Laborwert.Zeit
Worksheets(1).Range(Cells(RowPos, 6), Cells(RowPos, 6)).Value = Laborwert.Datum
Worksheets(1).Range(Cells(RowPos, 7), Cells(RowPos, 7)).Value = Laborwert.Ergebnistext
Worksheets(1).Range(Cells(RowPos, 8), Cells(RowPos, 8)).Value = Laborwert.Normalwert
Worksheets(1).Range(Cells(RowPos, 9), Cells(RowPos, 9)).Value = Laborwert.Minwert
Worksheets(1).Range(Cells(RowPos, 10), Cells(RowPos, 10)).Value = Laborwert.Maxwert
Worksheets(1).Range(Cells(RowPos, 11), Cells(RowPos, 11)).Value = Laborwert.Messwert
Worksheets(1).Range(Cells(RowPos, 12), Cells(RowPos, 12)).Value = Laborwert.Einheit
Worksheets(1).Range(Cells(RowPos, 13), Cells(RowPos, 13)).Value = Laborwert.Gw
Worksheets(1).Range(Cells(RowPos, 14), Cells(RowPos, 14)).Value = Laborwert.Datum

End With

А цикл If - End If

Я пробовал выносить - но из этой процедуры основная данные не считывает


With Application.Selection - не вижу смысла
А цикл If - End If - это как?

abracadabra
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 80
Зарегистрирован: 30.11.2004 (Вт) 17:36
Откуда: Lviv Ukraine

Сообщение abracadabra » 13.07.2006 (Чт) 16:34

For i = 1 To Laborwert.Parameter.Count

If Laborwert.Parametername = "Blutsenkung" Then

With Application.Selection
Worksheets(1).Range(Cells(RowPos, 4), Cells(RowPos, 4)).Value = Laborwert.Parametername
Worksheets(1).Range(Cells(RowPos, 5), Cells(RowPos, 5)).Value = Laborwert.Zeit
Worksheets(1).Range(Cells(RowPos, 6), Cells(RowPos, 6)).Value = Laborwert.Datum
Worksheets(1).Range(Cells(RowPos, 7), Cells(RowPos, 7)).Value = Laborwert.Ergebnistext
Worksheets(1).Range(Cells(RowPos, 8), Cells(RowPos, 8)).Value = Laborwert.Normalwert
Worksheets(1).Range(Cells(RowPos, 9), Cells(RowPos, 9)).Value = Laborwert.Minwert
Worksheets(1).Range(Cells(RowPos, 10), Cells(RowPos, 10)).Value = Laborwert.Maxwert
Worksheets(1).Range(Cells(RowPos, 11), Cells(RowPos, 11)).Value = Laborwert.Messwert
Worksheets(1).Range(Cells(RowPos, 12), Cells(RowPos, 12)).Value = Laborwert.Einheit
Worksheets(1).Range(Cells(RowPos, 13), Cells(RowPos, 13)).Value = Laborwert.Gw
Worksheets(1).Range(Cells(RowPos, 14), Cells(RowPos, 14)).Value = Laborwert.Datum

End With
'выводит на лист Ексель данные
End If


RowPos = RowPos + 1





If Laborwert.Parametername = "Leukozyten" Then

то же самое и так циклов 40 на 30 - м пишет, что слишком большая процедура
Крокодил, крокодю и буду крокодить!

Igor_123
Осторожный Баянист
Осторожный Баянист
Аватара пользователя
 
Сообщения: 1325
Зарегистрирован: 21.07.2004 (Ср) 13:00
Откуда: Днепропетровск

Сообщение Igor_123 » 13.07.2006 (Чт) 16:57

abracadabra
а почему-бы весь этот блок with .. end with не вынести в отдельную функцию. Например:
Код: Выделить всё
Sub FillFields(RowPos As Long, Laborwert As Тип)
With Laborwert
    Worksheets(1).Cells(RowPos, 4).Value = .Parametername
    Worksheets(1).Cells(RowPos, 5).Value = .Zeit
    Worksheets(1).Cells(RowPos, 6).Value = .Datum
    Worksheets(1).Cells(RowPos, 7).Value = .Ergebnistext
    Worksheets(1).Cells(RowPos, 8).Value = .Normalwert
    Worksheets(1).Cells(RowPos, 9).Value = .Minwert
    Worksheets(1).Cells(RowPos, 10).Value = .Maxwert
    Worksheets(1).Cells(RowPos, 11).Value = .Messwert
    Worksheets(1).Cells(RowPos, 12).Value = .Einheit
    Worksheets(1).Cells(RowPos, 13).Value = .Gw
    Worksheets(1).Cells(RowPos, 14).Value = .Datum
End With
End Sub

и вызывал бы её так
FillFields(RowPos, Laborwert)

а если Laborwert обект твоего класса, то добавил бы туда функциональность для цикла, наподобии метода Item у коллекций, тогда можно переделать ещё проще:
Код: Выделить всё
Sub FillFields(RowPos As Long, Laborwert As Тип)
Dim i As Long
For i = 0 To 9
    Worksheets(1).Cells(RowPos, i + 4).Value = Laborwert.Item(i)
Next i
End Sub
Водки я вам не обещаю, но погуляем хорошо.
И. Сусанин.

Аватара (с) Тёмыч

abracadabra
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 80
Зарегистрирован: 30.11.2004 (Вт) 17:36
Откуда: Lviv Ukraine

Сообщение abracadabra » 14.07.2006 (Пт) 11:03

На Call FillFields(RowPos, Laborwert)
говорит "Несоответствие аргумента ByRef"
Крокодил, крокодю и буду крокодить!

Igor_123
Осторожный Баянист
Осторожный Баянист
Аватара пользователя
 
Сообщения: 1325
Зарегистрирован: 21.07.2004 (Ср) 13:00
Откуда: Днепропетровск

Сообщение Igor_123 » 14.07.2006 (Пт) 11:21

как выглядит объявление процедуры FillFields, т.е. эта строка:
Sub FillFields(RowPos As Long, Laborwert As Тип)
и вообще может сделаешь аттач с кодом по которому можно будет сказать что-то конкретнее
Водки я вам не обещаю, но погуляем хорошо.
И. Сусанин.

Аватара (с) Тёмыч

abracadabra
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 80
Зарегистрирован: 30.11.2004 (Вт) 17:36
Откуда: Lviv Ukraine

Сообщение abracadabra » 14.07.2006 (Пт) 11:38

Уже не выскакивает сообщение "слишком большая процедура" после того, как я поменял свою конструкцию With на твою. Премного благодарен.
Но вызов функции с With не идёт.
в аттаче - код процедуры, переменные, объявленные вначале(а и т.д.) - это вместо ини-файла, с которым мне не удалось связать процедуру.
Вложения
code.zip
(1.83 Кб) Скачиваний: 70
Крокодил, крокодю и буду крокодить!

Igor_123
Осторожный Баянист
Осторожный Баянист
Аватара пользователя
 
Сообщения: 1325
Зарегистрирован: 21.07.2004 (Ср) 13:00
Откуда: Днепропетровск

Сообщение Igor_123 » 14.07.2006 (Пт) 12:09

кто такой Laborwert и почему у тебя этот код повторяеться так много раз???

Код: Выделить всё
       If Laborwert.Parametername = b1 Then
            With Laborwert
                Worksheets(1).Cells(RowPos, 4).Value = .Parametername
                ...
                Worksheets(1).Cells(RowPos, 13).Value = .Gw
                Worksheets(1).Cells(RowPos, 14).Value = .Datum
            End With
        End If
   
        RowPos = RowPos + 1
   
        If Laborwert.Parametername = b2 Then
            With Laborwert
                Worksheets(1).Cells(RowPos, 4).Value = .Parametername
                ...
                Worksheets(1).Cells(RowPos, 14).Value = .Datum
            End With
        End If
   
        RowPos = RowPos + 1
   
        If Laborwert.Parametername = b3 Then
            With Laborwert
                Worksheets(1).Cells(RowPos, 4).Value = .Parametername
                ...
                Worksheets(1).Cells(RowPos, 14).Value = .Datum
            End With
        End If


Может ли Laborwert.Parametername возвращать значения не предусмотренные всеми условиями, которые есть в коде???
Водки я вам не обещаю, но погуляем хорошо.
И. Сусанин.

Аватара (с) Тёмыч

Nicky
Постоялец
Постоялец
 
Сообщения: 519
Зарегистрирован: 12.08.2004 (Чт) 12:14

Сообщение Nicky » 14.07.2006 (Пт) 12:21

Предлагаю поправить в консерватории

Igor_123
Осторожный Баянист
Осторожный Баянист
Аватара пользователя
 
Сообщения: 1325
Зарегистрирован: 21.07.2004 (Ср) 13:00
Откуда: Днепропетровск

Сообщение Igor_123 » 14.07.2006 (Пт) 14:27

Предлагаю изменить так, если Laborwert.Parametername не возвращает значения не предусмотренные всеми условиями, которые есть в коде:
Код: Выделить всё
Dim DataAl As Object

Sub Patient()

    On Error Resume Next
    Dim i As Integer
    Dim Patient As Patient
    Dim Laborwert As Laborwert
    Dim Labordaten As Laborwerte
    Dim RowPos As Long
   
    Set DataAl = CreateObject("DataAL.Application")
    Set Patient = DataAl.Patient
    Set Labordaten = DataAl.Laborwerte
    'Если не созданы объекты, то и делать нечего. Можно вывести сообщение об этом
    If DataAl Is Nothing Or Patient Is Nothing Or Labordaten Is Nothing Then
        MsgBox "Не созданы объекты DataAL.Application"
        Exit Sub
    End If
   
    Patient.PatNr = InputPatNr()
    If (Patient.read() = 0) Then
        MsgBox ("Patient nicht gefunden")
    Else
        Worksheets(1).Range("E6").Value = "Patient:"
        Worksheets(1).Range("G6").Value = Patient.Vorname
        Worksheets(1).Range("H6").Value = Patient.Name
        Worksheets(1).Range("I6").Value = "geb. am"
        Worksheets(1).Range("J6").Value = Patient.Geburtsdatum
        PatNummer& = Patient.PatNr
        BesuchDatum = LetzterBesuch(PatNummer&)
        LabSelection = "PatNr=" + Str(PatNummer&)
       
        If BesuchDatum <> "" Then
            LabSelection = LabSelection + ";Datum>=" + BesuchDatum
        End If
        If Labordaten.Open(LabSelection) Then
            MsgBox ("Selektionsfehler")
        Else
            Worksheets(1).Select
            RowPos = 9
            Cells(8, 4).Value = "HAMATOLOGIE" 'a
            For Each Laborwert In Labordaten
                If Laborwert.Geraet = "" Then
                    ' Не понятно назначение этого цикла. По идее он должен перебирать каждый параметр
                    ' а он просто записывает одни и те-же данные столько раз, столько есть Parameter у объекта Laborwert
                    'For i = 1 To Laborwert.Parameter.count
                        ' следующая строка пишеться одно и то-же значениепри каждой итерации цикла
                        'Worksheets(1).Range(Cells(8, 4), Cells(8, 4)).Value = "HAMATOLOGIE" 'a
                        'RowPos = 9 ' а то здесь будет происходить перетирание данных из предыдущего Laborwert
                    With Laborwert
                        Cells(RowPos, 4).Value = .Parametername
                        Cells(RowPos, 5).Value = .Zeit
                        Cells(RowPos, 6).Value = .Datum
                        Cells(RowPos, 7).Value = .Ergebnistext
                        Cells(RowPos, 8).Value = .Normalwert
                        Cells(RowPos, 9).Value = .Minwert
                        Cells(RowPos, 10).Value = .Maxwert
                        Cells(RowPos, 11).Value = .Messwert
                        Cells(RowPos, 12).Value = .Einheit
                        Cells(RowPos, 13).Value = .Gw
                        Cells(RowPos, 14).Value = .Datum
                    End With
                    RowPos = RowPos + 1
                    'Next i
                End If
            Next Laborwert
            Labordaten.Close
        End If
    End If
    Set Labordaten = Nothing
    Set Patient = Nothing
    Set DataAl = Nothing
End Sub
Водки я вам не обещаю, но погуляем хорошо.
И. Сусанин.

Аватара (с) Тёмыч

abracadabra
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 80
Зарегистрирован: 30.11.2004 (Вт) 17:36
Откуда: Lviv Ukraine

Сообщение abracadabra » 17.07.2006 (Пн) 11:25

Laborwert - объект, в котором содержатся лабораторные данные про пациента (в базе данных другой программы).
Задача такая - есть сгруппированные параметры - группа HAMATOLOGIE
и в ней параметры и др группы, нужно поочерёдно прощёлкать в Laborwert каждый параметр и если есть - записать, если нет, то следующий по очереди.
Получается Лабораторный лист в Екселе, на котором по группам поочерёдно параметры.
Суть не просто вытащить параметры, записанные в другой программе, а вывести их по шаблону.
Крокодил, крокодю и буду крокодить!

Igor_123
Осторожный Баянист
Осторожный Баянист
Аватара пользователя
 
Сообщения: 1325
Зарегистрирован: 21.07.2004 (Ср) 13:00
Откуда: Днепропетровск

Сообщение Igor_123 » 17.07.2006 (Пн) 11:46

Можно вывести, а потом отсортировать. В сортировке можно по трем полям задавать порядок сортировки. Так может эфективнее будет.
Предложенная мной процедура вываливает все данные в порядке следования Laborwert, а потом отсортировать уже по столбцам.

Если можно хотелось посмотреть кусочек данных после предложенной мной процедуры и как должно быть по итогу работы.
Водки я вам не обещаю, но погуляем хорошо.
И. Сусанин.

Аватара (с) Тёмыч

abracadabra
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 80
Зарегистрирован: 30.11.2004 (Вт) 17:36
Откуда: Lviv Ukraine

Сообщение abracadabra » 17.07.2006 (Пн) 13:11

а как отсортировать по столбцам?

что значит кусочек кода и итог?
Крокодил, крокодю и буду крокодить!

Igor_123
Осторожный Баянист
Осторожный Баянист
Аватара пользователя
 
Сообщения: 1325
Зарегистрирован: 21.07.2004 (Ср) 13:00
Откуда: Днепропетровск

Сообщение Igor_123 » 17.07.2006 (Пн) 13:24

выделяешь диапазон данных для сортировки и идешь в меню Данные->Сортировка. Показываеться диалог в котором выбираешь по каким столбцам сортировать и в каком порядке.

после работы процедуры получаеться заполненный лист екселя. Вот Оставь в нем строк 50 данных, скопируй на другой лист и на другом листе переставь их так как нужно. и вышли
Водки я вам не обещаю, но погуляем хорошо.
И. Сусанин.

Аватара (с) Тёмыч

abracadabra
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 80
Зарегистрирован: 30.11.2004 (Вт) 17:36
Откуда: Lviv Ukraine

Сообщение abracadabra » 17.07.2006 (Пн) 14:42

у меня в программе щас токо 4 параметра,
в аттаче файл - на листе 1 - все подряд, а на листе 2 - такие, приблизительно, как должны быть.
Вложения
test.xls
(27.5 Кб) Скачиваний: 66
Крокодил, крокодю и буду крокодить!


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 49

    TopList