如何将BIN文件转换成EXCEL文件,并可以修改保存

jingningmeng 2013-07-17 07:16:37
单位要做个小软件,把之前用C编写的程序转化为了二进制BIN文件,可用ULTRAEDIT 打开保存的那种,我想问下可否用VB做一个界面让BIN文件和EXCEL文件相互转换?因为程序里只是些固定地址参数设置,如果一个个在BIN上改的话容易出错,所以希望先将BIN文件转换成EXCEL文件,统一改了参数后再转换成BIN,从而写到对应的芯片中;网上查不到什么资料,有的说用VB.NET调用个文件就可以实现,可是还是感觉不那么容易,急求解!!!
...全文
12514 27 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
ywy198463 2015-03-28
  • 打赏
  • 举报
回复
引用 25 楼 Chen8013 的回复:
1. 将userform显示为非模式窗体,可以将showmodal选为false,或者在语句中强制非模式显示。 2. 我说的是“隐藏工作簿”, 不是“隐藏工作”。 3. 要弄成可执行文件,就要用VB来做啊。 用VBA,就只能做成一个带宏的工作簿。   打开这个工作簿,就显示UserForm 。   显示成非模式的窗口,用户是可以操作别的工作簿的。   这个UserForm窗口平时是不用关闭的,用户可以随时进行装载、修改及保存数据的操作。   如果用户关闭窗口,要在 UserForm_Terminate() 事件中把自己关闭掉。 4. 我在20F给出的那个代码,你在装载BIN文件后,不能在VBE中点“停止”,   否则 strFilename 保存的数据就没有了,这时就只能进行“另存为……”的操作了。   你在24F说的“有多个选择的那个小窗口”我不明白你指的是什么窗口。   还有就是20F的代码,是在“自己的Sheet1”中进行操作的,   要做成“软件”,那就必须改成操作别的工作簿和工作表的。   我觉得主要的东西已经给你说得比较全面了,必要的代码也给你了。   如果你还搞不定,出个合适的价,包给我做吧。   象你这个“软件”,我还是能够搞出一个使用起来非常方便、实用的“软件”出来。
怎么和你联系?
liuyuyan6100 2014-11-25
  • 打赏
  • 举报
回复
难道我们是一个苦逼单位的,也在做这个
舉杯邀明月 2013-08-29
  • 打赏
  • 举报
回复
1. 将userform显示为非模式窗体,可以将showmodal选为false,或者在语句中强制非模式显示。 2. 我说的是“隐藏工作簿”, 不是“隐藏工作”。 3. 要弄成可执行文件,就要用VB来做啊。 用VBA,就只能做成一个带宏的工作簿。   打开这个工作簿,就显示UserForm 。   显示成非模式的窗口,用户是可以操作别的工作簿的。   这个UserForm窗口平时是不用关闭的,用户可以随时进行装载、修改及保存数据的操作。   如果用户关闭窗口,要在 UserForm_Terminate() 事件中把自己关闭掉。 4. 我在20F给出的那个代码,你在装载BIN文件后,不能在VBE中点“停止”,   否则 strFilename 保存的数据就没有了,这时就只能进行“另存为……”的操作了。   你在24F说的“有多个选择的那个小窗口”我不明白你指的是什么窗口。   还有就是20F的代码,是在“自己的Sheet1”中进行操作的,   要做成“软件”,那就必须改成操作别的工作簿和工作表的。   我觉得主要的东西已经给你说得比较全面了,必要的代码也给你了。   如果你还搞不定,出个合适的价,包给我做吧。   象你这个“软件”,我还是能够搞出一个使用起来非常方便、实用的“软件”出来。
jingningmeng 2013-08-28
  • 打赏
  • 举报
回复
引用 23 楼 Chen8013 的回复:
你这个功能,当然可以用 VBA或VB做成“独立软件”来运行。 用VBA来做,只要注意 UserForm 显示为非模式窗口就行了,并且把自身工作簿隐藏起来。 这样用户就能很方便的操作了,可以随时 装载、修改及保存数据。 只是看细节方面如何处理而已。 特别是在“保存”时,要检验是否是规定格式的文档。 (比如用户选定一个普通的文档,点“保存”,你得能提示“文档格式错误”) 或者提醒用户选定合法文档后,才能进行“保存”操作。 具体就看你如何处理了。
将userform显示为非模式窗体,是不是将showmodal选false就可以? 将自身工作簿隐藏,指的是将SHEET1 属性中的visible选 0 就可以吗?如果是这样,sheet3却不能选 0,会出现如“不能设置类worksheet 的visibal属性”窗口提示。 还有就是如果上述都可以设置,最终要如何生成可执行文件呢?直接选择 userform ,然后用“导出文件”吗? 那样导出的只是一个FRM文件,并不能运行啊? 然后我发现,调试时单击commandbutton2,有时还是只能跳出保存文件的窗口,而不是有多个选择的那个小窗口。
舉杯邀明月 2013-08-27
  • 打赏
  • 举报
回复
你这个功能,当然可以用 VBA或VB做成“独立软件”来运行。 用VBA来做,只要注意 UserForm 显示为非模式窗口就行了,并且把自身工作簿隐藏起来。 这样用户就能很方便的操作了,可以随时 装载、修改及保存数据。 只是看细节方面如何处理而已。 特别是在“保存”时,要检验是否是规定格式的文档。 (比如用户选定一个普通的文档,点“保存”,你得能提示“文档格式错误”) 或者提醒用户选定合法文档后,才能进行“保存”操作。 具体就看你如何处理了。
jingningmeng 2013-08-27
  • 打赏
  • 举报
回复
引用 21 楼 jingningmeng 的回复:
[quote=引用 20 楼 Chen8013 的回复:] 楼主这么久了还没搞定啊。 我给你一个比较完整的代码吧。 新建一个Excel工作簿,打开VBA编辑器。 创建 一个UserForm 、一个标准模块。 在标准模块中写一句: Public strFilename As String 在 UserForm 中画两个按钮。 CommandButton1 :打开文件装载数据 CommandButton2 :保存数据(是:保存到原文件 否:另存为…… 取消:放弃操作) VBA编辑器中选中 UserForm 的代码窗口,直接运行就行了(点工具栏按钮运行,或按F5)。 UserForm 代码如下:
Option Explicit

Private Sub LoadData()
      Dim aBuffer() As Byte
      Dim strFile$, i&, j&, r&
      Dim lFileSize&
   
   With Application.FileDialog(msoFileDialogFilePicker)
      .AllowMultiSelect = False
      .Filters.Clear
      .Filters.Add "BIN文件(*.bin)", "*.bin"
      .Filters.Add "所有文件(*.*)", "*.*"
      If .Show = 0 Then MsgBox "没有选择文件。", vbInformation: Exit Sub
      strFile = .SelectedItems(1)
   End With
   Open strFile For Binary As #1
   lFileSize = LOF(1)
   aBuffer = InputB(LOF(1), 1)
   Close #1
   strFilename = strFile
   Sheet1.Range("A:Q").Delete
   Sheet1.Range("A:A").ColumnWidth = 10
   Sheet1.Range("B:Q").ColumnWidth = 3.5
   Sheet1.Range("A:Q").NumberFormatLocal = "@"
   Sheet1.Range("A:Q").HorizontalAlignment = xlCenter
   r = 1
   For i = 0 To 15
      Sheet1.Cells(r, i + 2) = Hex$(i)
   Next
   For i = 0 To (lFileSize And &H7FFFFFF0) - 1
      r = r + 1
      Sheet1.Cells(r, 1).Value = Right$("00000000" & Hex$(i), 8)
      For j = 0 To 15
         Sheet1.Cells(r, j + 2).Value = Right$("0" & Hex$(aBuffer(i + j)), 2)
      Next
      i = i + 15
   Next
   j = lFileSize And 15
   If (j > 0) Then
      r = r + 1
      Sheet1.Cells(r, 1).Value = Right$("00000000" & Hex$(i), 8)
      For j = 0 To j - 1
         Sheet1.Cells(r, j + 2).Value = Right$("0" & Hex$(aBuffer(i + j)), 2)
      Next
   End If
End Sub

Private Sub SaveData(strFile As String)
   Const BUFFERSIZE  As Long = 4096       '每次写4KB数据
      Dim aBuffer() As Byte
      Dim strTemp$, i&, j&, r&

   '清空原始文件(如果编辑后文件长度不会减少,可以不用这个)
   Open strFile For Output As #1:   Close #1
   '写数据
   Open strFile For Binary As #1
   ReDim aBuffer(BUFFERSIZE - 1)
   i = 0:   r = 2       '第2行开始
   Do
      For j = 2 To 17
         strTemp = Sheet1.Cells(r, j)
         If (Len(strTemp) = 0) Then Exit For
         aBuffer(i) = CByte("&H" & strTemp)
         i = i + 1
      Next
      If (i = BUFFERSIZE) Then i = 0:  Put #1, , aBuffer
      If (Len(strTemp) = 0) Then
         If (i = 0) Then Exit Sub
         ReDim Preserve aBuffer(i - 1)
         Put #1, , aBuffer
         Exit Sub
      End If
      r = r + 1
   Loop
End Sub

Private Sub CommandButton1_Click()
   Call LoadData
   Sheet1.Cells(1, 1).Select
   Unload Me
End Sub

Private Sub CommandButton2_Click()
   Dim lFlag&, strTemp$
   If Len(strFilename) > 0 Then
      lFlag = MsgBox("保存数据到:" & strFilename, 35)
      If (vbCancel = lFlag) Then Exit Sub
      lFlag = vbNo = lFlag
   Else
      lFlag = -1
   End If
   If (lFlag) Then
      strTemp = Application.GetSaveAsFilename( _
                           filefilter:="BIN文件(*.bin),*.bin,所有文件(*.*),*.*", _
                           Title:="保存文件")
      If (strTemp = "False") Then
         MsgBox "没有保存数据!", vbExclamation
         Unload Me
         Exit Sub
      End If
      strFilename = strTemp   '更换文件名
   Else
      strTemp = strFilename
   End If
   Call SaveData(strTemp):    Close
   Unload Me
End Sub
尝试运行过了,基本可以达到我的需求,只是有个问题,按BUTTON2的时候,保存数据只能是另存为,而不会出现“保存到原文件”和“取消”这另外两种情况给你选择,不知道是何原因。 还有如果是用VBA的话,应该不能将其变成独立的软件,因为如果功能可以达到的话,最终的使用者是生产线上的工人,若给不懂VBA的人操作,估计容易出乱子,不知大侠是否有将上述功能演变为独立界面软件的好建议?[/quote]
引用 20 楼 Chen8013 的回复:
楼主这么久了还没搞定啊。 我给你一个比较完整的代码吧。 新建一个Excel工作簿,打开VBA编辑器。 创建 一个UserForm 、一个标准模块。 在标准模块中写一句: Public strFilename As String 在 UserForm 中画两个按钮。 CommandButton1 :打开文件装载数据 CommandButton2 :保存数据(是:保存到原文件 否:另存为…… 取消:放弃操作) VBA编辑器中选中 UserForm 的代码窗口,直接运行就行了(点工具栏按钮运行,或按F5)。 UserForm 代码如下:
Option Explicit

Private Sub LoadData()
      Dim aBuffer() As Byte
      Dim strFile$, i&, j&, r&
      Dim lFileSize&
   
   With Application.FileDialog(msoFileDialogFilePicker)
      .AllowMultiSelect = False
      .Filters.Clear
      .Filters.Add "BIN文件(*.bin)", "*.bin"
      .Filters.Add "所有文件(*.*)", "*.*"
      If .Show = 0 Then MsgBox "没有选择文件。", vbInformation: Exit Sub
      strFile = .SelectedItems(1)
   End With
   Open strFile For Binary As #1
   lFileSize = LOF(1)
   aBuffer = InputB(LOF(1), 1)
   Close #1
   strFilename = strFile
   Sheet1.Range("A:Q").Delete
   Sheet1.Range("A:A").ColumnWidth = 10
   Sheet1.Range("B:Q").ColumnWidth = 3.5
   Sheet1.Range("A:Q").NumberFormatLocal = "@"
   Sheet1.Range("A:Q").HorizontalAlignment = xlCenter
   r = 1
   For i = 0 To 15
      Sheet1.Cells(r, i + 2) = Hex$(i)
   Next
   For i = 0 To (lFileSize And &H7FFFFFF0) - 1
      r = r + 1
      Sheet1.Cells(r, 1).Value = Right$("00000000" & Hex$(i), 8)
      For j = 0 To 15
         Sheet1.Cells(r, j + 2).Value = Right$("0" & Hex$(aBuffer(i + j)), 2)
      Next
      i = i + 15
   Next
   j = lFileSize And 15
   If (j > 0) Then
      r = r + 1
      Sheet1.Cells(r, 1).Value = Right$("00000000" & Hex$(i), 8)
      For j = 0 To j - 1
         Sheet1.Cells(r, j + 2).Value = Right$("0" & Hex$(aBuffer(i + j)), 2)
      Next
   End If
End Sub

Private Sub SaveData(strFile As String)
   Const BUFFERSIZE  As Long = 4096       '每次写4KB数据
      Dim aBuffer() As Byte
      Dim strTemp$, i&, j&, r&

   '清空原始文件(如果编辑后文件长度不会减少,可以不用这个)
   Open strFile For Output As #1:   Close #1
   '写数据
   Open strFile For Binary As #1
   ReDim aBuffer(BUFFERSIZE - 1)
   i = 0:   r = 2       '第2行开始
   Do
      For j = 2 To 17
         strTemp = Sheet1.Cells(r, j)
         If (Len(strTemp) = 0) Then Exit For
         aBuffer(i) = CByte("&H" & strTemp)
         i = i + 1
      Next
      If (i = BUFFERSIZE) Then i = 0:  Put #1, , aBuffer
      If (Len(strTemp) = 0) Then
         If (i = 0) Then Exit Sub
         ReDim Preserve aBuffer(i - 1)
         Put #1, , aBuffer
         Exit Sub
      End If
      r = r + 1
   Loop
End Sub

Private Sub CommandButton1_Click()
   Call LoadData
   Sheet1.Cells(1, 1).Select
   Unload Me
End Sub

Private Sub CommandButton2_Click()
   Dim lFlag&, strTemp$
   If Len(strFilename) > 0 Then
      lFlag = MsgBox("保存数据到:" & strFilename, 35)
      If (vbCancel = lFlag) Then Exit Sub
      lFlag = vbNo = lFlag
   Else
      lFlag = -1
   End If
   If (lFlag) Then
      strTemp = Application.GetSaveAsFilename( _
                           filefilter:="BIN文件(*.bin),*.bin,所有文件(*.*),*.*", _
                           Title:="保存文件")
      If (strTemp = "False") Then
         MsgBox "没有保存数据!", vbExclamation
         Unload Me
         Exit Sub
      End If
      strFilename = strTemp   '更换文件名
   Else
      strTemp = strFilename
   End If
   Call SaveData(strTemp):    Close
   Unload Me
End Sub
后面再操作了下,保存功能都可以实现,应该是之前弄错了,不好意思。
jingningmeng 2013-08-27
  • 打赏
  • 举报
回复
引用 20 楼 Chen8013 的回复:
楼主这么久了还没搞定啊。 我给你一个比较完整的代码吧。 新建一个Excel工作簿,打开VBA编辑器。 创建 一个UserForm 、一个标准模块。 在标准模块中写一句: Public strFilename As String 在 UserForm 中画两个按钮。 CommandButton1 :打开文件装载数据 CommandButton2 :保存数据(是:保存到原文件 否:另存为…… 取消:放弃操作) VBA编辑器中选中 UserForm 的代码窗口,直接运行就行了(点工具栏按钮运行,或按F5)。 UserForm 代码如下:
Option Explicit

Private Sub LoadData()
      Dim aBuffer() As Byte
      Dim strFile$, i&, j&, r&
      Dim lFileSize&
   
   With Application.FileDialog(msoFileDialogFilePicker)
      .AllowMultiSelect = False
      .Filters.Clear
      .Filters.Add "BIN文件(*.bin)", "*.bin"
      .Filters.Add "所有文件(*.*)", "*.*"
      If .Show = 0 Then MsgBox "没有选择文件。", vbInformation: Exit Sub
      strFile = .SelectedItems(1)
   End With
   Open strFile For Binary As #1
   lFileSize = LOF(1)
   aBuffer = InputB(LOF(1), 1)
   Close #1
   strFilename = strFile
   Sheet1.Range("A:Q").Delete
   Sheet1.Range("A:A").ColumnWidth = 10
   Sheet1.Range("B:Q").ColumnWidth = 3.5
   Sheet1.Range("A:Q").NumberFormatLocal = "@"
   Sheet1.Range("A:Q").HorizontalAlignment = xlCenter
   r = 1
   For i = 0 To 15
      Sheet1.Cells(r, i + 2) = Hex$(i)
   Next
   For i = 0 To (lFileSize And &H7FFFFFF0) - 1
      r = r + 1
      Sheet1.Cells(r, 1).Value = Right$("00000000" & Hex$(i), 8)
      For j = 0 To 15
         Sheet1.Cells(r, j + 2).Value = Right$("0" & Hex$(aBuffer(i + j)), 2)
      Next
      i = i + 15
   Next
   j = lFileSize And 15
   If (j > 0) Then
      r = r + 1
      Sheet1.Cells(r, 1).Value = Right$("00000000" & Hex$(i), 8)
      For j = 0 To j - 1
         Sheet1.Cells(r, j + 2).Value = Right$("0" & Hex$(aBuffer(i + j)), 2)
      Next
   End If
End Sub

Private Sub SaveData(strFile As String)
   Const BUFFERSIZE  As Long = 4096       '每次写4KB数据
      Dim aBuffer() As Byte
      Dim strTemp$, i&, j&, r&

   '清空原始文件(如果编辑后文件长度不会减少,可以不用这个)
   Open strFile For Output As #1:   Close #1
   '写数据
   Open strFile For Binary As #1
   ReDim aBuffer(BUFFERSIZE - 1)
   i = 0:   r = 2       '第2行开始
   Do
      For j = 2 To 17
         strTemp = Sheet1.Cells(r, j)
         If (Len(strTemp) = 0) Then Exit For
         aBuffer(i) = CByte("&H" & strTemp)
         i = i + 1
      Next
      If (i = BUFFERSIZE) Then i = 0:  Put #1, , aBuffer
      If (Len(strTemp) = 0) Then
         If (i = 0) Then Exit Sub
         ReDim Preserve aBuffer(i - 1)
         Put #1, , aBuffer
         Exit Sub
      End If
      r = r + 1
   Loop
End Sub

Private Sub CommandButton1_Click()
   Call LoadData
   Sheet1.Cells(1, 1).Select
   Unload Me
End Sub

Private Sub CommandButton2_Click()
   Dim lFlag&, strTemp$
   If Len(strFilename) > 0 Then
      lFlag = MsgBox("保存数据到:" & strFilename, 35)
      If (vbCancel = lFlag) Then Exit Sub
      lFlag = vbNo = lFlag
   Else
      lFlag = -1
   End If
   If (lFlag) Then
      strTemp = Application.GetSaveAsFilename( _
                           filefilter:="BIN文件(*.bin),*.bin,所有文件(*.*),*.*", _
                           Title:="保存文件")
      If (strTemp = "False") Then
         MsgBox "没有保存数据!", vbExclamation
         Unload Me
         Exit Sub
      End If
      strFilename = strTemp   '更换文件名
   Else
      strTemp = strFilename
   End If
   Call SaveData(strTemp):    Close
   Unload Me
End Sub
尝试运行过了,基本可以达到我的需求,只是有个问题,按BUTTON2的时候,保存数据只能是另存为,而不会出现“保存到原文件”和“取消”这另外两种情况给你选择,不知道是何原因。 还有如果是用VBA的话,应该不能将其变成独立的软件,因为如果功能可以达到的话,最终的使用者是生产线上的工人,若给不懂VBA的人操作,估计容易出乱子,不知大侠是否有将上述功能演变为独立界面软件的好建议?
舉杯邀明月 2013-08-23
  • 打赏
  • 举报
回复
楼主这么久了还没搞定啊。 我给你一个比较完整的代码吧。 新建一个Excel工作簿,打开VBA编辑器。 创建 一个UserForm 、一个标准模块。 在标准模块中写一句: Public strFilename As String 在 UserForm 中画两个按钮。 CommandButton1 :打开文件装载数据 CommandButton2 :保存数据(是:保存到原文件 否:另存为…… 取消:放弃操作) VBA编辑器中选中 UserForm 的代码窗口,直接运行就行了(点工具栏按钮运行,或按F5)。 UserForm 代码如下:
Option Explicit

Private Sub LoadData()
      Dim aBuffer() As Byte
      Dim strFile$, i&, j&, r&
      Dim lFileSize&
   
   With Application.FileDialog(msoFileDialogFilePicker)
      .AllowMultiSelect = False
      .Filters.Clear
      .Filters.Add "BIN文件(*.bin)", "*.bin"
      .Filters.Add "所有文件(*.*)", "*.*"
      If .Show = 0 Then MsgBox "没有选择文件。", vbInformation: Exit Sub
      strFile = .SelectedItems(1)
   End With
   Open strFile For Binary As #1
   lFileSize = LOF(1)
   aBuffer = InputB(LOF(1), 1)
   Close #1
   strFilename = strFile
   Sheet1.Range("A:Q").Delete
   Sheet1.Range("A:A").ColumnWidth = 10
   Sheet1.Range("B:Q").ColumnWidth = 3.5
   Sheet1.Range("A:Q").NumberFormatLocal = "@"
   Sheet1.Range("A:Q").HorizontalAlignment = xlCenter
   r = 1
   For i = 0 To 15
      Sheet1.Cells(r, i + 2) = Hex$(i)
   Next
   For i = 0 To (lFileSize And &H7FFFFFF0) - 1
      r = r + 1
      Sheet1.Cells(r, 1).Value = Right$("00000000" & Hex$(i), 8)
      For j = 0 To 15
         Sheet1.Cells(r, j + 2).Value = Right$("0" & Hex$(aBuffer(i + j)), 2)
      Next
      i = i + 15
   Next
   j = lFileSize And 15
   If (j > 0) Then
      r = r + 1
      Sheet1.Cells(r, 1).Value = Right$("00000000" & Hex$(i), 8)
      For j = 0 To j - 1
         Sheet1.Cells(r, j + 2).Value = Right$("0" & Hex$(aBuffer(i + j)), 2)
      Next
   End If
End Sub

Private Sub SaveData(strFile As String)
   Const BUFFERSIZE  As Long = 4096       '每次写4KB数据
      Dim aBuffer() As Byte
      Dim strTemp$, i&, j&, r&

   '清空原始文件(如果编辑后文件长度不会减少,可以不用这个)
   Open strFile For Output As #1:   Close #1
   '写数据
   Open strFile For Binary As #1
   ReDim aBuffer(BUFFERSIZE - 1)
   i = 0:   r = 2       '第2行开始
   Do
      For j = 2 To 17
         strTemp = Sheet1.Cells(r, j)
         If (Len(strTemp) = 0) Then Exit For
         aBuffer(i) = CByte("&H" & strTemp)
         i = i + 1
      Next
      If (i = BUFFERSIZE) Then i = 0:  Put #1, , aBuffer
      If (Len(strTemp) = 0) Then
         If (i = 0) Then Exit Sub
         ReDim Preserve aBuffer(i - 1)
         Put #1, , aBuffer
         Exit Sub
      End If
      r = r + 1
   Loop
End Sub

Private Sub CommandButton1_Click()
   Call LoadData
   Sheet1.Cells(1, 1).Select
   Unload Me
End Sub

Private Sub CommandButton2_Click()
   Dim lFlag&, strTemp$
   If Len(strFilename) > 0 Then
      lFlag = MsgBox("保存数据到:" & strFilename, 35)
      If (vbCancel = lFlag) Then Exit Sub
      lFlag = vbNo = lFlag
   Else
      lFlag = -1
   End If
   If (lFlag) Then
      strTemp = Application.GetSaveAsFilename( _
                           filefilter:="BIN文件(*.bin),*.bin,所有文件(*.*),*.*", _
                           Title:="保存文件")
      If (strTemp = "False") Then
         MsgBox "没有保存数据!", vbExclamation
         Unload Me
         Exit Sub
      End If
      strFilename = strTemp   '更换文件名
   Else
      strTemp = strFilename
   End If
   Call SaveData(strTemp):    Close
   Unload Me
End Sub
嗷嗷叫的老马 2013-08-21
  • 打赏
  • 举报
回复
楼主搞定没? 我给你弄了一个简单的示例:
'窗体上放两个文本框,一个按钮,名称均为默认.
'
'By 嗷嗷叫的老马
'
Option Explicit

Private Sub Command1_Click()
    Dim lFn As Long
    
    lFn = OpenBin("c:\xxx.bin")             '打开文件
    
    If lFn <> -1 Then
        Put #lFn, CLng(Text2.Text), CByte(Text1.Text)       'Text2.Text中是要写入的位置(第1个字节就是位置1),Text1.Text中是要写入的内容,由于是字节,值在0-255间.
        Put #lFn, CLng(Text2.Text), CLng(Text1.Text)        '写入一个四字节内容的情况.
    End If
    
    Call CloseBin(lFn)                      '关闭文件
End Sub

Private Function OpenBin(ByVal strFileName As String) As Long
    '打开一个BIN文件.
    '
    '返回值是已打开文件的文件号,以便外部操作.
    '如果出现错误则返回-1,具体错误原因在Err.Number中.
    '
    Dim lFn As Long
    
    On Error GoTo errH
    
    lFn = FreeFile
    Open strFileName For Binary As #lFn
    
    OpenBin = lFn
    Exit Function
errH:
    OpenBin = -1
End Function

Private Sub CloseBin(ByVal FileNum As Long)
    '关闭一个文件.
    '
    '输入参数是文件号,如果值是-1,则关闭所有已用Open打开的文件.
    '
    On Error Resume Next
    
    If FileNum <> -1 Then
        Close #FileNum
    Else
        Close
    End If
End Sub
这个示例是写入一个字节或4个字节的情况,两个文本框分别是要写入的内容及要写入的位置. 多个值要写入时,就先调用OpenBin,全写完后再调用CloseBin就行了.
jingningmeng 2013-08-05
  • 打赏
  • 举报
回复
其实我只是想将这个图里面的内容在转化为EXCEL后也可以按这样的顺序排列,因为像这种BIN格式的文件用记事本打不开,只能用ULTRAEDIT才能打开,所以记事本和EXCEL互转的软件应该不考虑。
jingningmeng 2013-08-05
  • 打赏
  • 举报
回复
引用 16 楼 xiaoyao961 的回复:
搞定没有,听不大明白
没搞定啊,就是想做个界面,可以让BIN文件里面的内容保存在EXCEL文件中,在EXCEL文件中修改后保存,又能转换成BIN文件,http://download.csdn.net/download/hehui211/4848661我在网上找到一个软件,可是文件转换不了,不知是系统问题还是其他问题。
  • 打赏
  • 举报
回复
搞定没有,听不大明白
jingningmeng 2013-07-23
  • 打赏
  • 举报
回复
引用 11 楼 Chen8013 的回复:
楼主先看下这个。 VBA的代码,你新建一个Excel工作簿,把这段代码粘贴到它的标准模块中。 运行一下,看效果。
Option Explicit

Private Sub LoadTest()
   Dim aBuffer() As Byte
   Dim strCMD$, i&, j&, r&
   strCMD = Replace(Environ$("ComSpec"), "cmd", "notepad", , , 1)
   Open strCMD For Binary As #1
   aBuffer = InputB(LOF(1), 1)
   Close #1
   Sheet1.Range("A:A").ColumnWidth = 10
   Sheet1.Range("B:Q").ColumnWidth = 3.5
   Sheet1.Range("A:Q").NumberFormatLocal = "@"
   Sheet1.Range("A:Q").HorizontalAlignment = xlCenter
   r = 1
   For i = 0 To 15
      Sheet1.Cells(r, i + 2) = Hex$(i)
   Next
   For i = 0 To (UBound(aBuffer) And &H7FFFFFF0) - 1
      r = r + 1
      Sheet1.Cells(r, 1).Value = Right$("00000000" & Hex$(i), 8)
      For j = 0 To 15
         Sheet1.Cells(r, j + 2).Value = Right$("0" & Hex$(aBuffer(i + j)), 2)
      Next
      i = i + 15
   Next
End Sub
我看了下代码,里面有几个地方不明白,标记如下: Option Explicit Private Sub LoadTest() Dim aBuffer() As Byte Dim strCMD$, i&, j&, r& //定义字符串型strCMD,字符长度(0-65400), //定义长整型变量i,j,l;字符长度为4 strCMD = Replace(Environ$("ComSpec"), "cmd", "notepad", , , 1) //?此处是将记事本里面的BIN装载进来吗?如果不是用NOTEPAD格式打开的,是用ULTRAEDIT打开的呢? Open strCMD For Binary As #1 //用二进制模式打开strCMD,并定义为1号文件 aBuffer = InputB(LOF(1), 1) //获得文件号为1文件的全部字符并传送给aBUFFER Close #1 Sheet1.Range("A:A").ColumnWidth = 10 //定义A列宽度为10 Sheet1.Range("B:Q").ColumnWidth = 3.5 //定义B到Q各列的宽度为3.5 Sheet1.Range("A:Q").NumberFormatLocal = "@" //定义A到Q列的数字内容为文本格式 Sheet1.Range("A:Q").HorizontalAlignment = xlCenter //定义A到Q列的内容为居中显示 r = 1 For i = 0 To 15 //表1的第1行中,从第2列到第17列用16进制来表示i Sheet1.Cells(r, i + 2) = Hex$(i) Next For i = 0 To (UBound(aBuffer) And &H7FFFFFF0) - 1 //?返回aBUFFER的最大下标, r = r + 1 Sheet1.Cells(r, 1).Value = Right$("00000000" & Hex$(i), 8) //写地址 For j = 0 To 15 Sheet1.Cells(r, j + 2).Value = Right$("0" & Hex$(aBuffer(i + j)), 2) //写数值 Next i = i + 15 Next End Sub
jingningmeng 2013-07-22
  • 打赏
  • 举报
回复
引用 12 楼 myjian 的回复:
我觉得楼主是想要这样的东西: 它是一个拥有多行多列表格的编辑器,界面类似EXCEL(所以想要EXCEL来编辑?) 每个表格中的数值对应BIN文件中的一个字节. 修改并保存表格后,对应BIN文件中的字节即改变. 这个要写的话并不难,可以有两种方案: 一,使用一个指定格式的EXCEL文件来实现数值编辑,再写一个EXE,用于从这个EXCEL文件中读取数值再写入指定的BIN. 操作过程,就是打开EXCEL文件,编辑,保存,再运行自己的那个EXE,载入刚编辑的EXCEL文件,确定. 这个方案的问题在于EXCEL文件需要有确定的格式,单元格与BIN文件中的数据对应关系需要事先约定好. 二,自己实现界面,即生成N个文本框,然后就在这个界面中编辑,保存后直接写入BIN中. 这个程序与上一个程序的主要区别就是编辑数据来源不再是外部EXCEL文件,而是直接程序本身取得,操作要少一些繁琐.但是界面的文本框可能会比较多. 两种方案的代码难度都很低.
您说的第一种方法是不是像下载地址: http://download.csdn.net/detail/hehui211/4848661#comment 这个里面的软件一样?
jingningmeng 2013-07-22
  • 打赏
  • 举报
回复
引用 11 楼 Chen8013 的回复:
楼主先看下这个。 VBA的代码,你新建一个Excel工作簿,把这段代码粘贴到它的标准模块中。 运行一下,看效果。
Option Explicit

Private Sub LoadTest()
   Dim aBuffer() As Byte
   Dim strCMD$, i&, j&, r&
   strCMD = Replace(Environ$("ComSpec"), "cmd", "notepad", , , 1)
   Open strCMD For Binary As #1
   aBuffer = InputB(LOF(1), 1)
   Close #1
   Sheet1.Range("A:A").ColumnWidth = 10
   Sheet1.Range("B:Q").ColumnWidth = 3.5
   Sheet1.Range("A:Q").NumberFormatLocal = "@"
   Sheet1.Range("A:Q").HorizontalAlignment = xlCenter
   r = 1
   For i = 0 To 15
      Sheet1.Cells(r, i + 2) = Hex$(i)
   Next
   For i = 0 To (UBound(aBuffer) And &H7FFFFFF0) - 1
      r = r + 1
      Sheet1.Cells(r, 1).Value = Right$("00000000" & Hex$(i), 8)
      For j = 0 To 15
         Sheet1.Cells(r, j + 2).Value = Right$("0" & Hex$(aBuffer(i + j)), 2)
      Next
      i = i + 15
   Next
End Sub
貌似可以转哦,我回去再仔细研究下
嗷嗷叫的老马 2013-07-21
  • 打赏
  • 举报
回复
我觉得楼主是想要这样的东西: 它是一个拥有多行多列表格的编辑器,界面类似EXCEL(所以想要EXCEL来编辑?) 每个表格中的数值对应BIN文件中的一个字节. 修改并保存表格后,对应BIN文件中的字节即改变. 这个要写的话并不难,可以有两种方案: 一,使用一个指定格式的EXCEL文件来实现数值编辑,再写一个EXE,用于从这个EXCEL文件中读取数值再写入指定的BIN. 操作过程,就是打开EXCEL文件,编辑,保存,再运行自己的那个EXE,载入刚编辑的EXCEL文件,确定. 这个方案的问题在于EXCEL文件需要有确定的格式,单元格与BIN文件中的数据对应关系需要事先约定好. 二,自己实现界面,即生成N个文本框,然后就在这个界面中编辑,保存后直接写入BIN中. 这个程序与上一个程序的主要区别就是编辑数据来源不再是外部EXCEL文件,而是直接程序本身取得,操作要少一些繁琐.但是界面的文本框可能会比较多. 两种方案的代码难度都很低.
舉杯邀明月 2013-07-20
  • 打赏
  • 举报
回复
没兴趣下载那种没价值的东西 6F说的说法,我也很赞同。 Bin文件,就是一个数据流,根本没什么“格式”可言。 当然,实际上不管什么文件都可以把它作为数据流来看待。   如果你要是要用Excel来列出改哪些,用VB,或者直接在Excel中用VBA代码都可以直接把那些要“更新”的数据,写到你要修改的文件中去。 比如,你在A列中,写“要更改的地址”,在B列同一行中,写下要把它改成哪个值。 然后,用 VB、VBA都可以直接从你的Excel表中把数据“提交”到你的“目标文件”中。
jingningmeng 2013-07-20
  • 打赏
  • 举报
回复
不然大家去下个BIN与EXCEL互转的软件来用下? 看到底是系统不兼容的问题还是补丁的问题?我用的是WIN7的系统,会显示INT16 太大或太小。 下载地址: http://download.csdn.net/detail/hehui211/4848661#comment
jingningmeng 2013-07-20
  • 打赏
  • 举报
回复
引用 5 楼 Chen8013 的回复:
既然是BIN的文件, VB直接以binary模式读写文件不就行了? 你都说了是‘固定地址’,直接在VB中按“地址”计算出文件中的位置,进行读写操作就行了啊。 VB中可以做个很简单的界面,显示原始值是什么,要改成什么。 直接修改文件就行了。
VB里是否有读写操作语句?只在VB.NET的代码中找到一句 FileOpen(1, FileName, OpenMode.Binary) 再说我不是只修改其中一个值,而是想同时修改很多个,并且还要有保存功能。
舉杯邀明月 2013-07-20
  • 打赏
  • 举报
回复
楼主先看下这个。 VBA的代码,你新建一个Excel工作簿,把这段代码粘贴到它的标准模块中。 运行一下,看效果。
Option Explicit

Private Sub LoadTest()
   Dim aBuffer() As Byte
   Dim strCMD$, i&, j&, r&
   strCMD = Replace(Environ$("ComSpec"), "cmd", "notepad", , , 1)
   Open strCMD For Binary As #1
   aBuffer = InputB(LOF(1), 1)
   Close #1
   Sheet1.Range("A:A").ColumnWidth = 10
   Sheet1.Range("B:Q").ColumnWidth = 3.5
   Sheet1.Range("A:Q").NumberFormatLocal = "@"
   Sheet1.Range("A:Q").HorizontalAlignment = xlCenter
   r = 1
   For i = 0 To 15
      Sheet1.Cells(r, i + 2) = Hex$(i)
   Next
   For i = 0 To (UBound(aBuffer) And &H7FFFFFF0) - 1
      r = r + 1
      Sheet1.Cells(r, 1).Value = Right$("00000000" & Hex$(i), 8)
      For j = 0 To 15
         Sheet1.Cells(r, j + 2).Value = Right$("0" & Hex$(aBuffer(i + j)), 2)
      Next
      i = i + 15
   Next
End Sub
加载更多回复(7)

2,503

社区成员

发帖
与我相关
我的任务
社区描述
VBA(Visual Basic for Applications)是Visual Basic的一种宏语言,是在其桌面应用程序中执行通用的自动化(OLE)任务的编程语言。
社区管理员
  • VBA
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧