投稿者 魔界の仮面弁士  (社会人) 投稿日時 2021/10/24 17:49:40
> Label2.Text = ListBox1.Items(ListBox1.SelectedIndex)
これはおかしいですね。
左辺の Text プロパティは String 型のプロパティですが、右辺は Object 型であるため、型が間違っています。

この場合は、
 Label2.Text = ListBox1.GetItemText(ListBox1.SelectedItem)
もしくは
 Label2.Text = ListBox1.SelectedItem?.ToString()
のように記述します。

なお、『ListBox1.Items(ListBox1.SelectedIndex)』と『ListBox1.SelectedItem』は
同じ意味になります。今回は SelectedItem の方がスマートでしょう。



> Dim fileReader As String
> fileReader = My.Computer.FileSystem.ReadAllText(Label2.Text)

> Dim fileName As String = Label2.Text  ' = "C:\test\example.txt"  
> Dim enc = System.Text.Encoding.GetEncoding("Shift_JIS")
> Dim lines As String() = System.IO.File.ReadAllLines(fileName, enc)

fileReader では「UTF-8 として読み込んだテキスト全文」が取得され、
lines には「Shift_JIS として配列に読み込んだテキスト全文」が取得されています。

同じファイルを 2 回に分けて別々の変数に読み込んでいるのは、何のためですか?
どちらか一方あれば事足りるように思うのですが。


> Xmin = TextBox2.Text
> Xmax = TextBox3.Text
> Zmin = TextBox4.Text
> Zmax = TextBox5.Text
これも本来はおかしいですね。

代入式の左辺にある変数はいずれも Single 型なのに、
右辺にある Text プロパティは String 型なので、型が一致していません。

現状は特にエラーとして検出されていないかもしれませんが、
コンパイル設定を厳密にした場合、このコードはエラーまたは警告として扱われます。
また VB6 や VBA であっても、このような代入はあまり望ましくありません)


この場合は、
 Xmin = CSng(TextBox2.Text)
とします。ただしこれでも、TextBox の内容が空だったり漢字だったりすれば変換エラーになるので、
 Single.TryParse(TextBox2.Text, Xmin)
とするとより丁寧かと思います。
TryParse を使って変換すれば、数値化できないときにはエラーとするのではなく、0 として扱われます。

> BNX = TextBox6.Text
> BNZ = TextBox7.Text
これも、Integer 型変数に String 型を代入していることになってしまうので、
 BNX = CInt(TextBox6.Text)
あるいは
 Integer.TryParse(TextBox6.Text, BNX)
ですね。


なお、「文字列を数値に変換できなかった場合に、単に 0 として扱う動作では困る」というときには、If 文でのチェックを併用します。
Dim x As Single
If Single.TryParse(TextBox1.Text, x) Then
    'Single 型への変換に成功した場合はここを通り、 
    'x には変換された数値がセットされた状態となる。 
Else
    'Single 型への変換に失敗した場合にはここを通り、 
    'x には 0 がセットされた状態となる。 
End If




上記のような型の違いを厳密にチェックするには、ファイルの先頭に以下の一文を追加します。
Option Strict On


とはいえ、現時点でこれを入れてしまうことはまだお奨めしません。
おそらく、エラー検出箇所が大量に出てきてしまい、かえって混乱してしまうでしょうから。

しかし、プログラムが一通り動き出す段階にまで進んだ後は、
上記の宣言を付与した状態で動かしてみて、型の指定ミスが無いかという点についても、
きちんと検出しておくことをお奨めします。