Vba 文件导出-奇怪字符

Vba 文件导出-奇怪字符,vba,file-io,excel,binary,codepages,Vba,File Io,Excel,Binary,Codepages,我被要求复制以下Excel VBA代码发送的文件。问题在于导出“for”循环中包含的数据。在导出文件中,数量“.111”被写为“øSã=”,“.222”被写为“øSc>”,“.333”被写为“ú~ª>” 我不完全确定这里发生了什么。但是,我将数据发送到的目标遗留系统能够正确读取这些数据(即,它被转换回原始值) 是否有人对正在发生的事情以及如何复制这种行为以便可以读取我的文件有任何想法 Type Rigo_File Status As Integer Invio As Integer Codice

我被要求复制以下Excel VBA代码发送的文件。问题在于导出“for”循环中包含的数据。在导出文件中,数量“.111”被写为“øSã=”,“.222”被写为“øSc>”,“.333”被写为“ú~ª>”

我不完全确定这里发生了什么。但是,我将数据发送到的目标遗留系统能够正确读取这些数据(即,它被转换回原始值)

是否有人对正在发生的事情以及如何复制这种行为以便可以读取我的文件有任何想法

Type Rigo_File
Status As Integer
Invio As Integer
Codice As String * 13
Quantita As Single
Udm As Integer End Type

Type type_file
Partita As String * 10
Macchina As String * 25
articolo As String * 25
colore As String * 25
note As String * 25
urgenza As Integer
Invio As String * 3
Righi(20) As Rigo_File
End Type

Dim NrOpen As Integer
Dim NomeFile As String, NomeFileTmp As String
Dim Rigo_File
Dim type_file
Dim typeM As type_file
Dim c As Integer

Sub CREATEFILE()
FILEDIR = "C:\"
FILENAMEE = "TESTFILE1.txt"

Partita = Right(Cells(1, 3), 10)
Macchina = Left(Cells(2, 3), 25)
articolo = Left(Cells(3, 3), 25)
colore = Left(Cells(4, 3), 25)
note = Left(Cells(5, 3), 25)
urgenza = CDbl(Cells(6, 3))

With typeM
.Partita = Partita
.Macchina = Macchina
.articolo = articolo
.colore = colore
.note = note
.urgenza = urgenza
.Invio = "001"
For ci = 1 To 20
.Righi(ci).Status = True
.Righi(ci).Invio = 1
.Righi(ci).Codice = Cells(8 + ci, 2)
.Righi(ci).Quantita = Cells(8 + ci, 3)
.Righi(ci).Udm = 1
Next ci
End With

NrOpen = FreeFile
On Error GoTo 0

Open FILEDIR & FILENAMEE For Random Access Write Shared As #NrOpen Len = Len(typeM)

Put #NrOpen, 1, typeM
Close #NrOpen
End Sub

Put#
以一种二进制格式写入数据——在字段前面加上长度字节,将数字转换为二进制和其他有用的内容。只要使用
Get 35;
再次读取数据,这就没有问题。虽然您的文件不是严格意义上的可读文件

如果要写入纯文本ASCII数据,请改用
打印#
写入#
并观察这两个数据之间的子文件差异(分隔符、终止CR+LF等)

您可能还需要在
Print
Write
语句中分别指定
TypeM
的每个元素-我不确定这两个元素是否接受用户定义的对象


但是要小心:你的目标系统可以读取由
Put#
创建的文件,但可能会拒绝由
Print#
Write#
创建的文件。经过一番搜索,我发现以下几点:

    Dim bArray As Byte()
    Dim val As Single = 0.111
    Dim sChars as String
    Dim arrChars as String()
    Dim sFinal as string

    bArray = BitConverter.GetBytes(val)
    sChars = BitConverter.ToString(bArray)
    arrChars = Split(sChars, "-")
    For Each sChar as string in arrChars
        sFinal & = ChrW(Convert.ToInt32(sChar, 16))
    Next

这与Put#方法和BinaryWriter.Write方法进行的转换相同,不需要写入文件

如果数据被正确读取,那么就不必担心了,但我会看看内存中数字的表示:我的问题是如何使用t-SQL复制这种二进制格式,因为这是遗留系统所能理解的全部内容。我正试图找到一些关于转换性质的文档。啊。。。那是另一个问题。。。我的第一个反应是让Excel读取一个使用
Input#1
从数据库中获取的纯文本文件,然后使用
Put#2
将其输出到另一个文件。理想情况下,能够在T-SQL中以Put#(或更新的“二进制编写器”)写入单个文件的方式进行复制会很好;可能可以使用
CAST()
CONVERT()
函数