【问题标题】:Call a solidworks macro from a sub and pass global variables从子调用solidworks宏并传递全局变量
【发布时间】:2014-10-10 16:53:15
【问题描述】:

在 Solidworks 中我录制了两个宏。

宏 1 为空:

Dim swApp As Object

Dim Part As Object
Dim boolstatus As Boolean
Dim longstatus As Long, longwarnings As Long

'added code
Dim distance_of_second_plane
'end of added code

Sub main()

    Set swApp = _
    Application.SldWorks

    Set Part = swApp.ActiveDoc
    'added code:  here I want to call the second macro and send it distance_of_second_plane, and have it use that value
     distance_of_second_plane = .05
     '.. now what?

    'end of added code, don't know what to add.

End Sub

宏 2 需要来自宏 1 的数据:

Dim swApp As Object

Dim Part As Object
Dim boolstatus As Boolean
Dim longstatus As Long, longwarnings As Long

Sub main()

    Set swApp = _
    Application.SldWorks

    Set Part = swApp.ActiveDoc
    boolstatus = Part.Extension.SelectByID2("Front Plane", "PLANE", 0, 0, 0, True, 0, Nothing, 0)
    Dim myRefPlane As Object
    Set myRefPlane = Part.FeatureManager.InsertRefPlane(8, 0.05334, 0, 0, 0, 0)
    Part.ClearSelection2 True

End Sub

这些宏当然保存在不同的文件中。如何从第一个调用第二个,从第一个传入数据,并在第二个中使用它?

我尝试过的东西:http://support.microsoft.com/kb/140033http://www.cadsharp.com/macros/run-macro-from-another-macro-vba/VBA module that runs other modulesCall a Subroutine from a different Module in VBA

所有这些都是有问题的。如果需要,我会详细说明我遇到的错误。

【问题讨论】:

    标签: vba solidworks


    【解决方案1】:

    虽然可以使用 ISldWorks::RunMacro2 从另一个宏运行宏,但无法让此方法返回您可以在第一个宏中使用的任何值。即使这是可能的,我也不会推荐它。

    您需要完成的所有事情都可以在一个宏中完成,您只需学习如何使用 SolidWorks API 即可实现这一目标。你能解释一下你想用你的宏来完成什么吗?然后我可以告诉你你需要什么代码。

    还请注意,宏记录器确实不是创建任何重要宏的好工具。如果您打算认真使用 SolidWorks API,那么您确实需要掌握以下三项技能:

    1. 如何使用 VBA 进行基本编程(变量、数组、条件、循环等)
    2. 如何浏览和阅读 SolidWorks API 帮助(离线版)
    3. API 对象如何相互关联(SolidWorks API 对象模型)

    我的网站(在我的个人资料中)有一些视频可以帮助您入门。同样,如果您希望我在这里帮助您解决当前的问题,请说明您正在尝试自动化什么。

    【讨论】:

    • “您需要完成的所有事情都可以在一个宏中完成,您只需要学习如何使用 SolidWorks API 即可实现这一目标。请您解释一下您试图用您的宏?然后我可以告诉你你需要什么代码。”我对此毫不怀疑。我现在有一个宏,可以为我构建相当大部分的飞机机翼。从另一个调用一个宏的目的是拆分代码。当它有 16 个屏幕长时,很难找到和编辑它的各个部分(我还没数过它有多少个屏幕......)
    • 您会注意到,您的网站是我在寻找解决方案时引用的网站之一。多亏了它,我的程序中目前确实有循环。 :-) 我会在 10 月之后重回这个话题。 17.我们会看看事情会如何发展:-)
    • 很高兴您发现我的一些教程很有帮助。您熟悉在 VBA 中创建子过程、函数和模块吗?因为这些通常是您用来模块化代码的东西。顺便说一句,我的“你只需要学习......”的评论并不是为了居高临下,如果遇到这种情况,我深表歉意。
    【解决方案2】:

    您可以创建一个单独的模块来封装您的常用方法。然后添加对该模块的引用并从您的 Macro1 和 Macro2 子例程中调用它。

    例如在您的 Macro1 中:

    1. 在项目资源管理器中,右键单击 Modules 文件夹和 Insert-Module,在 Module1 中命名(或任何您想要的名称)

    1. 在 Module1 中创建一个子例程,将其命名为 InsertPlane(或任何有意义的名称),并使用完成任务所需的参数构造子例程

      Sub InsertPlane(ByRef swApp As Object, ByVal distance As Double)
      
          'enter your code here, the parameters passed to InsertPlane can be whatever you need
          'to do what the method needs to do.
      
      End Sub
      
    2. 在宏的 main() 方法中,在需要时调用 InsertPlane() 方法

      Sub main()
      
      Set swApp = _
      Application.SldWorks
      
      Set Part = swApp.ActiveDoc
      'added code:  here I want to call the second macro and send it distance_of_second_plane, and have     it use that value
       distance_of_second_plane = 0.05
      
       'example of calling the subroutine
       boolstatus = Module1.InsertPlane(swApp, distance_of_second_plane)
      
      End Sub
      
    3. 模块可以导出和导入,因此您可以在其他宏中重复使用它们,在模块1 上的项目树中右键单击并导出文件。同样,您可以右键单击 Modules 文件夹并导入模块。

    希望这会有所帮助。

    【讨论】:

    • 感谢您的回答。我可以试一试,但没有更多时间进行研究以找出方法。其他优先事项。如果你能给我一个简单但完整的例子来说明如何做到这一点,那将不胜感激。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-10
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-16
    相关资源
    最近更新 更多