• Industries
  • Products
  • Buy
  • Services & Support
  • Communities
  • Visual Basic Customization

    Reply
    Active Contributor
    lanieuwe
    Posts: 40
    Registered: ‎10-26-2011
    Accepted Solution

    For next slow why?

    222 Views, 6 Replies
    12-22-2012 10:28 AM

    Why is the for next so slow?

     

    I have a form with combobox filled up with 40 layers. The layers are from the layermanager.

    The form has a command button too.

    When I run this code. It's very slow to lock all layers.

    Is there a solution for that?

    Private Sub CommandButton1_Click()
    On Error Resume Next    'handle exceptions inline
    Dim objlayer As AcadLayer
    
    'make the layer selected in the combobox current
    ThisDrawing.ActiveLayer = ThisDrawing.Layers.Item(ComboBox1.Text)
    For Each objlayer In ThisDrawing.Layers
        objlayer.LayerOn = False    'turn off all the layers
    Next objlayer
    Set objlayer = ThisDrawing.Layers.Item(ComboBox1.Text)
    If objlayer Is Nothing Then
        MsgBox "layer does not exist"
        Exit Sub    'exit if layer not found
    End If
    
    objlayer.LayerOn = True 'turn on the desired layer
    End Sub
    
    Private Sub UserForm_Initialize()
     Dim layerColl As AcadLayers
     Dim objlayer As AcadLayer
    
    
      'fill combobox
     Set layerColl = ThisDrawing.Layers
     For Each objlayer In layerColl
        ComboBox1.AddItem objlayer.Name
     Next
     End Sub

     gr. Laszlo

     

     

    Please use plain text.
    *Expert Elite*
    Hallex
    Posts: 1,337
    Registered: ‎10-08-2008

    Re: For next slow why?

    12-24-2012 02:03 PM in reply to: lanieuwe
    I repeat again, definelayer collection once then iterate through it, eg.: Option Explicit Private Sub CommandButton1_Click() On Error Resume Next 'handle exceptions inline Dim objlayers As AcadLayers Dim objlayer As AcadLayer Set objlayers = ThisDrawing.Layers 'make the layer selected in the combobox current ThisDrawing.ActiveLayer = objlayers.Item(ComboBox1.Text) For Each objlayer In objlayers objlayer.LayerOn = False 'turn off all the layers Next objlayer Set objlayer = objlayers.Item(ComboBox1.Text) If objlayer Is Nothing Then MsgBox "layer does not exist" Exit Sub 'exit if layer not found End If objlayer.LayerOn = True 'turn on the desired layer MsgBox "Done" End Sub Private Sub UserForm_Initialize() Dim layerColl As AcadLayers Dim objlayer As AcadLayer 'fill combobox Set layerColl = ThisDrawing.Layers For Each objlayer In layerColl ComboBox1.AddItem objlayer.Name Next End Sub
    _____________________________________
    C6309D9E0751D165D0934D0621DFF27919
    Please use plain text.
    Active Contributor
    lanieuwe
    Posts: 40
    Registered: ‎10-26-2011

    Re: For next slow why?

    12-24-2012 11:28 PM in reply to: Hallex

    Thank you Hallex for patient.

    Its still slow but maybe an other way than you mean.

    The problem is the for...next:

    For Each objlayer In objlayers
    objlayer.Lock = True 'lock all the layers
    Next objlayer. 

    I have 40 layers.

    Maybe I have to use the sendcommand  method for that?

    ps. I changed "turn off" in "lock = true" too:smileyhappy:

    Have a nice christmas!

     

    Option Explicit
    Private Sub CommandButton1_Click()
    
    On Error Resume Next 'handle exceptions inline
    Dim objlayers As AcadLayers
    Dim objlayer As AcadLayer
    Set objlayers = ThisDrawing.Layers 'make the layer selected in the combobox current
    ThisDrawing.ActiveLayer = objlayers.Item(ComboBox1.Text)
    For Each objlayer In objlayers
    objlayer.Lock = True 'lock all the layers
    Next objlayer
    Set objlayer = objlayers.Item(ComboBox1.Text)
    If objlayer Is Nothing Then
    MsgBox "layer does not exist"
    Exit Sub 'exit if layer not found
    End If
    
    objlayer.Lock = False 'unlock the desired layer MsgBox "Done"
    End Sub
    
    Private Sub UserForm_Initialize()
    
    Dim layerColl As AcadLayers
    Dim objlayer As AcadLayer
    'fill combobox
    
    Set layerColl = ThisDrawing.Layers
    
    For Each objlayer In layerColl
    ComboBox1.AddItem objlayer.Name
    Next
    End Sub

     

    Please use plain text.
    *Expert Elite*
    Hallex
    Posts: 1,337
    Registered: ‎10-08-2008

    Re: For next slow why?

    12-24-2012 11:51 PM in reply to: lanieuwe
    Hi gr. Laszlo, I tested my code on drawing with about 125 layers for the test seems it's working very fast (something like less then 0.5 second) No problem if your code with SendCommand will do your job though Happy Holydays, ~'J'~
    _____________________________________
    C6309D9E0751D165D0934D0621DFF27919
    Please use plain text.
    Moderator
    Alexander.Rivilis
    Posts: 1,168
    Registered: ‎04-09-2008

    Re: For next slow why?

    12-28-2012 02:01 AM in reply to: lanieuwe

    Are you using AutoCAD x64?

    64 Bit VBA Performance Issue


    Пожалуйста не забывайте про Утвердить в качестве решения!Утвердить в качестве решения и Give Kudos!Баллы
    Please remember to Accept Solution!Accept as Solution and Give Kudos!Kudos

    Please use plain text.
    Active Contributor
    lanieuwe
    Posts: 40
    Registered: ‎10-26-2011

    Re: For next slow why?

    12-28-2012 12:00 PM in reply to: lanieuwe

    Yes I do.....

    ???

    Please use plain text.
    Moderator
    Alexander.Rivilis
    Posts: 1,168
    Registered: ‎04-09-2008

    Re: For next slow why?

    12-28-2012 12:24 PM in reply to: lanieuwe

    lanieuwe wrote:

    Yes I do.....

    ???


    Then read: http://adndevblog.typepad.com/autocad/2012/05/64-bit-vba-performance-issue.html


    Пожалуйста не забывайте про Утвердить в качестве решения!Утвердить в качестве решения и Give Kudos!Баллы
    Please remember to Accept Solution!Accept as Solution and Give Kudos!Kudos

    Please use plain text.