¼¼Êõ²©¿Í

22/11/2022 ×÷Õß ÔÆº£ÓÎÏ·

ÓÃExcel Visual BasicΪӦÓóÌÐòÌí¼ÓÔÆº£ÓÎÏ· CANlib

ÎÒÃǶàÊýÈ˵ÄWindowsµçÄÔÉ϶¼ÓÐMicrosoft Office£¬ÎÒÃÇÓÃMicrosoft ExcelÁбíºÍ¼ÆË㣬µ«Ä㻹¿ÉÒÔ:

  1. ´ÓÄãµÄExcel¹¤×÷±íÖеÄÈÎÒâµ¥Ôª¸ñÏòCAN×ÜÏß·¢ËÍÊý¾Ý
  2. ÒÔ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

Author Image

Dan Arvidson

¡¾ÍøÕ¾µØÍ¼¡¿¡¾sitemap¡¿