Page 1 of 1
Running a VB script inside solidworks macro?
Posted: Tue Nov 02, 2021 9:53 am
by ResidentAtLarge
Is there a command in solidworks macro to run a VB script and then place a pause for 1 second while it runs? I am not finding any information on how to do this anywhere.
Re: Running a VB script inside solidworks macro?
Posted: Tue Nov 02, 2021 11:11 am
by mattpeneguy
This can get you a Sleep for 1 second:
Code: Select all
Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Dim swApp As Object
Sub main()
Set swApp = Application.SldWorks
Sleep (1000)
End Sub
Also, isn't VBScript a subset of VB? Could you just copy the code into the macro?
Re: Running a VB script inside solidworks macro?
Posted: Tue Nov 02, 2021 11:47 am
by ResidentAtLarge
mattpeneguy wrote: ↑Tue Nov 02, 2021 11:11 am
Also, isn't VBScript a subset of VB? Could you just copy the code into the macro?
I wasn't sure if vb could be run directly inside of solidworks VBA or not. I am not someone who knows a whole lot about programming either.
Thank you for the delay code!
Re: Running a VB script inside solidworks macro?
Posted: Tue Nov 02, 2021 11:50 am
by AlexB
We've used this to run a compiled external program.
Code: Select all
Sub main()
Shell ("C:\PathToYourEXEFile\SolidworksScript.exe")
End Sub
Re: Running a VB script inside solidworks macro?
Posted: Tue Nov 02, 2021 11:55 am
by mattpeneguy
AlexB wrote: ↑Tue Nov 02, 2021 11:50 am
We've used this to run a compiled external program.
Code: Select all
Sub main()
Shell ("C:\PathToYourEXEFile\SolidworksScript.exe")
End Sub
Unfortunately that won't work for a vbs script... You need access to the WSH, I think. Someone like
@josh or
@gupta9665 would probably be able to answer this. I think it's possible it's not allowed because of security.
Re: Running a VB script inside solidworks macro?
Posted: Tue Nov 02, 2021 1:28 pm
by RMcHugh
I remembered reading a similar question a while back. Didn't realize how long ago...
I found this in the SWYMp:
https://r1132100503382-eu1-3dswym.3dexp ... MACNSJXzOg
TL/DR: Use RunMacro2 method, answered by
@gupta9665
Disclaimer: I have no actual experience with the command, just a fuzzy, semi-functioning memory system.
Hope this helps,
Ray
Re: Running a VB script inside solidworks macro?
Posted: Tue Nov 02, 2021 1:49 pm
by JSculley
ResidentAtLarge wrote: ↑Tue Nov 02, 2021 9:53 am
Is there a command in solidworks macro to run a VB script and then place a pause for 1 second while it runs? I am not finding any information on how to do this anywhere.
Are you wanting to run a visual basic program or a VBScript script? They are two different things.
Re: Running a VB script inside solidworks macro?
Posted: Tue Nov 02, 2021 2:14 pm
by ResidentAtLarge
JSculley wrote: ↑Tue Nov 02, 2021 1:49 pm
Are you wanting to run a visual basic program or a VBScript script? They are two different things.
I am looking to run a VBScript Script file.
Re: Running a VB script inside solidworks macro?
Posted: Tue Nov 02, 2021 2:23 pm
by mattpeneguy
RMcHugh wrote: ↑Tue Nov 02, 2021 1:28 pm
I remembered reading a similar question a while back. Didn't realize how long ago...
I found this in the SWYMp:
https://r1132100503382-eu1-3dswym.3dexp ... MACNSJXzOg
TL/DR: Use RunMacro2 method, answered by @gupta9665
Disclaimer: I have no actual experience with the command, just a fuzzy, semi-functioning memory system.
Hope this helps,
Ray
@RMcHugh,
It appears that will only run a Solidworks SWP macro, not a vbs script.
Re: Running a VB script inside solidworks macro?
Posted: Tue Nov 02, 2021 2:27 pm
by ResidentAtLarge
My VBScript code I am looking to use is below:
Code: Select all
Const ForReading = 1
Dim arrLine()
Dim lnCnt
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = objFSO.OpenTextFile("c:\temp\BOMTable_Export_TESTING.SLDASM.txt", ForReading)
'Read the csv file to get the header column names and data for each row.
Do Until objTextFile.AtEndOfStream
strNextLine = objTextFile.Readline
lnCnt = lnCnt + 1
If lnCnt = 2 Then
arrHeaders = Split(strNextLine, vbTab)
End If
If lnCnt > 2 Then
Redim Preserve arrLine(lnCnt - 2)
arrLine(lnCnt - 2) = strNextLine
End If
Loop
objTextFile.Close
'Load the data into a multidimentional array.
ReDim arrData(UBound(arrLine), UBound(arrHeaders))
For i = 0 to Ubound(arrLine)
line = Split(arrLine(i), vbTab)
For p = 0 to UBound(line)
arrData(i, p) = line(p)
Next
Next
'Find operations notes and raw material.
ReDim arrOperations(0)
ReDim tmpMaterial(0)
ReDim tmpMatIdx(0)
ReDim tmpMatQty(0)
For i = 0 to UBound(arrData, 1)
curOper = arrData(i, GetColumnIndex("RawOperation"))
If curOper <> "" Then
idx = -1
For o = 0 to UBound(arrOperations)
If InStr(1, arrOperations(o), curOper) = 1 Then
idx = o
Exit For
End If
Next
If idx = -1 Then
Redim Preserve arrOperations(UBound(arrOperations) + 1)
Redim Preserve arrRawMaterial(UBound(arrRawMaterial) + 1)
idx = UBound(arrOperations)
'Begin operation notes.
arrOperations(idx) = curOper
If arrData(i, GetColumnIndex("RawNote1")) <> "" Then arrOperations(idx) = arrOperations(idx) & vbCrlf & arrData(i, GetColumnIndex("RawNote1"))
If arrData(i, GetColumnIndex("RawNote2")) <> "" Then
arrOperations(idx) = arrOperations(idx) & vbCrlf & arrData(i, GetColumnIndex("RawNote2"))
qty = arrData(i, GetColumnIndex("<FONT size=57PTS>QTY."))
If qty > 1 Then arrOperations(idx) = arrOperations(idx) & vbCrlf & "(" & qty & " PER UNIT)"
End If
'Begin raw material
mat = arrData(i, GetColumnIndex("RawPartNo"))
If mat <> "" Then
matIdx = -1
For m = 0 to UBound(tmpMaterial)
If mat = tmpMaterial(m) Then
matIdx = m
Exit For
End If
Next
If matIdx = -1 Then
Redim Preserve tmpMaterial(UBound(tmpMaterial) + 1)
Redim Preserve tmpMatIdx(UBound(tmpMatIdx) + 1)
Redim Preserve tmpMatQty(UBound(tmpMatQty) + 1)
matIdx = UBound(tmpMaterial)
tmpMaterial(matIdx) = mat
tmpMatIdx(matIdx) = idx
tmpMatQty(matIdx) = CDbl(arrData(i, GetColumnIndex("RawMaterialQty")))
Else
tmpMatQty(matIdx) = CDbl(tmpMatQty(matIdx)) + CDbl(arrData(i, GetColumnIndex("RawMaterialQty")))
End If
End If
Else
'Add operation notes.
If arrData(i, GetColumnIndex("RawNote1")) <> "" Then arrOperations(idx) = arrOperations(idx) & vbCrlf & vbCrlf & arrData(i, GetColumnIndex("RawNote1"))
If arrData(i, GetColumnIndex("RawNote2")) <> "" Then
arrOperations(idx) = arrOperations(idx) & vbCrlf & arrData(i, GetColumnIndex("RawNote2"))
qty = arrData(i, GetColumnIndex("<FONT size=57PTS>QTY."))
If qty > 1 Then arrOperations(idx) = arrOperations(idx) & vbCrlf & "(" & qty & " PER UNIT)"
End If
'Add raw material
mat = arrData(i, GetColumnIndex("RawPartNo"))
If mat <> "" Then
matIdx = -1
For m = 0 to UBound(tmpMaterial)
If mat = tmpMaterial(m) Then
matIdx = m
Exit For
End If
Next
If matIdx = -1 Then
Redim Preserve tmpMaterial(UBound(tmpMaterial) + 1)
Redim Preserve tmpMatIdx(UBound(tmpMatIdx) + 1)
Redim Preserve tmpMatQty(UBound(tmpMatQty) + 1)
matIdx = UBound(tmpMaterial)
tmpMaterial(matIdx) = mat
tmpMatIdx(matIdx) = idx
tmpMatQty(matIdx) = CDbl(arrData(i, GetColumnIndex("RawMaterialQty")))
Else
tmpMatQty(matIdx) = CDbl(tmpMatQty(matIdx)) + CDbl(arrData(i, GetColumnIndex("RawMaterialQty")))
End If
End If
End If
End If
Next
'Display output
Set outFile = objFSO.CreateTextFile("c:\temp\operationnotes.csv", True)
Dim oLine
For i = 0 to UBound(arrOperations)
oLine = chr(34) & Replace(arrOperations(i), chr(34), chr(34) & chr(34)) & chr(34)
For m = 0 to UBound(tmpMatIdx)
If tmpMatIdx(m) = i Then
oLine = oLine & ", " & tmpMaterial(m) & ", " & tmpMatQty(m)
End If
Next
outFile.WriteLine(oLine)
'Wscript.Echo arrOperations(i) & vbCrlf & vbCrlf
Next
outFile.Close
'Returns the index number of the column name passed.
Function GetColumnIndex(columnName)
GetColumnIndex = 0
For c = 0 to UBound(arrHeaders)
If arrHeaders(c) = columnName Then
GetColumnIndex = c
Exit For
End If
Next
End Function
Re: Running a VB script inside solidworks macro?
Posted: Tue Nov 02, 2021 4:01 pm
by mattpeneguy
@ResidentAtLarge,
I'm not sure if it'll run from within a SW macro. I thought the "Scripting.FileSystemObject" wouldn't work, but it may according to this:
https://help.solidworks.com/2019/Englis ... nction.htm.
If you can setup a sandbox, to make sure you don't mess any production data up, you could try running it and see what happens. I was hoping Josh or Deepak would've replied by now. I'm sure they can conclusively say whether what you want to do is possible and if so how best to do it.
Re: Running a VB script inside solidworks macro?
Posted: Tue Nov 02, 2021 4:55 pm
by ResidentAtLarge
mattpeneguy wrote: ↑Tue Nov 02, 2021 4:01 pm
@ResidentAtLarge,
I'm not sure if it'll run from within a SW macro. I thought the "Scripting.FileSystemObject" wouldn't work, but it may according to this:
https://help.solidworks.com/2019/Englis ... nction.htm.
If you can setup a sandbox, to make sure you don't mess any production data up, you could try running it and see what happens. I was hoping Josh or Deepak would've replied by now. I'm sure they can conclusively say whether what you want to do is possible and if so how best to do it.
I will wait and see what Josh or Deepak say.