Excel VBA 写入混合了 ASCII 字符串和低值字节(所有值都设置为零)的输出文件 -

Excel VBA write output file with mixture of ASCII strings and low-value bytes (all values set to zero) -

在 Excel VBA (2019) 我正在尝试写出 .bri 类型的过渡交易文件格式 .bri 的规范要求重复(取决于总交易中的板数)套

  1. 每块板卡的39个ASCII码
  2. 10 个正常的 ASCII 空格
  3. 另外 22 个 ASCII 空格
  4. 另外 18 个空值字节(所有位都设置为 0) 作为文件中的连续一行。

我尝试过的示例代码示例仅通过以下方式写入 1 个电路板:

Type BriType
  boardVar As String
  byteArr(17) As Byte
End Type
Sub TestBriWrite()
Dim i, j, k, l, m As Integer
Dim FileName As String, fileNo As Integer
Dim FileLoc As Variant
Dim filler As String
Dim BriVar As BriType
  BriVar.boardVar = "010203040506070809101112131415161718192021222324252627282930313233343536373839                                "
  For m = 0 To 17
    BriVar.byteArr(m) = 0
  Next m
  FileLoc = Application.GetSaveAsFilename(Title:="Save the Deal File as xxxxx.bri")
  fileNo = FreeFile
  Open FileLoc For Binary As #fileNo
  Put #fileNo, 1, BriVar
  Close #fileNo
End Sub

这似乎接近我想要的,但在输出文件中每个板条目都以“n”开头。谁能建议我如何实现我想要做的事情?

抱歉,这是我第一次 post 加入董事会,所以我可能没有遵守所有规则。

由于 BriVar.boardVar 被声明为可变长度字符串,前两个字节用于跟踪其长度以供后续读取。

在您的示例中,您为变量分配了一个 110 个字符的字符串。因此它使用两个字节将该值存储在您的文件中。第一个字节的值为110,第二个字节的值为0。

因此,当您在文本编辑器中打开文件时,您会看到 ASCII 值 110 和 0 的字符表示,即字母 'n' 和空字符。

您可以通过声明一个固定长度的字符串来避免这两个字节。例如,假设您的字符串的长度始终为 110 个字符。然后你将声明你的字符串如下...

Type BriType
  boardVar As String * 110 '<--- fixed length string
  byteArr(17) As Byte
End Type

顺便说一句,您应该修改您的代码,以便在提示用户保存文件并单击“取消”时退出子程序....

FileLoc = Application.GetSaveAsFilename(Title:="Save the Deal File as xxxxx.bri")

If FileLoc = False Then Exit Sub '<-- user cancelled

所以这里是你的宏修改如上...

Type BriType
  boardVar As String * 110
  byteArr(17) As Byte
End Type

Sub TestBriWrite()

    Dim i, j, k, l, m As Integer
    Dim FileName As String, fileNo As Integer
    Dim FileLoc As Variant
    Dim filler As String
    Dim BriVar As BriType
    
    FileLoc = Application.GetSaveAsFilename(Title:="Save the Deal File as xxxxx.bri")
    
    If FileLoc = False Then Exit Sub
    
    BriVar.boardVar = "010203040506070809101112131415161718192021222324252627282930313233343536373839                                "
    
    For m = 0 To 17
      BriVar.byteArr(m) = 0
    Next m
    
    fileNo = FreeFile
    Open FileLoc For Binary As #fileNo
        Put #fileNo, 1, BriVar
    Close #fileNo
  
End Sub