0

次の 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

サブ終了

4

2 に答える 2

1

いろいろ探した結果、以下を見つけました。

    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 メソッドと同じ種類の変換を行います。

于 2013-04-23T09:37:07.217 に答える
1

Put #一種のバイナリ形式でデータを書き込みます - 長さバイトの先行フィールド、数値をバイナリおよびその他の有用なものに変換します。Get #これは、データを再度読み込むために使用する限り問題ありません。あなたのファイルは厳密には人間が読めるわけではありませんが。

プレーン テキストの ASCII データを書きたい場合は、代わりにPrint #orを使用Write #し、これら 2 つの微妙な違い (区切り文字、CR+LF の終了など) を観察します。

orステートメントTypeMで の各要素を個別に指定する必要がある場合もあります。これら 2 つがユーザー定義オブジェクトを受け入れるかどうかはわかりません。Print #Write #

ただし、注意してください: によって作成されたファイルを読み取ってもよいターゲット システムは、またはPut #によって作成されたファイルを拒否する場合があります。Print #Write #

于 2013-04-18T17:43:49.963 に答える