投稿者 魔界の仮面弁士  (社会人) 投稿日時 2021/10/18 14:20:05
> 当方の情報が不明確で申し訳ありません.
💠プログラミングは一文字違っただけでも異なった結果になりえます。
プログラムコードは全角半角も含めて、一字一句、常に正確な記述を心がけましょう。
エラーメッセージを転記する場合も然り。


> Print #1, X(DT), Y(DT), U1(DT), -U2(DT)・・・実際は半角文字
Print ステートメントでカンマ区切りなので、タブストップ位置まで半角空白が補完されますね。
また、これらの変数は、すべて Single 型の一次元配列とのことなので、
先に提示したコードを Integer → Single に置きかえれば、ほぼそのまま使えると思います。


> その結果,いくつかのコマンドに赤の波下線がついており
🔰言語間の移植の際には、両方の言語の知識が無いと、適切な翻訳ができません。
英語の手紙をフランス語に翻訳する際には、英語とフランス語の両方の知識が求められますよね。

機械的な自動変換に頼って翻訳することもできなくは無いですが、それぞれの
開発言語の特性を理解していないと、回りくどい処理になってしまいがちです。


> Dim enc As Encoding = Encoding.GetEncoding("Shift_JIS")・・・Encordingが定義されていません
『Encording』ではなく
「Encoding」ではありませんか? スペルをもう一度確認してみてください。


> いくつかのコマンドに赤の波下線がついており
スペルが正しい場合、エラーとして表示される波線部にマウスカーソルを重ねると、
修正候補が提示されるので、それをクリックすることで解決できることが多いです。


今回の場合は、「ファイルの先頭にて、名前空間を Imports しているかどうか」が肝です。

先のコードではそれが分かるよう、コメントにて
> 'Imports System.IO 
> 'Imports System.Text
という文を示してあったと思います。
この宣言をファイルの先頭に移動して、コメントを解除してみてください。

もしも名前空間や Imports という言葉が分からない場合は、VB 中学校の 初級講座 [改訂版] の
  第5回 クラスと名前空間
  第7回 クラスを使う仕組み
あたりを参照してみると良いでしょう。
https://www.umayadia.com/VBStandard2/VBStandard2Toc.htm


Imports System.Text として名前空間を指定しておくことで、
Dim enc As System.Text.Encoding という宣言を
Dim enc As Encoding と短く書くことができるようになります。


> From s In File.ReadLines(fileName, enc)・・・・ファイルは定義されていません.
『ファイルは定義されていません.』ではなく
「'File' は宣言されていません。」ですよね?

ファイル → 'File'
    定義 → 宣言
      . → 。


だとすればこれも、 System.IO 名前空間が示されていないことが原因です。
以下のいずれかを行ってみてください。個人的には 2 または 1 をお奨めします。

修正案1) ファイルの先頭にて「Imports System.IO」という宣言文を追加しておく。

修正案2) プロジェクトのプロパティの[参照]タブにて、
 「インポートされた名前空間」の一覧から System.IO の欄に☑を付ける。

修正案3) File クラスの名前空間である System.IO. を、省略せずに毎回書き添える。
 From s In System.IO.File.ReadLines(fileName, enc)


> For Each X In q
>   Single.TryParse(X.Columns(0), A(X.RowIndex))・・・・Columns,RowindexはSngleのメンバーではありません.
変数の型が間違っているからですね。X のデータ型を見直してみてください。

我々ふたりのコードを見比べてみましょう。

'私の書いたコード 
Dim A(upperIndex), B(upperIndex), C(upperIndex), D(upperIndex) As Integer
For Each x In q
  Integer.TryParse(x.Columns(0), A(x.RowIndex))
  Integer.TryParse(x.Columns(1), B(x.RowIndex))

' はちさんの書いたコード 
Dim X(upperIndex), Y(upperIndex), UD1(upperIndex), UD2(upperIndex) As Single
For Each X In q
  Single.TryParse(X.Columns(0), A(X.RowIndex))
  Single.TryParse(X.Columns(1), B(X.RowIndex))



Integer → Single への置き換えは良いと思いますが、
私のコードにあった変数 A, B, C,D の宣言は、一体どうされたのでしょうか。
配列名として A,B,C,D という名前を指定されたのは、はちさん御自身だったはずですよね。

それなのにその宣言を削除すれば、A(x.RowIndex) という指定が出来なくなることは自明です。
一見すると名前を変更したように見えますが、ループ内の変数名は A, B, C, D のままですし…。

列を表す変数を、Integer 配列な B, C から、Single な Y, U1 などへ置き換えるのであれば、
  Integer.TryParse(x.Columns(1), C(x.RowIndex))
という私のコードは
  Single.TryParse(x.Columns(1), U1(x.RowIndex))
になるべきですが、はちさんのコードでは、
  Single.TryParse(X.Columns(2), C(X.RowIndex))
になっていますよね。置き換える場所を間違えています。


それ以上に問題なのは、For Each のループカウンタで使っていた変数 x が、
「Dim X(upperIndex) As Single」と宣言しなおされている点です。

元のコードでの「For Each x In q」の x とは、Columns プロパティや RowIndex プロパティを持つ
『匿名型』の変数だったのに対して、それを勝手に「Dim X(upperIndex) As Single」に変更したため、
『Single 型』の変数に置き換わってしまっています。

Single 型には Columns プロパティや RowIndex プロパティなどありませんよね。


匿名型は良く分からない…というのであれば、
2021/10/16 11:56:21 の投稿コードの代わりに
2021/10/16 19:16:15 の投稿コードを使ってみてください。
(Visual Basic 2015 以降向けに書かれたコードです)