ÎÒÃǶàÊýÈ˵ÄWindowsµçÄÔÉ϶¼ÓÐMicrosoft Office£¬ÎÒÃÇÓÃMicrosoft ExcelÁбíºÍ¼ÆË㣬µ«Ä㻹¿ÉÒÔ:
¼¼Êõ²©¿Í
ÓÃExcel Visual BasicΪӦÓóÌÐòÌí¼ÓÔÆº£ÓÎÏ· CANlib
- ´ÓÄãµÄExcel¹¤×÷±íÖеÄÈÎÒâµ¥Ôª¸ñÏòCAN×ÜÏß·¢ËÍÊý¾Ý
- ÒÔExcel¹¤×÷±íµÄÈÎÒâµ¥Ôª¸ñ´ÓCAN×ÜÏß½ÓÊÕÊý¾Ý
ÔÆº£ÓÎÏ· CANlib¿ÉÓÃÓÚVisual Basic for Applications (VBA)¡£´Ë¶à¹¦ÄÜ¿âÖ§³ÖÔÆº£ÓÎÏ·µÄËùÓÐÊÊÅäÆ÷£¬²¢¸¨ÖúÄã±àд¸ß¼¶ºÍ´´ÐµĽâ¾ö·½°¸¡£
ÓÐÕâô¶àÆäËûÓïÑÔ¿ÉÒÔÓã¬ÎªÊ²Ã´»¹ÒªÊ¹ÓÃVBAÄØ£¿Ê×ÏÈ£¬Èç¹ûÄãÓÃMicrosoft Office£¬ÄÇôÒѾ¿ÉʹÓÃËü£¬¶øÇÒÓÃÆðÀ´Ïà¶ÔÈÝÒס£ExcelʹÓù㷺£¬Í¨¹ýVBA£¬Äã¿ÉÓ¦ÓÃExcelµÄËùÓй¦ÄÜ£¬ÒÔ¼°Äã×Ô¼ºµÄ´´ÒâºÍ´´ÐÂÏë·¨¡£Èç¹ûÄãÒѾÔÚÓÃExcel£¬¾ÍûÓÐÆäËû³É±¾¡£Êý¾ÝÒ×ÓÚÔÚ²»Í¬¹«Ë¾Ö®¼ä¹²Ïí£»Ðí¶à¹«Ë¾¶¼Ê¹ÓÃMicrosoftÎļþ¸ñʽ¡£
´Ë²©¿ÍÌṩʲô°ïÖú?
Òª°´±¾²©¿ÍÖеIJ½Ö裬ÓëÔÆº£ÓÎÏ· CANlibÒ»ÆðʹÓÃExcel VBA£¬ÄãÐèÒªÓÐMicrosoft Office¡£Äĸö°æ±¾µÄMicrosoft Office¶¼¿ÉÒÔ£¬µ«×îºÃÊÇOffice 2010£¬ÒòΪVBA 7ÊÇÔÚ2010ÄêÍÆ³öµÄ¡£64λºÍ32λOffice¾ù¿ÉʹÓã¨Çë²ÎÔĵÚ2.2½Ú32ºÍ64λMicrosoft Office£©¡£Ð´´Ë²©¿Íʱ£¬ÎÒʹÓÃÁËOffice 365ºÍExcel£¨°æ±¾2202 Build 16.0.14931.20116£©64λ¡£
Ä㻹ÐèÒª°²×°¡°ÓÃÓÚWindowsµÄÔÆº£ÓÎÏ·Çý¶¯³ÌÐò¡±¡£ÇëÔÚ´Ë´¦²éÕÒ¿ÉÓõÄ×îа汾: /download/ ²¢ÒÀÕÕÆä·Ö²½°²×°Ö¸ÄÏ¡£
²»ÐèÒªÆäËûÈκζ«Î÷£¬µ«Èç¹ûÄãÐèÒª¸ü½øÒ»²½Ê¹ÓÃCANlib£¬½¨ÒéÏÂÔØÔÆº£ÓÎÏ· CANlib SDK£¬Ò²¿ÉÒÔ´ÓÉÏÊöͬһÁ´½Ó»ñµÃ¡£
½éÉÜ
Visual Basic for Applications£¨VBA£©ÊÇMicrosoftÓÃÓÚÀ©Õ¹OfficeÓ¦ÓóÌÐòµÄʼþÇý¶¯±à³ÌÓïÑÔ¡£Ê¹ÓÃVBA£¬Äã¿ÉÒÔͨ¹ý×Ô¶¯»¯¡¢Windows APIºÍ×Ô¶¨Ò幦ÄÜÀ©Õ¹Á÷³Ì¡£Ä㻹¿ÉÒÔ²Ù×÷Ö÷»úÓ¦ÓóÌÐòµÄÓû§½çÃæ¹¦ÄÜ¡£
VBAÊÇMicrosoft±à³ÌÓïÑÔVisual Basic 6µÄÒ»¸ö×Ó¼¯£¬ËüʹÓÃͬһ±à¼Æ÷µÄ¾«¼ò°æ±¾ÒÔ¼°ÀàËÆµÄµ÷ÊÔ¹¦ÄÜ¡£Òò´Ë£¬Èç¹ûÄãÁ˽âVB6£¬Ò²¾Í¿ÉÁ˽âVBAµÄʹÓ÷½·¨¡£Visual BasicÊÇΪÁ˼ò»¯±à³Ì¶ø´´½¨µÄ£¬ÕâÒâζ×ÅÓÃVBA±à³Ì²¢²»ÄÑ£¬ËüʹÓÃÀàËÆÓ¢ÓïµÄÓï¾äÀ´¸æËßµçÄÔ¸Ã×öʲô¡£
Application.ActiveDocument.SaveAs ("New Document Name.docx")
½«»î¶¯ÎĵµÁí´æÎª ¡°New Document Name.docx¡±¡£
ÖµµÃÒ»ÌáµÄÊÇ£¬VBAÊǵ¥Ï̵߳ģ¬ÕâÒâζ×ÅËü½«Ò»´ÎÖ´ÐÐÒ»¸öÈÎÎñ¡£ÇëÔĶÁµÚ2.3½Ú¶à¸öÈÎÎñ´¦ÀíÒÔÁ˽â¸ü¶àÐÅÏ¢¡£
ĬÈÏÇé¿öÏ£¬Office²»ÏÔʾ¡°¿ª·¢ÈËÔ±¡±Ñ¡Ï£¬Äã±ØÐëÆôÓÃËü£º
- ´Ó¡°Îļþ¡±Ñ¡ÏÖУ¬Ñ¡Ôñ¡°Ñ¡ÏÒÔ´ò¿ª¡°Ñ¡Ï¶Ô»°¿ò¡£
- Ñ¡Ôñ¶Ô»°¿ò×ó²àµÄ¡°×Ô¶¨Ò幦ÄÜÇø¡±¡£
- ÔÚ¶Ô»°¿ò×ó²àµÄ¡°´ÓÖÐÑ¡ÔñÃüÁî(Choose Commands From)¡±ÖУ¬Ñ¡Ôñ¡°³£ÓÃÃüÁî(Common Commands)¡±¡£
- ÔÚÓÒ²àµÄ¡°×Ô¶¨Ò幦ÄÜÇø(Customize the ribbon)¡±ÖУ¬´ÓÏÂÀÁбíÖÐÑ¡ÔñMain Tab£¬È»ºóÑ¡Ôñ¿ª·¢ÈËÔ±(Developer)¸´Ñ¡¿ò¡£
- Ñ¡ÔñOK¡£
´Ó¡°¿ª·¢ÈËÔ±¡±Ñ¡Ï£¬Äã¿ÉÒÔ´ò¿ª±à¼Æ÷²¢´´½¨°´Å¥¡¢ÏÂÀ²Ëµ¥µÈ¡£»¹ÓÐÒ»¸ö¿ì½Ý·½Ê½£¬´ÓOfficeÓ¦ÓóÌÐòÖеÄÈκÎλÖôò¿ª´Ë±à¼Æ÷£ºALT+F11¡£
VBAÉçÇø·Ç³£´ó¡£ÔÚÍøÉÏËÑË÷һϣ¬¼¸ºõ×ÜÄÜÕÒµ½Ò»¸öVBAʾÀý£¬¸ÃʾÀý¼´Ê¹ºÍÄãÐèÒªµÄ²»ÍêÈ«Ïàͬ£¬Ò²ÖÁÉÙÓëÄãÐèÒªµÄ²Ù×÷ÀàËÆ¡£
VBA·¶Àý
µÚÒ»¸öʾÀý½«ÏÔʾµ±Ä³¸öµ¥Ôª³öÏÖ¸ü¸ÄʱÈçºÎ×÷³ö·´Ó¦£¬²¢½«¸ÃÖµ·¢Ë͵½CAN×ÜÏß¡£
ÔÚVBA±à¼Æ÷ÖУ¬Ë«»÷ÄãÐèÒª¶ÔÆä×÷³ö·´Ó¦µÄµ¥Ôª¸ñËùÔڵŤ×÷±í£¬È»ºóÑ¡Ôñ¸Ã¹¤×÷±íµÄ¡°¸ü¸Ä(Change)¡±²½Öè¡£

ÿµ±¸Ã¹¤×÷±íÖз¢Éú¸ü¸Äʱ£¬¶¼»áÖ´Ðй¤×÷±í¸ü¸Äʼþ£¬½«ÆäËõСµ½Ìض¨µÄÒ»¸öµ¥Ôª¸ñ£¬ÎÒʹÓÃVBAÖеÄIntersect()º¯Êý¡£´Ëº¯ÊýÈ·¶¨¸ü¸ÄµÄµ¥Ôª¸ñÊÇ·ñÓëÎÒÃÇÖ¸¶¨µÄµ¥Ôª¸ñ¡°Æ¥Å䡱¡£ÎªÁ˼ò»¯´ËʾÀý£¬ÎÒ¼ÙÉ蹤×÷±í´¦Óڻ״̬£¬²¢ÇÒÎÒÃÇÒª·¢Ë͵ÄÖµ½éÓÚ0-255Ö®¼ä¡£ÓйØcanWriteÖÐʹÓõIJÎÊý£¬ÒÔ¼°ÈçºÎ´ÓCAN×ÜÏß½ÓÊÕÊý¾ÝµÄ¸ü¶àÐÅÏ¢£¬Çë¼ûÏÂÒ»¸öʾÀý¡£
ÔÚÎÒµÄÁíÒ»¸öʾÀýÖУ¬ÎÒÒѽ«Ò»¸ö¼Ç¼Îļþµ¼ÈëExcel(ÔÚ´ËʾÀýÖУ¬ËüÊÇÒ»¸ö.ASCÎļþ)¡£ÎÒÕâÑù×öÖ»ÊÇΪÁËÏòCAN×ÜÏß·¢ËÍÊý¾Ý¡£

µ±È»£¬ÄãµÄÊý¾Ý¿ÉÒÔÊÇÀ´×ÔÈκεط½µÄ£¬ÔÚVBAÖдò¿ªÒ»¸öÎļþ£¬Ò²¿ÉÒÔÔÚExcelÖбàд¼¸¸ö¾ßÌåÓ¦·¢Ë͵ÄÖ¡µÈ¡£
ÎÒ²»»áÔÚÕâÀïÉî̸CANlib¡£Õâ¸öʾÀýÖ»ÊǸøÄãÒ»¸ö¹ØÓÚʹÓÃVBAºÍCANlibµÄÌáʾ¡£
ÎÒ½«ÑÝʾÈçºÎʹÓÃÔÆº£ÓÎÏ· CANlib´ÓExcelÖеÄÈÎÒâµ¥Ôª¸ñ·¢ËÍÊý¾Ý£¬ÒÔ¼°ÈçºÎÒÔExcelÖеÄÈÎÒâµ¥Ôª¸ñ½ÓÊÕÊý¾Ý¡£
±àÂë
CANlib API- ºÍ¾ä±úÉùÃ÷
Option Explicit 'Force explicit variable declaration so that an undeclared variable generates error.
#If VBA7 Then
Private Declare PtrSafe Sub canInitializeLibrary Lib "CANLIB32.DLL" ()
Private Declare PtrSafe Function canUnloadLibrary Lib "CANLIB32.DLL" () As Long
Private Declare PtrSafe Function canGetNumberOfChannels Lib "CANLIB32.DLL" (ByRef channelCount As Long) As Long
Private Declare PtrSafe Function canGetChannelData Lib "CANLIB32.DLL" (ByVal channel As Long, ByVal item As Long, ByRef buffer As Any, ByVal bufsize As Long) As Long
Private Declare PtrSafe Function canOpenChannel Lib "CANLIB32.DLL" (ByVal handle As Long, ByVal Flags As Long) As LongPtr
Private Declare PtrSafe Function canClose Lib "CANLIB32.DLL" (ByVal handle As LongPtr) As Long
Private Declare PtrSafe Function canBusOn Lib "CANLIB32.DLL" (ByVal handle As LongPtr) As Long
Private Declare PtrSafe Function canBusOff Lib "CANLIB32.DLL" (ByVal handle As LongPtr) As Long
Private Declare PtrSafe Function canSetBusParams Lib "CANLIB32.DLL" (ByVal handle As LongPtr, ByVal freq As Long, ByVal tseg1 As Long, ByVal tseg2 As Long, ByVal sjw As Long, ByVal noSamp As Long, ByVal syncMode As Long) As Long
Private Declare PtrSafe Function canWrite Lib "CANLIB32.DLL" (ByVal handle As LongPtr, ByVal id As Long, ByRef msg As Any, ByVal dlc As Long, ByVal flag As Long) As Long
Private Declare PtrSafe Function canReadWait Lib "CANLIB32.DLL" (ByVal handle As LongPtr, ByRef id As Long, ByRef msg As Any, ByRef dlc As Long, ByRef flag As Long, ByRef time As Long, ByRef timeout As Long) As Long
#Else
Private Declare Sub canInitializeLibrary Lib "CANLIB32.DLL" ()
Private Declare Function canUnloadLibrary Lib "CANLIB32.DLL" () As Long
Private Declare Function canGetNumberOfChannels Lib "CANLIB32.DLL" (ByRef channelCount As Long) As Long
Private Declare Function canGetChannelData Lib "CANLIB32.DLL" (ByVal channel As Long, ByVal item As Long, ByRef buffer As Any, ByVal bufsize As Long) As Long
Private Declare Function canOpenChannel Lib "CANLIB32.DLL" (ByVal handle As Long, ByVal Flags As Long) As Long
Private Declare Function canClose Lib "CANLIB32.DLL" (ByVal handle As Long) As Long
Private Declare Function canBusOn Lib "CANLIB32.DLL" (ByVal handle As Long) As Long
Private Declare Function canBusOff Lib "CANLIB32.DLL" (ByVal handle As Long) As Long
Private Declare Function canSetBusParams Lib "CANLIB32.DLL" (ByVal handle As Long, ByVal freq As Long, ByVal tseg1 As Long, ByVal tseg2 As Long, ByVal sjw As Long, ByVal noSamp As Long, ByVal syncMode As Long) As Long
Private Declare Function canWrite Lib "CANLIB32.DLL" (ByVal handle As Long, ByVal id As Long, ByRef msg As Any, ByVal dlc As Long, ByVal flag As Long) As Long
Private Declare Function canReadWait Lib "CANLIB32.DLL" (ByVal handle As Long, ByRef id As Long, ByRef msg As Any, ByRef dlc As Long, ByRef flag As Long, ByRef time As Long, ByRef timeout As Long) As Long
#End If
'Constant declarations
Private Const canOK = 0
Private Const canOPEN_ACCEPT_VIRTUAL = &H20
Private Const canBITRATE_250K = -3
Private Const canCHANNELDATA_CARD_SERIAL_NO = 7
'Declaration of CAN handles
#If VBA7 Then
Private hnd0, hnd1 As LongPtr
#Else
Private hnd0, hnd1 As Long
#End If
ÕâЩÉùÃ÷ÊDZØÐèµÄ£¬ÒÔ±ãÖ¸¶¨ÄÄЩdllµ÷ÓÿÉÓ㬲¢Ö¸³ö´ËdllµÄλÖá£Í¨¹ýÔÆº£ÓÎÏ·µÄ°²×°³ÌÐò°²×°Ê±£¬CANlib32.dllλÓÚϵͳ·¾¶ÖС£Õâ¾ÍÊÇ˵Äã²»±ØÖ¸¶¨ËüµÄ¾ßÌåλÖá£
[ Public | Private ] Declare Sub name Lib “libname” [ ( [ arglist ] ) ]
[ Public | Private ] Declare Function name Lib “libname” [ ( [ arglist ] ) ] [ As type ]
ʹÓÃPrivate±íÃ÷£¬Ö»ÓÐÔÚÉùÃ÷ËüµÄÄ£¿éÖвÅÄÜ·ÃÎÊËü¡£
ÔÆº£ÓÎÏ· CANlib SDKĿǰ²»°üº¬ÈκÎVB»òVBAÉùÃ÷£¬Òò´ËÄã±ØÐë¸ù¾ÝÐèÒª±àдÕâЩÉùÃ÷¡£ÓйØÔÚÏßÔÆº£ÓÎÏ· CANlib SDK£¬Çë·ÃÎÊ£ºhttps://www.kvaser.com/canlib-webhelp/index.html
Ä㵱Ȼ¿ÉÒÔÁªÏµÎÒ»òÎÒÃǵļ¼ÊõÖ§³ÖÈËÔ±£¬ÎÒÃǽ«¾¡Á¦°ïÖúÄã¡£±¾ÎĽáβ´¦ÌṩÁËÁªÏµ·½Ê½¡£
µ÷ÓÃ CANlib API
³õʼ»¯CANlib²¢»ñÈ¡¿ÉÓÃͨµÀÊý
Sub CANLib_Start()
Dim chCount, stat, i As Long
Dim buffer As String
Dim myArr(32) As Byte
Dim ws As Worksheet
canInitializeLibrary
stat = canGetNumberOfChannels(chCount)
If stat <> canOK Then GoTo ErrorHandler
ÔÚʹÓÃÈÎºÎÆäËûº¯Êý֮ǰ£¬±ØÐëÏȵ÷ÓÃcanInitializeLibraryº¯Êý¡£Ëü½«³õʼ»¯Çý¶¯³ÌÐò¡£
canGetNumberOfChannels, ´Ëº¯Êý½«·µ»ØµçÄÔÖпÉÓÃCANͨµÀµÄÊýÁ¿¡£ÐéÄâͨµÀ°üÀ¨ÔÚ´ËͨµÀÊýÖС£
×¼±¸¹¤×÷±íÒÔ¶ÁȡһЩÉ豸ÐÅÏ¢
Sheets.Add(Before:=Sheets(1)).name = "Device info" ' Add a sheet called "Device info" to the first position
Range("A1").Value = "Nof channels"
Range("B1").Value = chCount
ÔÚÕâÀÎÒÃǸøµÚÒ»¸öλÖÃÌí¼ÓÒ»¸öÐµĹ¤×÷±í£¬²¢Ôڸù¤×÷±íµÄµ¥Ôª¸ñB1ÖÐдÈë¿ÉÓÃͨµÀÊý¡£
¶Áȡÿ¸ö¿ÉÓÃͨµÀµÄһЩÉ豸ÐÅÏ¢
For i = 0 To chCount - 1
stat = canGetChannelData(i, canCHANNELDATA_CARD_SERIAL_NO, myArr(0), 32)
buffer = StrConv(myArr(), vbUnicode)
If buffer <> Empty Then
Cells(i + 2, 1).Value = "Serial"
Cells(i + 2, 2).Value = buffer
End If
Next i
ÔÚÕâÀÎÒÃDz鿴ÿ¸ö¿ÉÓõÄͨµÀ£¬²¢Ñ¯ÎÊÉ豸µÄÐòÁкţ¬²¢ÇÒÎÒÃǽ«ÆäдÈëÿ¸öͨµÀµÄµÚ¶þÁÐÖеÄÐÂÐУ¨¼´B£©
´ò¿ªÍ¨µÀ£¬ÉèÖòÎÊý²¢Æô¶¯×ÜÏß
hnd0 = canOpenChannel(0, canOPEN_ACCEPT_VIRTUAL)
hnd1 = canOpenChannel(1, canOPEN_ACCEPT_VIRTUAL)
stat = canSetBusParams(hnd0, canBITRATE_250K, 0, 0, 0, 0, 0)
If stat <> canOK Then GoTo ErrorHandler
stat = canSetBusParams(hnd1, canBITRATE_250K, 0, 0, 0, 0, 0)
If stat <> canOK Then GoTo ErrorHandler
stat = canBusOn(hnd0)
If stat <> canOK Then GoTo ErrorHandler
stat = canBusOn(hnd1)
If stat <> canOK Then GoTo ErrorHandler
ÔÚÕâÀÎÒÃÇ´ò¿ªµÚÒ»¸öºÍµÚ¶þ¸öͨµÀ£¬ÒÔ»ñµÃËùÓÐÆäËûµ÷ÓÃËùÐèµÄ¾ä±ú¡£ÎÒÃǼÌÐø×¼±¸ÕâÁ½¸ö´ò¿ªµÄͨµÀ£¬ÎªËüÃÇÉèÖÃÏàͬµÄ±ÈÌØÂÊ¡£
Ϊ¶ÁÈ¡Êý¾Ý×¼±¸¹¤×÷±í
DeleteSheet ("Read data")
Set ws = Sheets.Add()
ws.name = "Read data"
ws.Cells(1, 1).Value = "ID"
ws.Cells(1, 2).Value = "Data1"
ws.Cells(1, 3).Value = "Data2"
ws.Cells(1, 4).Value = "Data3"
ws.Cells(1, 5).Value = "Data4"
ws.Cells(1, 6).Value = "Data5"
ws.Cells(1, 7).Value = "Data6"
ws.Cells(1, 8).Value = "Data7"
ws.Cells(1, 9).Value = "Data8"
ÕâÀïÎÒÃÇ×¼±¸Ò»¸ö¹¤×÷±íÀ´´æ´¢¶ÁÈ¡µÄÊý¾Ý¡£ÎÒÊ×ÏÈɾ³ý¡°¶ÁÈ¡Êý¾Ý(Read data)¡±±í£¬Èç¹ûËüÒѾ´æÔÚ¡£È»ºóÎÒ´´½¨´Ë¹¤×÷±í²¢ÃüÃû£¬Í¬Ê±Ìí¼ÓһЩ±êÌâ×¢ÊÍ£¬ÒÔ±ã¸üºÃµØÀí½âÊä³öÄÚÈÝ¡£
·¢ËÍ¡¢½ÓÊÕºÍÌî³äµ¥Ôª¸ñ
Sub CANlib_Traffic()
Dim tb As ListObject
Dim iCol, iRow As Integer
Dim sData(1 To 8), sCol As String
Dim bDataTx(1 To 8) As Byte
Dim bDataRx(1 To 8) As Byte
Dim stat, lID, lDlc, lFlags, lTime As Long
Worksheets("Imported ASC").Activate
Set tb = ActiveSheet.ListObjects("TestLog")
For iRow = 1 To tb.Range.Rows.Count
lDlc = tb.DataBodyRange.Cells(iRow, tb.ListColumns("DLC").Index) ' Get how many data bytes
For iCol = 1 To lDlc
sCol = "Data" + Trim(Str(iCol)) 'Create the headline to read from
sData(iCol) = tb.DataBodyRange.Cells(iRow, tb.ListColumns(sCol).Index)
bDataTx(iCol) = CByte("&H" & sData(iCol)) ' Convert the Hex value to decimal
Next iCol
' Send the byte stream of CAN data on the first channel
stat = canWrite(hnd0, CLng(iRow), bDataTx(1), lDlc, 0)
DoEvents
' Read out the received data on the second channel
stat = canReadWait(hnd1, lID, bDataRx(1), lDlc, lFlags, lTime, 50)
If stat = canOK Then
With Worksheets("Read data") ' Populate cells in Excel with read CAN data
.Cells(lID + 1, 1).Value = lID
' .Cells(lID + 1, 2).Value = CStr(Hex(bDataRx(1))) ' Use this if value should be in hexadecimal
.Cells(lID + 1, 2).Value = bDataRx(1)
.Cells(lID + 1, 3).Value = bDataRx(2)
.Cells(lID + 1, 4).Value = bDataRx(3)
.Cells(lID + 1, 5).Value = bDataRx(4)
.Cells(lID + 1, 6).Value = bDataRx(5)
.Cells(lID + 1, 7).Value = bDataRx(6)
.Cells(lID + 1, 8).Value = bDataRx(7)
.Cells(lID + 1, 9).Value = bDataRx(8)
End With
End If
Next iRow
MsgBox "Traffic done!"
End Sub
Ê×ÏÈÈ·¶¨Òª¶ÁÈ¡µÄ¹¤×÷±íÒѼ¤»î¡£ÔÚÎÒµÄʾÀýÖУ¬ÎÒ½«µ¼ÈëÊý¾ÝµÄ¹¤×÷±íÃüÃûΪTestLog£¬²¢½«ÆäÉèÖÃΪListObject±äÁ¿¡£ÎÒÕâÑù×öÊÇΪÁËÔÚ»ñȡҪ·¢Ë͵Äֵʱ¸üÈÝÒ×Ñ»·²Ù×÷£¬ÕâÑùÎÒ¿ÉÒÔʹÓù¤×÷±íµÄ±êÌâÀ´Ö¸¶¨ÎÒÕýÔÚ¶ÁÈ¡µÄÁС£µÚÒ»¸öÑ»·ÉèÖÃΪ¶ÁÈ¡µ¼ÈëÊý¾ÝµÄÕû¸ö·¶Î§¡£ÎÒ¶ÁÈ¡Êý¾Ý³¤¶È´úÂ루dlc£©Öµ£¬ÒÔÁ˽⻹Ҫ¶ÁÈ¡ºÍÉÔºó·¢Ë͵Ä×Ö½ÚÊý¡£µÚ¶þ¸öÑ»·µü´úÊý¾Ý×Ö½Ú£¬½«ËüÃÇ´ÓÎı¾¸ñʽµÄÊ®Áù½øÖÆ×ª»»ÎªÊ®½øÖÆÖµ£¬²¢½«Öµ´æ´¢ÔÚ×Ö½ÚÊý×éÖС£
È»ºó£¬Í¨¹ýµ÷ÓÃCANlibº¯ÊýcanWrite£¬½«CANÊý¾ÝµÄ×Ö½ÚÊý×éÓ뱨ÎÄid£¨ÔÚ±¾ÀýÖÐΪÐкţ©ºÍÊý¾Ý³¤¶È´úÂ루dlc£©Ò»Æð·¢ËÍ¡£
DoEvents¿ÉÒÔ¸üÇáËɵØÍ£Ö¹ÕýÔÚÔËÐеĺꡣDoEventsº¯ÊýÔÊÐíÖжÏÖ´ÐдúÂ룬²¢ÔÊÐí¼ÆËã»ú´¦ÀíÆ÷ͬʱÔËÐÐÆäËûÈÎÎñ¡£Ê¹ÓÃDoEvents»áÑÓ³¤Ö´ÐÐʱ¼ä£¬µ«ÁíÒ»·½Ã棬ËüÒ²»áÈúêÍ£Ö¹ÔËÐС£
canReadWait´Ó½ÓÊÕ»º³åÇø¶ÁÈ¡±¨ÎÄ¡£Èç¹ûûÓпÉÓõı¨ÎÄ£¬Ôò¸Ãº¯Êý½«µÈ´ý±¨Îĵ½´ï»ò³¬Ê±¡£
×îºó£¬ÎÒÓøöÁȡֵÌî³ä֮ǰ´´½¨µÄ¡°¶ÁÈ¡Êý¾Ý¡±¹¤×÷±í¡£ÎÒʹÓñ¨ÎÄidÖ¸¶¨µ¥Ôª¸ñÐС£Í¨¹ýÔÚдÈëµ¥Ôª¸ñʱʹÓÃÃüÃû¹¤×÷±í£¬ÎÒ²»±Ø¼¤»î¸Ã¹¤×÷±í(Worksheets(“Read data”).Cells(Row, Column).Value)£¬Í¬Ê±Äܱ£³Ö±£´æµ¼ÈëÊý¾ÝµÄ¹¤×÷±í´¦Óڻ״̬¡£
²Ù×÷ºóÇåÀí
Sub CANLib_Stop()
canBusOff (hnd0)
canBusOff (hnd1)
canUnloadLibrary
MsgBox "CANlib is unloaded!"
End Sub
canBusOff°ÑÖ¸¶¨¾ä±ú¹Ø±Õ¡£Èç¹ûͬһͨµÀÉÏûÓÐÆäËû¾ä±ú´¦Óڻ״̬£¬ÔòÒ²½«°Ñ´ËͨµÀ¹Ø±Õ¡£canUnloadLibrary½«ÊÍ·Å·ÖÅäµÄÄÚ´æ£¬Ð¶ÔØÒѼÓÔØµÄDLL canlib32.£¬²¢È¡Ïû³õʼ»¯Êý¾Ý½á¹¹¡£
½á¹û
±¾Ê¾ÀýµÄ½á¹ûÈçÏÂËùʾ:

ÎÒ±¾¿ÉÒÔÑ¡Ôñ½«Êä³öÊý¾Ý¸ñʽ»¯ÎªÊ®Áù½øÖÆÒÔ±ãÓڱȽϣ¬È»ºó½«µ¥Ôª¸ñ¸ñʽ»¯ÎªÎı¾: ws.Columns(“A:I”).NumberFormat = “@”£¬µ±½«Öµ·ÅÈëÕâЩµ¥Ôª¸ñʱ£¬ÐèÒª½øÐÐÈçÏÂת»»£ºCells(col, row).Value = CStr(Hex(MyDecValue))¡£
µ«ÎÒÑ¡ÔñÁËÊ®½øÖÆ£¬Ö»ÊÇΪÁ˼ò»¯½øÒ»²½µÄ·ÖÎö¡£Ò²¿ÉÒÔʹÓÃÊ®Áù½øÖÆÖµ£¬µ«ÓÐʱÐèÒª½øÐÐת»»£¬ÒòΪVBAºÍExcelÖеÄͼ±í¶ÔÏóÐèÒªÆäֵΪʮ½øÖƸñʽ¡£
¿ÉʹÓÃExcelͼ±í¿ÉÊÓ»¯Êý¾Ý£¬ÀýÈç:

ͼ±í¿ÉÒÔÔÚVBA´úÂëÖÐÉú³É£¬Ò²¿ÉÒÔÔÚÒÔºóʹÓÃExcelµÄ¹¤¾ßÀ¸Éú³É¡£Òª½øÒ»²½ÉîÈëÁ˽âVBAµÄ¹¦ÄÜ£¬Çë²ÎÔÄMicrosoftÎĵµ: https://docs.microsoft.com/en-us/office/vba/api/overview/.
32λÓë64λMicrosoft Office
Á½¸öOffice°æ±¾¶¼¿ÉÓ㬵«ÖµµÃÒ»ÌáµÄÊÇ£¬ÔÚVBA°æ±¾7ÖÐÌí¼ÓÁËһЩеÄ64λ¹¦ÄÜ¡£

VBAÖгýÊý¾ÝÀàÐÍByteÍ⣬ûÓÐÎÞ·ûºÅÊý¾ÝÀàÐÍ¡£µ«Õâ²¢²»ÊÇÍêÈ«²»¿ÉÐÐ – ¿ÉÒÔÔÚVBAÖжÁÈ¡ÎÞ·ûºÅÖµ£¬ÀýÈç±¾Àý½éÉÜÁËÈçºÎ¶Ô2147483647ÒÔÉϵÄֵʹÓÃË«¾«¶ÈÀàÐÍ¡£
Private Const MAX_UINT32 = 4294967296#
Private Const MAX_INT32 = 2147483647
Function LongToUnsigned(ByVal Value As Long) As Double
If Value < 0 Then
LongToUnsigned = Value + MAX_UINT32
Else
LongToUnsigned = Value
End If
End Function
Function UnsignedToLong(ByVal Value As Double) As Long
If Value < 0 Or Value >= MAX_UINT32 Then Error 6
If Value <= MAX_INT32 Then
UnsignedToLong = Value
Else
UnsignedToLong = Value - MAX_UINT32
End If
End Function
¶àÈÎÎñ´¦Àí
VBAÊǵ¥Ï̵߳ģ¬ÕâÒâζ×ÅËü½«Ò»´ÎÖ´ÐÐÒ»¸öÈÎÎñ¡£ÈÔÈ»¿ÉÒÔ´´½¨Ò»¸öÏ̻߳òʹÓûص÷º¯Êý£¬ÈçCANlibÖеÄkvSetNotifyCallback£¬µ«ÎÒ²»½¨ÒéÕâÑù×ö¡£Èç¹û¹Ø±ÕÒ»¸öÏ̲߳¢ÔÚÖ÷Ïß³ÌÖеȴý£¬Ôò´´½¨Ò»¸öÏß³ÌÊÇ¿ÉÒԵ쬵«´´½¨¸ü¶àÏ̻߳ò³¢ÊÔдÈëÖ÷Ïß³ÌÍâµÄµ¥Ôª¸ñ£¬¿ÉÄܻᵼÖÂExcel¶³½á²¢¹Ø±Õ¡£ÎªÁ˱ÜÃâÂé·³ºÍ»¨·Ñ¶îÍâʱ¼ä£¬½¨Òé±£³ÖËüµÄ¼òµ¥ÐÔºÍÖ÷Ï̡߳£
¶ÔÓÚÄÇЩÓÐʹÓÃVBA¾ÑéµÄÓû§£¬ÓÐһЩ·½·¨¿ÉÒÔ½â¾öÕâ¸öÎÊÌ⣬ÀýÈç´Ó´úÂëÖеÄÑ»·ÖÐÆô¶¯Ò»¸öеÄExcelʵÀý£¬²¢´Ó¸ÃÐÂʵÀýµ÷ÓÃÖ÷¹¤×÷²¾ÖеÄÒ»¸ö¹ý³Ì¡£
ÎҵĽ¨ÒéÊDZ£³ÖÔÚÖ÷Ïß³ÌÀï¡£
×ܽá
ÔÚ±¾²©¿ÍÖУ¬ÎÒÃǼòÒª½éÉÜÁËÈçºÎÔÚMicrosoft ExcelÖÐʹÓÃCANlibºÍVBAÏòCAN×ÜÏß·¢ËͺʹÓCAN×ÜÏß½ÓÊÕÊý¾Ý¡£
ÎÒÏ£Íû´ËʾÀý¿ÉÈÃÄãÁ˽âʲôÊÇ¿ÉÐе쬾¡¹ÜËü²¢Ã»ÓÐÉîÈëÌÖÂÛÔÆº£ÓÎÏ· CANlib¡¢VBA»òMicrosoft Excel¡£
ÄãÐèÒª¸ü¶àÐÅÏ¢»òÊÇÓÐÈκÎÎÊÌ⣿
ÇëËæÊ±ÓëÎÒÃÇÁªÏµ¡£»¶ÓÌá³öÒâ¼ûºÍÎÊÌ⣡
Äã¿ÉÒÔÔÚÕâÀïÕÒµ½ÎÒÃÇ£º
support@kvaser.com
»òÕߣ¬Èç¹ûÄã¿ÉÒÔÖ±½ÓÓëÎÒÁªÏµ:
Dan Arvidson
Óû§Èí¼þ¾Àí
daar@kvaser.com
