Solidworks 2019 - Makro do automatycznego eksportu makra do programu Excel

Witam

Użyłem makra zamieszczonego przez innego użytkownika.

Szybko łapię bakcyla i przyznam, że nie jestem specjalistą od makr. Program ulega awarii z błędem Run-Tume 91 (zmienna obiektu ze zmienną blokową nie jest ustawiona) w instrukcji Set swBOMFeature = swBOMAnnotation.BomFeature pogrubioną czcionką

Czy mógłbyś mi powiedzieć, gdzie popełniam błąd i jak rozwiązać mój problem?

Z góry dziękuję

Sub main()

Dim xlApp As Excel.Application
Ustaw xlApp = Nowy Excel.Aplikacja
Dim wbk As Excel.Workbook
Dim sht As Excel.Arkusz roboczy

Z xlApp
. Widoczne = Prawda
Ustaw wbk = . Skoroszyty.Dodaj
Ustaw sht = wbk. Arkusz ActiveSheet
Zakończ się na

Dim swApp jako SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swModelDocExt As SldWorks.ModelDocExtension
Dim swBOMAnnotation As SldWorks.BomTableAnnotation
Dim swBOMFeature As SldWorks.BomFeature
Dim boolstatus As Boolean
Dim BomType tak długo, jak długo
Przyciemnij konfigurację jako ciąg
Dim TemplateName As Ciąg
Dim TableTemplate As String

Ustaw swApp = Application.SldWorks

Ustaw swModel = swApp.ActiveDoc
Ustaw swModelDocExt = swModel.Extension


TemplateName = "C:\Użytkownicy\sal1chl\Pulpit\test_nomenclature.sldbomtbt"

BomType = swBomType_TopLevelOnly

Ustaw swBOMAnnotation = swModelDocExt.InsertBomTable3(NazwaSzablonu, 0, 0, TypFormularza, Konfiguracja, Fałsz, swNumberingType_Detailed, Prawda)
Ustaw swBOMFeature = swBOMAnnotation.BomFeature

swModel.ForceRebuild3 Prawda

Dim NumCol tak długo
Dim NumRow tak długo
Dim I tak długo
Słońce J Tak długo

LiczbaKolumn = swBOMAnnotation.ColumnCount
NumRow = swBOMAnnotation.RowCount

Dla I = 0 do NumRow
Dla J = 0 TB NumCol
Arkuszy. Komórki(I + 1, J + 1). Wartość = swBOMAnnotation.Text(I, J)
Następny J
Dalej I

boolstatus = swModelDocExt.SelectByID2(swBOMFeature.GetFeature.Description, "BOMFEATURE", 0, 0, 0, Prawda, 0, Nic, 0)
swModel.EditDelete

swModel.ForceRebuild3 Prawda

Przyciemnij konfigurację jako SldWorks.Configuration
Dim cusPropMgr As SldWorks.CustomPropertyManager
Dim lRetVal tak długo
Dim ValOut As String
Dim ResolvedValOut As String
Dim wasResolved As Boolean
Dim nNbrProps tak długo
Dim vPropNames jako wariant
Dim vPropTypes jako wariant
Dim vPropValues jako wariant
Dim rozwiązany jako wariant
Dim custPropType As Long
Dim K tak długo
Dim NameProperty As String

Ustaw cusPropMgr = swModelDocExt.CustomPropertyManager("")

nNbrProps = cusPropMgr.Count
vPropNames = cusPropMgr.GetNames
Dla K = 0 do nNbrProps - 1
cusPropMgr.Get2 vPropNames(K), ValOut, ResolvedValOut
custPropType = cusPropMgr.GetType2(vPropNames(K))
Jeśli vPropNames(K) = "RYSOWNIK" Następnie
PropertyName = ResolvedValOut
Zakończ jeżeli:
Następny k

Przyciemnij ścieżkę jako ciąg
path = About("USERPROFILE") & "\Desktop\" & swModel.GetTitle & "-" & PropertyName & ".xls"

Z xlApp
WBK. Zapisz jako ścieżkę
WBK. Zamykać
. Kończyć
Zakończ się na

Koniec subwoofera

Witam

Myślę, że powinieneś albo zainicjować zmienną konfiguracyjną przed wstawieniem BOM-u, na przykład za pomocą Configuration = "" lub zamienić Configuration na "" w wierszu Set swBOMAnnotation = swModelDocExt.InsertBomTable3(TemplateName, 0, 0, BomType, Configuration, False, swNumberingType_Detailed, True).

Pozdrowienia

1 polubienie

dziękuję Roger za odpowiedź.

Zdaję sobie sprawę, że nie skopiowałem wiersza, który mówił:

Konfiguracja = "Domyślnie"

Dla większej elastyczności właśnie zmieniłem tę linię na 

Konfiguracja = swApp.GetActiveConfigurationName(sFileName)

Mając odpowiednio wcześnie

Const sFileName                 As String = "test. SLDPRT"

Mój problem zawsze występuje z:

Ustaw swBOMFeature = swBOMAnnotation.BomFeature

gdzie swBOMFeature = Nic

FYI w poprzednim wierszu, ja również swBOMAnnotation=Nic

Czy to normalne?

dziękuję za pomoc

 

Witam

Pierwszy punkt: Musisz najpierw sprawdzić, czy TemplateName = "C:\Users\sal1chl\Desktop\test_nomenclature.sldbomtbt" jest poprawnie napisany , ponieważ jeśli tak nie jest, zablokuje w wierszu Set swBOMFeature = swBOMAnnotation.BomFeature.

Punkt drugi: Jeśli używasz makra na części ("test. SLDPRT"), to BomType nie może być  "swBomType_TopLevelOnly", a następnie utknie w wierszu Ustaw swBOMFeature = swBOMAnnotation.BomFeature, zmień go na "swBomType_Indented", aby sprawdzić, czy pochodzi stamtąd. Dziwne jest to, że chcesz umieścić nomenklaturę na części!

Pozdrowienia

1 polubienie

Witaj Rogerze,

Wielkie dzięki, to działa!

Czy wiesz, jak automatycznie pobrać nazwę zestawu, w którym uruchamiam to makro?

Na razie podaję mu nazwę w makrze

Const sFileName                 As String = "test_assemblage. SLDASM"

Dziękuję

 

Pozdrowienia

 

LSE

Coś takiego powinno dać ci nazwę pliku (do dodania pod twoją linią: Set swModel = swApp.ActiveDoc)

 

Dim sFileName jako ciąg

sFileName =swModel.GetPathName

Debug.print nazwa_pliku

PS: nie zapomnij usunąć tej linii: Const sFileName                 As String="test_assemblage. SLDASM"  (lub umieść to w komentarzu)

1 polubienie

Witaj Denis,

Moja odpowiedź nie zniknęła... przepraszam (nie musiałem wybierać "publikuj"). Dziękuję, zadziałało świetnie.

A potem, nie wiem, co zrobiłam, bo nic już nie działa...

NumRow = swBOMAnnotation.RowCount  daje 1, podczas gdy mam kilka komponentów... Moja nomenklatura nie jest już w ogóle wyświetlana...

Masz pomysł?

Załączam makro do Ciebie...

dziękuję za pomoc


wstaw-bom-asm.swp

Jeszcze jedno małe wyjaśnienie....

gdy ręcznie wstawiam zestawienie komponentów, wywołując metodę 

TemplateName = "C:\Użytkownicy\sal1chl\Pulpit\test_assemblage2.sldbomtbt"
 

Nie martw się, tabela jest wyświetlana (1. poziom)

jeśli wywołam go za pomocą makra, mam tylko 1. wiersz tabeli z nazwami kolumn....

Myślę, że mój błąd jest w tym...

TemplateName = "C:\Użytkownicy\sal1chl\Pulpit\test_assemblage.sldbomtbt"
' Typ BOM

BomType = swBomType_TopLevelOnly
'Tworzenie tabeli BOM

Ustaw swBOMAnnotation = swModelDocExt.InsertBomTable3(NazwaSzablonu, 0, 0, TypFormularza, Konfiguracja, Fałsz, swNumberingType_Detailed, Prawda)
Ustaw swBOMFeature = swBOMAnnotation.BomFeature

swModel.ForceRebuild3 Prawda

Dim NumCol tak długo
Dim NumRow tak długo
Dim I tak długo
Słońce J Tak długo

NumCol = swBOMAnnotation.ColumnCount              ' daje 5
NumRow = swBOMAnnotation.RowCount                  ' daje 0, stąd problem....

Witam

Znalazłem swój błąd...

Nieumyślnie zamieniłem wiersze SFileName i Configuration.

 

sFileName = swModel.GetPathName ' = wyświetlana nazwa zestawu ze ścieżką
Debug.Print nazwa_pliku

Konfiguracja = swApp.GetActiveConfigurationName(sFileName)

 

Problem rozwiązany

Dziękuję wam obojgu za pomoc

 

LSE