CADsite

  • wo 21 08 2019, 14:57:39
  • Welkom, gast
Log in of registreer jezelf.

Login met gebruikersnaam, wachtwoord en sessielengte
Geavanceerd zoeken  

Nieuws:

Pagina's: [1] 2   Omlaag

Auteur Topic: Excel manipulatie vanuit autocad  (gelezen 10797 keer)

WebRacer

  • vaste forumklant
  • *****
  • Offline Offline
  • Berichten: 440
    • Bekijk profiel
Excel manipulatie vanuit autocad
« Gepost op: wo 28 09 2005, 23:46:42 »

hoi, in topic http://www.cadsite.be/forum/viewtopic.php?t=194 waarin Joop een schijnbaar schitterende lisp routine van David Stein laat zien, worden er vooral veel mogelijkheden meegegeven, waarmee je dus vanuit autocad excel zou moeten kunnen manipuleren.

De laatste 2 uur heb ik mij daar eens zitten in verdiepen en het een en ander uitspitten, maar ik word er helaas niet echt wijzer van, is er iemand die dit ook gedaan heeft (uitspitten en verdiepen) en die mij enige uitleg hieromtrend kan meegeven, vooral dan van hoe je al die subroutines moet gebruiken, of je ze allemaal moet doorlopen ja dan nee, en natuurlijk, hoe je ze gebruikt.

Ik ken wel een en ander van autocad, en helaas veel te weinig van excel, maar toch zie ik enkele leuke en interresante mogelijkheden om deze 2 aangenaam te koppellen...

Alvast bedankt op voorhand.
Gelogd
?

Dnereb

  • vaste forumklant
  • *****
  • Offline Offline
  • Berichten: 130
    • Bekijk profiel
Excel manipulatie vanuit autocad
« Reactie #1 Gepost op: do 29 09 2005, 09:31:51 »

Voor dat soort handelingen leent VB(A) zich echt beter als Autocad.
vooral omdat Excel ook VB(A) ondersteunt en direct is aan te sturen

Overigens moet ik er bij zeggen dat heel vaak dingen naar Excel gestuurd worden die eigenlijk in Access thuishoren.

dit is een stukje code om in een class module te zetten:

Option Explicit

'Author B.J.G. Nieuwhof.
'info@driesign.nl


Public Enum AppState
    OpenApp = 0
    CloseApp = 1
End Enum


Function ConnectToExcel(ByRef ExcelApp As Object, Action As AppState) As Boolean

Dim DocCount As Long

Static WasOpen As Boolean       'Flag to check if acad was already open before calling this function
Static OpeningCalls As Long     'Counter to keep track of number opening calls

If Action = OpenApp Then OpeningCalls = OpeningCalls + 1

ConnectToExcel = False

If Action = OpenApp Then
    On Error Resume Next
    Set ExcelApp = GetObject(, "Excel.Application")
    If Err Then
        Err.Clear
        If OpeningCalls = 1 Then
            WasOpen = False
        End If
        Set ExcelApp = CreateObject("Excel.Application")
        If Err Then
            MsgBox "Error number: " & Err.Number & " " & Err.Description & "Occured in Function ConnectToAcad."
            Exit Function
        End If
    ElseIf OpeningCalls = 1 Then
        WasOpen = True
    End If
    On Error GoTo 0
    ConnectToExcel = True

ElseIf Not WasOpen And IsObject(ExcelApp) Then ' make sure acad is an object and not empty
   
    ExcelApp.Quit
    Set ExcelApp = Nothing
    ConnectToExcel = True
    WasOpen = False
    OpeningCalls = 0                                    'reset opening calls
End If


End Function


'Test sub to prove it works
'run this while you haven't opened Excel and it will close it again
'run this while Excel is open and it wil not close it at the end.

Sub test()

Dim ExcelInstance As Object
Dim ClsExcel As New ConnectToExcel

If ConnectToExcel(ExcelInstance, OpenApp) Then
    MsgBox "Open!"
    ExcelInstance.Visible = True         'just to show you can manipulate Excel anyways.
    If ConnectToExcel(ExcelInstance, CloseApp) Then
        MsgBox "Closed!"
    End If
End If

End Sub



Private Sub Class_Terminate()

If OpeningCalls > 0 And Not WasOpen And IsObject(ExcelApp) Then ' make sure acad is an object and not empty
   
    ExcelApp.Quit
    Set ExcelApp = Nothing
    ConnectToExcel = True
    WasOpen = False
    OpeningCalls = 0                                    'reset opening calls
End If

End Sub


En hiermee kan je het in een gewone VB(A) form/module gebruiken:

Sub TestExcel()


'Test sub to prove it works
'run this while you haven't opened Excel and it will close it again
'run this while Excel is open and it wil not close it at the end.


Dim ExcelInstance As Object
Dim ClsExcel As New ClsOpenExcel
If ClsExcel.ConnectToExcel(ExcelInstance, OpenApp) Then
    MsgBox "Open!"
    ExcelInstance.Visible = True         'just to show you can manipulate Excel anyways.
    If ClsExcel.ConnectToExcel(ExcelInstance, CloseApp) Then
        MsgBox "Closed!"
    End If
End If


End Sub



Mijn Excuus voor het Engels maar ik be gewend om in het engels te schrijven en commentaren in mijn code te zetten zodat ik  ook op engelse fora vragen kan stellen.
Gelogd

HofCAD

  • forumverslaafde
  • ******
  • Offline Offline
  • Berichten: 1525
    • Bekijk profiel
Excel manipulatie vanuit autocad
« Reactie #2 Gepost op: do 29 09 2005, 10:29:57 »

Citaat van: Dnereb
Voor dat soort handelingen leent VB(A) zich echt beter als Autocad.



----------- ~\\|//~ ------------
------------
  • -
  • -------------

-------ooO---(_)---Ooo--------


Beste WebRacer,

Soms is het maar betrekkelijk, dat VBA zich er beter voor leent
dan AutoLISP.
Meestal kan ik met Visual Lisp hetzelfde en veel sneller programeren
dan met VBA.
Misschien speelt ook wel een rol, waar je goed in bent.

Heb je dit al gezien:
http://www.cadsite.be/forum/viewtopic.php?t=399&highlight=hofcad

Als ik vanavond tijd heb, zal ik kleurtjes maken in Excel.

Groetjes HofCAD CSI
Gelogd
ACADcadabra

Dnereb

  • vaste forumklant
  • *****
  • Offline Offline
  • Berichten: 130
    • Bekijk profiel
Excel manipulatie vanuit autocad
« Reactie #3 Gepost op: do 29 09 2005, 11:34:20 »

Ja, ja daar had (V)Lisp moeten staan.

Maar ik blijf erbij dat VBA zich beter leent voor Excel of andere office Apps gebruiken vanuit Acad.

een cel een kleurtje geven :ExcellApp.ActiveSheet.Cells(X,Y).Interior.colorindex = vbRed(niet getest en variable  X en Y bepalen de kolom en Rij )
Daarbij is VB(A) object georienteerd en als je de klasse gebruikt zoals ik hem gepost hebt wordt b.v. gegarandeerd de excell applicatie afgesloten zelfs als de macro onverwacht onderbroken word.
Ik ben gelukkig ' illisperate' maar ik betwijfel of dat mogelijk is in (((L)ost) ((I)n) ((S)tupid) ((P)arenteteeth))
Gelogd

WebRacer

  • vaste forumklant
  • *****
  • Offline Offline
  • Berichten: 440
    • Bekijk profiel
Excel manipulatie vanuit autocad
« Reactie #4 Gepost op: do 29 09 2005, 16:26:18 »

Beste Dnereb,

Dat VBA (
Verdomd Bullshit en meestal Ambetant.... in mijn ogen)
meer kan dan Lisp en/of Vlisp dat is een feit, omdat het universeler is van programeertaal.

Mag ik er u echter op wijzen dat LISP de enige taal was waar je je vroeger mee kon behelpen in autocad, en nu met Vlisp eigenlijk heel aardig kan tippen aan VBA4CAD...

In VBA weet ik echter wat te doen om naar excel te schrijven en/of lezen.

Het is mij om de uitdaging te doen om dit echter via Vlisp te doen, daar ik ook een vermoeden heb dat dit meer mogelijkheden biedt voor mijn bestaande programma's... en dat zijn er al een heel pak.


-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Ik heb, Hofcad, die excel-subroutines bekeken, maar vind echter de logica niet ...
Ik vermoed dat je eerst excel moet zoeken, laden, nieuwe sheet openen, en dan de elementen uit een lijst naar de cellen schrijven...
dus eigenlijk:


(DSX-TypeLib-Excel)
(DSX-Load-TypeLib-Excel)
(setq xlapp (DSX-Open-Excel-New "SHOW"))
(DSX-Excel-Put-RowList '("A" "B" "C") 2 1)


met die verstande dat je dsx.lsp geladen hebt met die excel-subroutines
Dit lukt echter niet bij mij, vermoedelijk omdat bij de laatste uit de rij gebruik word gemaakt van een variable 'range'...

Dus eigenlijk komt het neer op: Hoe moet ik die subroutines nu gebruiken om elementen uit een lijst naar excel te schrijven...
Gelogd
?

HofCAD

  • forumverslaafde
  • ******
  • Offline Offline
  • Berichten: 1525
    • Bekijk profiel
Excel manipulatie vanuit autocad
« Reactie #5 Gepost op: do 29 09 2005, 16:55:52 »

Citaat van: WebRacer

(DSX-TypeLib-Excel)
(DSX-Load-TypeLib-Excel)
(setq xlapp (DSX-Open-Excel-New "SHOW"))
(DSX-Excel-Put-RowList '("A" "B" "C") 2 1)





----------- ~\\|//~ ------------
------------
  • -
  • -------------

-------ooO---(_)---Ooo--------


Beste WebRacer,

Ik heb nog geen tijd gehad.

Groetjes HofCAD CSI

PS Probeer:

(DSX-TypeLib-Excel)
(DSX-Load-TypeLib-Excel)
(setq xlapp (DSX-Open-Excel-New "SHOW"))
(setq span   (strcat   "B5:"
            (chr
              (+ 64 (length '("A" "B" "C")))
            )
            "20"
         )
       rang1   (vlax-get-property xlapp "Range" span)
       rang1s   (vlax-invoke-method rang1 "Select")
       rang1x   (vlax-get-property xlapp "Selection")
       rang1f   (vlax-get-property rang1x "Font")
       rang1i   (vlax-get-property rang1x "Interior")
       rang1a   (vlax-get-property rang1x "areas")
       rangE   RANG1
      )
(DSX-Excel-Put-RowList '("A" "B" "C") 2 1)
(foreach prop
          (list
            (list "ColorIndex" 35) ;-4105=msxl-xlAutomatic
            (list "pattern" 18 )
            (list "PatternColor" 255)
            (list "PatternColorIndex" 3)
          )
        (vlax-put-property rang1i (car prop) (cadr prop))
      )            ; foreach
(DSX-Excel-Put-CellColor 1 5 14)
Gelogd
ACADcadabra

Dnereb

  • vaste forumklant
  • *****
  • Offline Offline
  • Berichten: 130
    • Bekijk profiel
Excel manipulatie vanuit autocad
« Reactie #6 Gepost op: do 29 09 2005, 17:13:53 »

Citaat van: WebRacer
Beste Dnereb,

Dat VBA (
Verdomd Bullshit en meestal Ambetant.... in mijn ogen)
meer kan dan Lisp en/of Vlisp dat is een feit, omdat het universeler is van programeertaal.

Mag ik er u echter op wijzen dat LISP de enige taal was waar je je vroeger mee kon behelpen in autocad, en nu met Vlisp eigenlijk heel aardig kan tippen aan VBA4CAD...



Ambetant???? :lol:
Als jij je thuis voelt in (V)Lisp moet je dat vooral gebruiken maar sommige dingen gaan nu eenmaal beter in bepaalde talen.
Lisp is vaak beter in selectie's maken  en manipulatie binnen Acad, terwijl VBA toch wat prettiger werkt met formulieren, Office Apps of andere taken die buiten Acad geschieden SQL Server lezen/schrijven b.v.

En eerlijk gezegd is OOP (Object Oriented Programing) of OBP (Object Based Programming) toch wat overzichtelijker als (V)Lisp en zal in de toekomst steeds normaler worden. denk maar eens aan VB.NET C.NET
Gelogd

WebRacer

  • vaste forumklant
  • *****
  • Offline Offline
  • Berichten: 440
    • Bekijk profiel
Excel manipulatie vanuit autocad
« Reactie #7 Gepost op: do 29 09 2005, 17:55:08 »

tja, ik ben wel Cad-minded... en sta nog niet zo open voor VBA, op de meeste gebieden, al gebruik ik VBA ook wel hier en daar...

Met alle respect Dnereb, ik ga hier niet al mijn lisp-routines aanpassen voor enkele 'nuttigere' zaakjes... dat is pas onbegonnen werk...
Gelogd
?

Dnereb

  • vaste forumklant
  • *****
  • Offline Offline
  • Berichten: 130
    • Bekijk profiel
Excel manipulatie vanuit autocad
« Reactie #8 Gepost op: do 29 09 2005, 19:54:14 »

Als je nog even wacht wordt het VBA.net VB en VBA worden inmiddels al uitgefaseerd. O tip lees eens wat achterstevoren :wink:
Gelogd

WebRacer

  • vaste forumklant
  • *****
  • Offline Offline
  • Berichten: 440
    • Bekijk profiel
Excel manipulatie vanuit autocad
« Reactie #9 Gepost op: do 29 09 2005, 21:14:24 »

Nog eens paar uur naar staan gapen, ik zie het niet, misschien zie ik niet goed meer, volgens mij ontbreekt er een stukje uitleg bij die subroutines, ofwel komen de variabelen onderling niet overeen, ofwel kan ik het gewoon niet... het ziet er nogthans simpel en leuk uit...
Gelogd
?

HofCAD

  • forumverslaafde
  • ******
  • Offline Offline
  • Berichten: 1525
    • Bekijk profiel
Excel manipulatie vanuit autocad
« Reactie #10 Gepost op: vr 30 09 2005, 08:35:33 »

Citaat van: WebRacer
Nog eens paar uur naar staan gapen, ik zie het niet, misschien zie ik niet goed meer, volgens mij ontbreekt er een stukje uitleg bij die subroutines, ofwel komen de variabelen onderling niet overeen, ofwel kan ik het gewoon niet... het ziet er nogthans simpel en leuk uit...



----------- ~\\|//~ ------------
------------
  • -
  • -------------

-------ooO---(_)---Ooo--------


Beste WebRacer

Nog geen tijd gehad.

Groetjes HofCAD CSI
Gelogd
ACADcadabra

HofCAD

  • forumverslaafde
  • ******
  • Offline Offline
  • Berichten: 1525
    • Bekijk profiel
Excel manipulatie vanuit autocad
« Reactie #11 Gepost op: vr 30 09 2005, 08:35:33 »

Citaat van: WebRacer
Nog eens paar uur naar staan gapen, ik zie het niet, misschien zie ik niet goed meer, volgens mij ontbreekt er een stukje uitleg bij die subroutines, ofwel komen de variabelen onderling niet overeen, ofwel kan ik het gewoon niet... het ziet er nogthans simpel en leuk uit...



----------- ~\\|//~ ------------
------------
  • -
  • -------------

-------ooO---(_)---Ooo--------


Beste WebRacer


Heb je wel:

(defun dsx-princ(s)
(princ s))


aangemaakt?

Lukt het dan met het onderstaande ook niet.

(DSX-TypeLib-Excel)
(DSX-Load-TypeLib-Excel)
(setq xlapp (DSX-Open-Excel-New "SHOW"))
(setq span (strcat "B5:"
(chr
(+ 64 (length '("A" "B" "C")))
)
"20"
)
rang1 (vlax-get-property xlapp "Range" span)
rang1s (vlax-invoke-method rang1 "Select")
rang1x (vlax-get-property xlapp "Selection")
rang1f (vlax-get-property rang1x "Font")
rang1i (vlax-get-property rang1x "Interior")
rang1a (vlax-get-property rang1x "areas")
rangE RANG1
)
(DSX-Excel-Put-RowList '("A" "B" "C") 2 1)
(foreach prop
(list
(list "ColorIndex" 35) ;-4105=msxl-xlAutomatic
(list "pattern" 18 )
(list "PatternColor" 255)
(list "PatternColorIndex" 3)
)
(vlax-put-property rang1i (car prop) (cadr prop))
) ; foreach
(DSX-Excel-Put-CellColor 1 5 14)


Je moet de applicatie Excel op dezelfde manier beschouwen en
onderzoeken als AutoCAD.


(setq AutoCAD (vlax-get-acad-object))
(vlax-dump-object AutoCAD T)
(setq Pref (vla-get-Preferences AutoCAD))
(vlax-dump-object Pref T)
(setq Screen (vla-get-Display Pref))
(vlax-dump-object Screen T)
(setq Doc (vla-get-ActiveDocument AutoCAD))
(vlax-dump-object Doc T)


(setq dmsx (vlax-dump-object xlapp T))
(setq wbs (vlax-get-property xlapp 'Workbooks))
(vlax-dump-object wbs T)
(setq awb (vlax-get-property xlapp "ActiveWorkbook"))
(vlax-dump-object awb T)
(setq aws (vlax-get-property xlapp "ActiveSheet"))
(vlax-dump-object aws T)


De bibliotheek bevat inderdaad relatieve verwijzingen na de range vlaobjecten.
Waarom de celverwijzing in de bibliotheek relatief t.o.v. de range
genomen is, daar is het nut bij mij nog niet gebleken.

Groetjes HofCAD CSI
Gelogd
ACADcadabra

HofCAD

  • forumverslaafde
  • ******
  • Offline Offline
  • Berichten: 1525
    • Bekijk profiel
Excel manipulatie vanuit autocad
« Reactie #12 Gepost op: vr 30 09 2005, 14:28:35 »

Citaat van: WebRacer
Ik heb een lijst, X_lst genaamt een variabele met een volledige lijst in van lijsten bv: (("1" "2" "3")("4" "5" "6")("7" "8" "9"))
ik wil met de dsx subroutines die lijst in cellen A1->C1 en tot A3 -> C3 ingevuld zien,



----------- ~\\|//~ ------------
------------
  • -
  • -------------

-------ooO---(_)---Ooo--------


Beste WebRacer

Bedoel je zoiets als onderstaand?

Groetjes HofCAD CSI


(defun c:exceltest()
(setvar "CMDECHO" 0)
(defun dsx-princ(s)
(if (/= DEBUG nil)
(princ s))
)
(DSX-TypeLib-Excel)
(DSX-Load-TypeLib-Excel)
(setq xlapp (DSX-Open-Excel-New "SHOW"))
(setq span (strcat "E1:" (chr (+ 64 (length '("A" "B" "C" "D" "E")))) "4")
range (vlax-get-property xlapp "Range" span)
)
(DSX-Excel-Put-RowList '("E1" "F1" "G1") 1 1)
(DSX-Excel-Put-RowList '("E2" "F2" "G2") 2 1)
(DSX-Excel-Put-RowList '("H3" "I3" "J3") 3 4)
(setq span (strcat "A1:" (chr (+ 64 (length '("A")))) "1")
range (vlax-get-property xlapp "Range" span)
)
(setq X_lst '(("1" "2" "3")("4" "5" "6")("7" "8" "9")))
(setq i 0)
(repeat  3
(DSX-Excel-Put-RowList (nth i x_lst) (+ i 1) 1)
(setq i(1+ i))
)
(princ "\n In Excel gelezen:\n")
(princ (DSX-Excel-GetRangeValues-ByRows 1 1 3 3))
(setq span (strcat "B5:"
(chr (+ 64 (length '("A" "B" "C"))))"20" )
rang1 (vlax-get-property xlapp "Range" span)
rang1s (vlax-invoke-method rang1 "Select")
rang1x (vlax-get-property xlapp "Selection")
rang1f (vlax-get-property rang1x "Font")
rang1i (vlax-get-property rang1x "Interior")
rang1a (vlax-get-property rang1x "areas")
range rang1
)
(foreach prop
(list
(list "ColorIndex" 35)
(list "pattern" 18 )
(list "PatternColor" 255)
(list "PatternColorIndex" 3)
)
(vlax-put-property rang1i (car prop) (cadr prop))
) ; foreach
(setq i 1)
(repeat 16
(DSX-Excel-Put-CellColor (+ 4 i) 5 i)
(setq i (1+ i))
)
(setq span (strcat "A23:" (chr (+ 64 (length '("A")))) "23")
range (vlax-get-property xlapp "Range" span)
)
(textscr)
(DSX-Excel-Put-RowCellsColor 23 1 3 3)
(DSX-Excel-Put-RowList '("HofCAD" "CSI" "Tilburg") 1 1)
(setvar "CMDECHO" 1)
(princ "\n Bovenstaand is in Excel gelezen:\n")
(princ)
)
Gelogd
ACADcadabra

WebRacer

  • vaste forumklant
  • *****
  • Offline Offline
  • Berichten: 440
    • Bekijk profiel
Excel manipulatie vanuit autocad
« Reactie #13 Gepost op: vr 30 09 2005, 16:00:01 »

bij het onderstaande stopt het programma Hofcad....
zet je animate eens aan...

(DSX-Excel-Get-Cell range startrow startcol)
Gelogd
?

WebRacer

  • vaste forumklant
  • *****
  • Offline Offline
  • Berichten: 440
    • Bekijk profiel
Excel manipulatie vanuit autocad
« Reactie #14 Gepost op: vr 30 09 2005, 16:02:26 »

hier klopt iets niet vermoed ik...
die range, dat is waar hij blijft op afknappen, klopt dit wel hofcad?

(DSX-Excel-Put-RowList '("E1" "F1" "G1") 1 1)
(DSX-Excel-Put-RowList '("E2" "F2" "G2") 2 1)
(DSX-Excel-Put-RowList '("H3" "I3" "J3") 3 4)
Gelogd
?
Pagina's: [1] 2   Omhoog