if-then-else w/timer

4:06 AM 3/10/2019                            Help Please
Anyone who knows the more complex VBA ?

When I close a file, I have several things I have to do, they are now all done by the VBA. I was able to
figure out. This Timer and the If-then-else seem to be way above my ability.
I now have to remember to detach reference files before sending them in, but when I open and close the .dgn file while making
changes I do not want to detach the reference then. Only upon completion of the .dgn. when I close for the last time
before sending in my work.
This is the simple Macro that detaches the reference file:
Sub XrefDet() 'the () is the ( and ) but it looks funny
' 031019 - Detach Reference file
CadInputQueue.SendCommand "Reference Detach All"

End Sub

So I wanted to have an If-then-else that would time out in say 4-8seconds and it would equal a no
or a strike say space bar and it = no, but you could put Y if you wanted it to detach. I am attaching the
timer from the help file. I could not get to work myself, but this is it.

This example uses the Timer function to pause the application. The example also uses DoEvents to yield to other processes during the pause.

Dim PauseTime, Start, Finish, TotalTime
If (MsgBox("Press Yes to pause for 5 seconds", 4)) = vbYes Then
PauseTime = 5 ' Set duration.
Start = Timer ' Set start time.
Do While Timer < Start + PauseTime
DoEvents ' Yield to other processes.
Loop
Finish = Timer ' Set end time.
TotalTime = Finish - Start ' Calculate total time.
MsgBox "Paused for " & TotalTime & " seconds"
Else
End
End If

I also looked up the if-then-else and it is also attached.
This example shows both the block and single-line forms of the If...Then...Else statement. It also illustrates the use of If TypeOf...Then...Else.

Dim Number, Digits, MyString
Number = 53 ' Initialize variable.
If Number < 10 Then
Digits = 1
ElseIf Number < 100 Then
' Condition evaluates to True so the next statement is executed.
Digits = 2
Else
Digits = 3
End If

' Assign a value using the single-line form of syntax.
If Digits = 1 Then MyString = "One" Else MyString = "More than one"

Use If TypeOf construct to determine whether the Control passed into a procedure is a text box.

Sub ControlProcessor(MyControl As Control)
If TypeOf MyControl Is CommandButton Then
Debug.Print "You passed in a " & TypeName(MyControl)
ElseIf TypeOf MyControl Is CheckBox Then
Debug.Print "You passed in a " & TypeName(MyControl)
ElseIf TypeOf MyControl Is TextBox Then
Debug.Print "You passed in a " & TypeName(MyControl)
End If
End Sub

These are beyond my ability to under stand, I have tried on my own and spent a number of hours trying to
get something even simple and than build from there. Any Help ? All I can say is thank you and
offer some money for the help.

  • I do not know what is contained in your Autorun.mvba but the answer is yes any code you wish to run when opening a file can be copied into the MVBA file which is giving you the option for detaching references. I do not have an AutoRun.mvba in my VBA Project Manager though I have seen it in images before but I don't know it its a supplied Bentley file or not.

  • I was given a link to it in Bentley, but I believe If I can figure how to put something in yours that runs when I open a .dgn

    I will just rename it AutoRun.MVBA after I am sure how to put the commands in it. I am going to attach the code I added to the Autorun and perhaps you can tell me where to place it in your program file. I sure do appreciate it and it works perfect. I can press Y or N I can click on OK or cancel and it does what I was so wanting to learn. At 74 running out of time to learn alot mind is going faster that I want ((((c;

    this is the section I put the command in or code that Jon Summers put me in the right direction. I have modules inside my RJBP.MVBA Module 6 is the files I wanted run at opening and they all tested and worked except the one on the color Settings>Design File>Color . If they come to me with both top and bottom colors the same the VBA commands do not change them to different. They stay locked. If it was Yel-Yel, and you ask blue red it becomes blu-blu, or if you want green-magenta you get green-green

    if you manually change either color to anything different

    then all the color change commands work fine. So I have resolved to do manual when I get one. I even tried splitting it into 2 macros 1 command in each Haha Nope. Ok code coming up, got to get to Dr's

    '------------------------------------------------------------
    'Private Sub Class_Terminate()
    ' This is executed when an instance of this class is destroyed
    Private Sub Class_Terminate()
      'Remove the existing reference, if any, to the current MicroStation session
      Set m_OpenCloseHooks = Nothing
    End Sub
    
    '------------------------------------------------------------
    'OnDesignFileOpened(ByVal DesignFileName As String)
    ' This method will be called each time a design file is opened.
    ' The DesignFileName is the name of the file that was just opened,
    '  this is useful if you perform some sort of filtering based on file
    '  name or extension.
    Private Sub m_OpenCloseHooks_OnDesignFileOpened(ByVal DesignFileName As String)
       
        
    ' 011819 - Added Key-in command
        ' Place code you wish to execute each time a file is opened here.
        ' You could do all sorts of things here, but use caution as this is run
        ' for every file you open as long as this class is active.
        ' For this example, we will close all views except for View 1
        ' and perform a Fit All. We will also use familiar MBE style commands
        ' for those trying to transition from MBE.
        
       '[A] - Personal Section Added Commands
        'CadInputQueue.SendCommand "View Off All"    'Turn off all views
        'CadInputQueue.SendCommand "View On 1"       'Turn View 1 on
        'CadInputQueue.SendCommand "Window Tile"     'Resize View 1 to fit screen
        'CadInputQueue.SendCommand "Fit All"         'Start Fit All command
        'CadInputQueue.SendCommand "Selview 1"       'Apply to View 1
        ' 011619 - The VBA RUN ViewAttributON also runs the AttribOFF section subroutine
        '{Note} Changing to comment for testing
        'CadInputQueue.SendKeyin "vba run ViewAttribON"      ' Turns on Attributes Off Attributes and Runs AA= & As= settings
        ' {Note} Changing to comment for testing
        
        '[B] - 052619 Modified Colors are messing up ________________________________________________________ RJB
         Dim KeyIn As String
        '[AA] 052219 - Runs macro in Module6 Set Settings Design File Preferences
        KeyIn = "VBA RUN [Default]Module6.SetSDFpreferences"         ' 051319 - Testing adding a dim command"
        CadInputQueue.SendKeyin KeyIn
        
        ' RemoveModalDialogEventsHandler modalHandler
        ' As stated before, you can perform all kinds of things here.
    End Sub
    
    060319 - I had commented out all the previous one's when I found I could 
    just run them direct from the ohter file. I hope this is not to confusing. 
    Gotta Run
    

    Version: MicroStation V8i SS 10

    RJB Phillips III (Richard) Praise the Lord for His Mercy and grace in Christ Jesus

  • I don't know if [AutoRun] is a supplied Bentley file

    The name AutoRun may seem apposite, but in fact any VBA project will run automatically given the right conditions.  The conditions are very simple: the project must contain a module having subroutines OnProjectLoad and OnProjectUnload.  See Overview of MicroStation Events in VBA help.

    AFAIK a file named AutoRun.mvba is not supplied with MicroStation.

     
    Regards, Jon Summers
    LA Solutions

  • I do want to say thank you so much for the help. With what jon told me I was able to call the macro from within the Autorun and then Barry when I printed out your helpful program and followed the two AutoRun and Your file Detach ref's I was able to copy the section I needed to complete the task. Thank you so much. 

    PS: Thanks Jon Summers, have already been reading some goggle's on the Excel VBA so far they are not showing the Dim commands, something about Excel has something built in, But thank you I am also checking on the MS Word same thing IF-THEN-ELSE. And a thank you to Jan who has given me so many tips in the past.

    Private Sub m_OpenCloseHooks_OnDesignFileClosed(ByVal DesignFileName As String)
        Detach_Refs_Query
    End Sub
    Private Sub Detach_Refs_Query()
    
    Dim RefQuery As Integer
    Dim nAttachments As Integer
    
        'Determine if there are any references attached,
        nAttachments = ActiveModelReference.Attachments.Count
    
        'Proceed with messagebox if no at least 1 reference files is attached, otherwise bypass and exit without prompt
        If Not nAttachments = 0 Then
    
            RefQuery = MsgBox("Now closing file" & ActiveDesignFile.Name & vbNewLine & "Do you wish to detach all Reference Files?", vbYesNo + vbQuestion, "RP Detach Refs Query")
    
        'Detach all references if the user presses Yes
            If RefQuery = vbYes Then
    
                Dim i As Integer
                For i = nAttachments To 1 Step -1
                    ActiveModelReference.Attachments.Remove i
                Next i
                RedrawAllViews
                Exit Sub
            Else
        'Do nothing and exit without detaching reference attachments
            End If
        End If
    End Sub
    
    

    Version: MicroStation V8i SS 10

    RJB Phillips III (Richard) Praise the Lord for His Mercy and grace in Christ Jesus

  • FWIW, the AutoRun.mvba being mentioned is the example provided on Ask Inga that I posted, wow, over 10 years ago now. Still perfectly relevant though.

    https://communities.bentley.com/communities/other_communities/askinga/w/askinga/1109/run-a-vba-macro-when-opening-or-closing-design-files

    Hopefully that clarifies some of the confusion for future readers of this thread.

    Gerald

  • Thank you so much I did try the key-In you posted but I never got the question you mentioned Barry Lothina also replied and it is working .Thank you again for your responses and help.

    Version: MicroStation V8i SS 10

    RJB Phillips III (Richard) Praise the Lord for His Mercy and grace in Christ Jesus

  • I did try the key-In you posted [Reference Detach All] but I never got the question you mentioned

    The key-in works, whether or not you see the question.  It does what it says on the tin: detaches all reference attachments.

    The first time you use that key-in, it pops the message box with the question.  There's also a tick-box Don't ask me this question again.  If you checked that box, then you don't see the question again.  The first time you used that key-in may have been some time (maybe years) ago, so it's easy to forget that you already chose that option.

    If you want to know more about Reference Detach All please post a new question in the MicroStation Forum.

     
    Regards, Jon Summers
    LA Solutions

  • There is a confusion. a Young man

    Youngan. Fu kept wanting me to try that

    so I did and was replying to his comment. Sorry I was trying to let him know that it did not work for me

    Version: MicroStation V8i SS 10

    RJB Phillips III (Richard) Praise the Lord for His Mercy and grace in Christ Jesus

  • Barry 2 questions, I have been told do not keep closing a file, just load another. New draw back if I fail to close the file it never asks about the cross ref files. If I close it does fine

    any change that would correct that?

    My second question on this same subject will keep so as to  only be dealing with 1 at a time. I am going to look at the code and see if I can see a way (Hahaha) I am going to try

    I so appreciate your major assistance on this . I am close to a complete winner.

    Version: MicroStation V8i SS 10

    RJB Phillips III (Richard) Praise the Lord for His Mercy and grace in Christ Jesus

  • Not sure I fully understand the what you are saying, Richard.

    "do not keep closing a file, just load another" sounds strange and could mean either of 2 things

    1. Keep the existing session/instance of MicroStation with a specific drawing open, and open a new session/instance of MicroStation for another drawing, or
    2. Alternatively it could mean do not use the close command on the File menu (to return back to the MicroStationManager) and instead use the Open command to load another DGN file.

    The latter is logical and the way I would expect everyone to use MicroStation (unless there is a need to change Projects) however programatically (in relation to the MVBA file I uploaded) there is no difference using File>Close>Open DGN file from MicroStation Manager compared to File>Open i.e. the OnDesignFileClosed events are triggered in both instances so you should be seeing the dialog box if you have any references attached to the currently open DGN file.

    If I've misunderstood, you will need to provide a clearer example of what the issue is.