Avatar billede jih Nybegynder
24. februar 2009 - 11:08 Der er 6 kommentarer og
1 løsning

optimering og rettelse af MSVBA kode

Hej,

jeg har en msvba (microstation vba) kode på 256 linjer, som jeg har brug for hjælp med. Jeg har aldrig arbejdet med det før, og alligevel er det let at forstå. Sproget er præcis det samme som VB, men der er nogle ekstra indbyggede funktioner og objekter, som jeg tager brug af.

Jeg har brug for en eller anden at hjælpe mig lidt med denne kode. Jeg vil ikke skrive hele koden ind her, men hvis der evt. er nogen der vil hjælpe via msn, ville det være super! Kan også gøres via mail.

Koden gør næsten det jeg vil have den til, men der er små mystiske fejl. Og så kører den meget langsomt. Jeg vil forklare koden grundigt igennem til den der vil hjælpe mig via mail / msn..

På forhånd tak,

// jih
Avatar billede supertekst Ekspert
24. februar 2009 - 17:49 #1
Avatar billede jih Nybegynder
26. februar 2009 - 10:33 #2
ja, jeg kender til det. Jeg har læst alle tænkelige manualer om MSVBA, der sker dog mystiske fejl. Jeg tror nu mest det er pga. Visual Basic fejl, ikke MicroStation relaterede funktioner. Nested For Loops og lignende.
Avatar billede supertekst Ekspert
26. februar 2009 - 12:44 #3
Nu kan jo prøve at vise koden..
Avatar billede jih Nybegynder
27. februar 2009 - 09:12 #4
det kunne jeg jo egentligt godt.. synes bare det er lidt svært at forklare her, uden "live" kommunikation fra begge sider..

koden er her:

Public IsKloakk3DActiveFile As Boolean

Private Sub CheckIfKloakk3DIsActiveFile()
    Dim filename As String
   
    filename = ActiveDesignFile.Name
   
    If Right(filename, 4) = ".klo" Then
        IsKloakk3DActiveFile = True
    Else
        IsKloakk3DActiveFile = False
    End If
End Sub

Public Function IsKloakk3DAttached()
    Dim noa, nok, nol(500) As Integer
    Dim reffilename As String
    Dim intI, intJ As Integer
    nok = 0
    noa = ActiveModelReference.Attachments.Count
    intJ = 1
   
    If noa = 0 Then
        CadInputQueue.SendKeyin ("ddhmapman execute klo_ATT")
        For intI = 1 To ActiveModelReference.Attachments.Count
            If (Right(ActiveModelReference.Attachments(intI).DesignFile.Name, 4) = ".klo") Then
                nok = nok + 1
            End If
        Next intI
        For intI = 1 To nok
            nol(intI) = ActiveModelReference.Attachments(intI).Levels.Count
            MsgBox nol(intI)
        Next intI
        For intI = 1 To nok
            For a = 1 To nol(intI)
                ActiveModelReference.Attachments(intI).Levels(a).IsDisplayedInView(ActiveDesignFile.Views(1)) = False
            Next a
        Next intI
        Exit Function
    Else
        For a = 1 To noa
            reffilename = ActiveModelReference.Attachments(a).DesignFile.Name
            If Right(reffilename, 4) = ".klo" Then
                nok = nok + 1
            End If
        Next a
       
        CadInputQueue.SendCommand ("ddhmapman execute klo_ATT")
       
        noa = ActiveModelReference.Attachments.Count
       
        For a = 1 To noa
            reffilename = ActiveModelReference.Attachments(a).DesignFile.Name
            If Right(reffilename, 4) = ".klo" Then
                nok = nok + 1
            End If
        Next a
       
        'For intI = 1 To nok
            'nol(intI) = ActiveModelReference.Attachments(intI).Levels.Count
            'For a = 1 To nol(intI)
                'ActiveModelReference.Attachments(intI).Levels(a).IsDisplayedInView(ActiveDesignFile.Views(1)) = False
            'Next a
        'Next intI
    End If
End Function
Public Sub AlterLevelsKloakk3D(ByVal OnOrOff As Boolean, ByVal Tema As String)
   
    Dim Thing(500)
    Dim noa, nok As Integer
    noa = ActiveModelReference.Attachments.Count
    nok = 0
    intJ = 1
    For a = 1 To noa
        If (Right(ActiveModelReference.Attachments(a).DesignFile.Name, 4) = ".klo") Then
            nok = nok + 1
        End If
    Next a
    CheckIfKloakk3DIsActiveFile
   
    If Not IsKloakk3DActiveFile Then
        IsKloakk3DAttached
    End If
   
    If IsKloakk3DActiveFile Then
        Set intJ = Nothing
        Set Thing(1) = ActiveDesignFile
    Else
        noa = ActiveModelReference.Attachments.Count
        For intI = 1 To noa
            If (Right(ActiveModelReference.Attachments(intI).DesignFile.Name, 4) = ".klo") Then
                Set Thing(intJ) = ActiveModelReference.Attachments(intI)
                intJ = intJ + 1
            End If
        Next intI
    End If
    intJ = 1
    For intI = 1 To nok
   
        Select Case Tema
            Case "SlokkAlt":
                For a = 1 To Thing(intJ).Levels.Count
                    Thing(intJ).Levels(a).IsDisplayedInView(ActiveDesignFile.Views(1)) = OnOrOff
                Next a
            Case "skittvatnsleiding":
                For a = 1 To Thing(intJ).Levels.Count
                    If (InStr(1, Thing(intJ).Levels(a).Name, "ledn spildevand", vbBinaryCompare)) Then
                        Thing(intJ).Levels("ledn spildevand").IsDisplayedInView(ActiveDesignFile.Views(1)) = OnOrOff
                    ElseIf (InStr(1, Thing(intJ).Levels(a).Name, "ledn spildevand tryk", vbBinaryCompare)) Then
                        Thing(intJ).Levels("ledn spildevand tryk").IsDisplayedInView(ActiveDesignFile.Views(1)) = OnOrOff
                    ElseIf (InStr(1, Thing(intJ).Levels(a).Name, "stik spildevand", vbBinaryCompare)) Then
                        Thing(intJ).Levels("stik spildevand").IsDisplayedInView(ActiveDesignFile.Views(1)) = OnOrOff
                    End If
                Next a
            Case "skittvatnsleidingTekst":
                For a = 1 To Thing(intJ).Levels.Count
                    If (InStr(1, Thing(intJ).Levels(a).Name, "ledn-txt spildevand", vbBinaryCompare)) Then
                        Thing(intJ).Levels("ledn-txt spildevand").IsDisplayedInView(ActiveDesignFile.Views(1)) = OnOrOff
                    End If
                Next a
            Case "regnvatnsleiding":
                For a = 1 To Thing(intJ).Levels.Count
                    If (InStr(1, Thing(intJ).Levels(a).Name, "ledn regnvand", vbBinaryCompare)) Then
                        Thing(intJ).Levels("ledn regnvand").IsDisplayedInView(ActiveDesignFile.Views(1)) = OnOrOff
                    ElseIf (InStr(1, Thing(intJ).Levels(a).Name, "stik regnvand", vbBinaryCompare)) Then
                        Thing(intJ).Levels("stik regnvand").IsDisplayedInView(ActiveDesignFile.Views(1)) = OnOrOff
                    ElseIf (InStr(1, Thing(intJ).Levels(a).Name, "ledn vandløb", vbBinaryCompare)) Then
                        Thing(intJ).Levels("ledn vandløb").IsDisplayedInView(ActiveDesignFile.Views(1)) = OnOrOff
                    ElseIf (InStr(1, Thing(intJ).Levels(a).Name, "ledn drænvand", vbBinaryCompare)) Then
                        Thing(intJ).Levels("ledn drænvand").IsDisplayedInView(ActiveDesignFile.Views(1)) = OnOrOff
                    ElseIf (InStr(1, Thing(intJ).Levels(a).Name, "stik drænvand", vbBinaryCompare)) Then
                        Thing(intJ).Levels("stik drænvand").IsDisplayedInView(ActiveDesignFile.Views(1)) = OnOrOff
                    End If
                Next a
            Case "regnvatnsleidingTekst":
                For a = 1 To Thing(intJ).Levels.Count
                    If (InStr(1, Thing(intJ).Levels(a).Name, "ledn-txt regnvand", vbBinaryCompare)) Then
                        Thing(intJ).Levels("ledn-txt regnvand").IsDisplayedInView(ActiveDesignFile.Views(1)) = OnOrOff
                    ElseIf (InStr(1, Thing(intJ).Levels(a).Name, "ledn-txt drænvand", vbBinaryCompare)) Then
                        Thing(intJ).Levels("ledn-txt drænvand").IsDisplayedInView(ActiveDesignFile.Views(1)) = OnOrOff
                    End If
                Next a
            Case "felagsleiding":
                For a = 1 To Thing(intJ).Levels.Count
                    If (InStr(1, Thing(intJ).Levels(a).Name, "ledn fælles", vbBinaryCompare)) Then
                        Thing(intJ).Levels("ledn fælles").IsDisplayedInView(ActiveDesignFile.Views(1)) = OnOrOff
                    ElseIf (InStr(1, Thing(intJ).Levels(a).Name, "ledn fælles tryk", vbBinaryCompare)) Then
                        Thing(intJ).Levels("ledn fælles tryk").IsDisplayedInView(ActiveDesignFile.Views(1)) = OnOrOff
                    ElseIf (InStr(1, Thing(intJ).Levels(a).Name, "stik fælles", vbBinaryCompare)) Then
                        Thing(intJ).Levels("stik fælles").IsDisplayedInView(ActiveDesignFile.Views(1)) = OnOrOff
                    End If
                Next a
            Case "felagsleidingTekst":
                For a = 1 To Thing(intJ).Levels.Count
                    If (InStr(1, Thing(intJ).Levels(a).Name, "ledn-txt fælles", vbBinaryCompare)) Then
                        Thing(intJ).Levels("ledn-txt fælles").IsDisplayedInView(ActiveDesignFile.Views(1)) = OnOrOff
                    End If
                Next a
            Case "skittvatnslutir":
                For a = 1 To Thing(intJ).Levels.Count
                    If InStr(1, Thing(intJ).Levels(a).Name, "kn ", vbBinaryCompare) Then
                        If InStr(1, Thing(intJ).Levels(a).Name, "spild", vbBinaryCompare) Then
                            Thing(intJ).Levels(a).IsDisplayedInView(ActiveDesignFile.Views(1)) = OnOrOff
                        ElseIf InStr(1, Thing(intJ).Levels(a).Name, "hustank", vbBinaryCompare) Then
                            Thing(intJ).Levels(a).IsDisplayedInView(ActiveDesignFile.Views(1)) = OnOrOff
                        ElseIf InStr(1, Thing(intJ).Levels(a).Name, "renseanlæg", vbBinaryCompare) Then
                            Thing(intJ).Levels(a).IsDisplayedInView(ActiveDesignFile.Views(1)) = OnOrOff
                        ElseIf InStr(1, Thing(intJ).Levels(a).Name, "udledning t jord", vbBinaryCompare) Then
                            Thing(intJ).Levels(a).IsDisplayedInView(ActiveDesignFile.Views(1)) = OnOrOff
                        End If
                    End If
                Next a
            Case "skittvatnslutirTekst":
                For a = 1 To Thing(intJ).Levels.Count
                    If InStr(1, Thing(intJ).Levels(a).Name, "kn-txt", vbBinaryCompare) Then
                        If InStr(1, Thing(intJ).Levels(a).Name, "spild", vbBinaryCompare) Then
                            Thing(intJ).Levels(a).IsDisplayedInView(ActiveDesignFile.Views(1)) = OnOrOff
                        End If
                    End If
                Next a
            Case "regnvatnslutir":
                For a = 1 To Thing(intJ).Levels.Count
                    If InStr(1, Thing(intJ).Levels(a).Name, "kn ", vbBinaryCompare) Then
                        If InStr(1, Thing(intJ).Levels(a).Name, "regn", vbBinaryCompare) Then
                            Thing(intJ).Levels(a).IsDisplayedInView(ActiveDesignFile.Views(1)) = OnOrOff
                        ElseIf InStr(1, Thing(intJ).Levels(a).Name, "drænvand", vbBinaryCompare) Then
                            Thing(intJ).Levels(a).IsDisplayedInView(ActiveDesignFile.Views(1)) = OnOrOff
                        End If
                    End If
                Next a
            Case "regnvatnslutirTekst":
                For a = 1 To Thing(intJ).Levels.Count
                    If InStr(1, Thing(intJ).Levels(a).Name, "kn-txt", vbBinaryCompare) Then
                        If InStr(1, Thing(intJ).Levels(a).Name, "regn", vbBinaryCompare) Then
                            Thing(intJ).Levels(a).IsDisplayedInView(ActiveDesignFile.Views(1)) = OnOrOff
                        ElseIf InStr(1, Thing(intJ).Levels(a).Name, "dræn", vbBinaryCompare) Then
                            Thing(intJ).Levels(a).IsDisplayedInView(ActiveDesignFile.Views(1)) = OnOrOff
                        End If
                    End If
                Next a
            Case "felagslutir":
                For a = 1 To Thing(intJ).Levels.Count
                    If InStr(1, Thing(intJ).Levels(a).Name, "kn ", vbBinaryCompare) Then
                        If InStr(1, Thing(intJ).Levels(a).Name, "fælles", vbBinaryCompare) Then
                            Thing(intJ).Levels(a).IsDisplayedInView(ActiveDesignFile.Views(1)) = OnOrOff
                        ElseIf InStr(1, Thing(intJ).Levels(a).Name, "samletank", vbBinaryCompare) Then
                            Thing(intJ).Levels(a).IsDisplayedInView(ActiveDesignFile.Views(1)) = OnOrOff
                        End If
                    End If
                Next a
            Case "felagslutirTekst":
                For a = 1 To Thing(intJ).Levels.Count
                    If InStr(1, Thing(intJ).Levels(a).Name, "kn-txt", vbBinaryCompare) Then
                        If InStr(1, Thing(intJ).Levels(a).Name, "fælles", vbBinaryCompare) Then
                            Thing(intJ).Levels(a).IsDisplayedInView(ActiveDesignFile.Views(1)) = OnOrOff
                        End If
                    End If
                Next a
            Case "annadnedlagt"
                For a = 1 To Thing(intJ).Levels.Count
                    If InStr(1, Thing(intJ).Levels(a).Name, "ledn Nedlagt-død", vbBinaryCompare) Then
                        Thing(intJ).Levels("ledn Nedlagt-død").IsDisplayedInView(ActiveDesignFile.Views(1)) = OnOrOff
                    ElseIf InStr(1, Thing(intJ).Levels(a).Name, "stik nedlagt", vbBinaryCompare) Then
                        Thing(intJ).Levels("stik nedlagt").IsDisplayedInView(ActiveDesignFile.Views(1)) = OnOrOff
                    ElseIf InStr(1, Thing(intJ).Levels(a).Name, "kn Nedlagt brønd spildevand", vbBinaryCompare) Then
                        Thing(intJ).Levels("kn Nedlagt brønd spildevand").IsDisplayedInView(ActiveDesignFile.Views(1)) = OnOrOff
                    End If
                Next a
            Case "annadTekstoglutir"
                For a = 1 To Thing(intJ).Levels.Count
                    If InStr(1, Thing(intJ).Levels(a).Name, "kn-txt", vbBinaryCompare) Then
                        If (InStr(1, Thing(intJ).Levels(a).Name, "andet", vbBinaryCompare)) Or _
                          (InStr(1, Thing(intJ).Levels(a).Name, "drænvand", vbBinaryCompare)) Then
                            Thing(intJ).Levels(a).IsDisplayedInView(ActiveDesignFile.Views(1)) = OnOrOff
                        End If
                    ElseIf InStr(1, Thing(intJ).Levels(a).Name, "ledn-txt", vbBinaryCompare) Then
                        If (InStr(1, Thing(intJ).Levels(a).Name, "drænvand", vbBinaryCompare)) Then
                            Thing(intJ).Levels(a).IsDisplayedInView(ActiveDesignFile.Views(1)) = OnOrOff
                        End If
                    ElseIf InStr(1, Thing(intJ).Levels(a).Name, "Nedlagt", vbBinaryCompare) Then
                        Thing(intJ).Levels(a).IsDisplayedInView(ActiveDesignFile.Views(1)) = OnOrOff
                    ElseIf InStr(1, Thing(intJ).Levels(a).Name, "kn punkt", vbBinaryCompare) Then
                        Thing(intJ).Levels(a).IsDisplayedInView(ActiveDesignFile.Views(1)) = OnOrOff
                    ElseIf InStr(1, Thing(intJ).Levels(a).Name, "kn brønd andet", vbBinaryCompare) Then
                        Thing(intJ).Levels(a).IsDisplayedInView(ActiveDesignFile.Views(1)) = OnOrOff
                    ElseIf InStr(1, Thing(intJ).Levels(a).Name, "Ivamál", vbBinaryCompare) Then
                        Thing(intJ).Levels(a).IsDisplayedInView(ActiveDesignFile.Views(1)) = OnOrOff
                    ElseIf InStr(1, Thing(intJ).Levels(a).Name, "_MA_KANNAST_", vbBinaryCompare) Then
                        Thing(intJ).Levels(a).IsDisplayedInView(ActiveDesignFile.Views(1)) = OnOrOff
                    End If
                Next a
        End Select
        intJ = intJ + 1
    Next intI
End Sub

Mit problem er at jeg vil have koden at virke for alle "*.klo" filer som er ude - uden at arbejde alt for langsomt.. den virker som den skal, bortset fra at den er alt for langsom og når jeg slukker for en level, tændes alle andre levels. så jeg kan ikke slukke for alle på noget tidspunkt, siden det virker som om at når en level slukkes, kalder den en kode et eller andet sted fra (hvor??) som tænder alle levels..

den udkommenterede del:
-
        'For intI = 1 To nok
            'nol(intI) = ActiveModelReference.Attachments(intI).Levels.Count
            'For a = 1 To nol(intI)
                'ActiveModelReference.Attachments(intI).Levels(a).IsDisplayedInView(ActiveDesignFile.Views(1)) = False
            'Next a
        'Next intI
-
vil jeg egentligt også gerne have at virke, men hvis jeg prøver at fjerne kommentarene, giver den fejl i linjen:
nol(intI) = ActiveModelReference.Attachments(intI).Levels.Count
(selv om den linje virker fint alle andre steder i koden)
Avatar billede supertekst Ekspert
27. februar 2009 - 09:22 #5
Ja det kan du have ret i - men nu kan andre måske være behjælpelige...
Avatar billede jih Nybegynder
27. februar 2009 - 09:24 #6
skal nok lige nævne at jeg går ud fra at det med at levels tænder hver gang jeg slukker for en level kan fikses ved at fjerne kommentarene (og få det til at virke alligevel) ved den udkommenterede del. det ville jeg mene skulle være relativt nemt for eksperterne her. ;-)

Ellers ville det større stykke arbejde være at optimere koden sådan at den ikke bruger ~1 min hver gang jeg vælger at tænde/slukke for levels.
Avatar billede jih Nybegynder
09. marts 2009 - 09:17 #7
lukker..
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester