質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Visual Basic .NET

Microsoft Visual Basic .NET (VB.NET)とはオブジェクト志向のプログラム言語です。 Microsoft"s Visual Basic 6 のバージョンアップとしてみることができますが、Microsoft.NET Frameworktによって動かされています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

2回答

2013閲覧

VB.net <配列>最小値の取得と要素の取得

mah1107

総合スコア15

VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Visual Basic .NET

Microsoft Visual Basic .NET (VB.NET)とはオブジェクト志向のプログラム言語です。 Microsoft"s Visual Basic 6 のバージョンアップとしてみることができますが、Microsoft.NET Frameworktによって動かされています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2018/11/13 10:32

<配列>最小値の取得と要素の取得

いつもお世話になっております。
現在、vb.netで配列について学んでおり、読み込んだcsvファイルの最小値を取得したいと考えております。
csvファイルにはX座標,Y座標,Z座標が入っており、それぞれの最小値を取得したいです。
最小値を求めるのにmin=PD.MIN()を使用するかと思ったのですが、
自分では解決せず、検索しても良いサンプルが見つからなかったため、こちらで質問させて頂きます。

また、PD().Xpointのすべての値も取得したいのですが、こちらも同様にFor~Nextを使用しても思ったように出来ませんでした。

最終的にはX座標のすべての値をX座標の最小値で引く式を作ろうと思っています。
Xi=PD().Xpoint-MinXpoint???

お願いばかりで申し訳ありませんが教えていただけると幸いです。
よろしくお願いします

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

vb.net

1Public Class Form1 2 3 '構造体の定義 4 Public Structure PointData 5 Dim Xpoint As Double 'X座標 6 Dim Ypoint As Double 'Y座標 7 Dim Zpoint As Double 'Z座標 8 End Structure 9 10 'メンバ変数 11 Dim PD() As PointData   '配列 12 Dim PDCount As Integer  'データの個数 13 Public NewPDCount As Integer '配列のサイズ 14 15 'アプリケーションの終了 16 Private Sub ExitButton_Click(sender As Object, e As EventArgs) Handles ExitButton.Click 17 Application.Exit() 18 End Sub 19 20 'ファイルを開く 21 Private Sub OpenButton_Click(sender As Object, e As EventArgs) Handles OpenButton.Click 22 With OpenFileDialog1 23 '選択ダイアログを開く 24 .Title = "点群ファイルの読み込み" 25 .FileName = "" 26 .Filter = "点群ファイル(*.csv)|*.csv|すべてのファイル(*.*)|*.*" 27 .DefaultExt = ".csv" 28 29 'ファイル名の表示 30 Dim result As DialogResult 31 result = OpenFileDialog1.ShowDialog 32 If result = Windows.Forms.DialogResult.OK Then 33 OpenFileText.Text = .FileName 34 MessageBox.Show(.FileName & "を読み込みました。", My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Warning) 35 36 'ファイルの読み込み 37 Try 38 Dim ReadItems() As String 'CSVの各項目を表す配列 39 40 'ファイルを開く。 41 Dim sr As New IO.StreamReader(.FileName, System.Text.Encoding.GetEncoding("Shift-JIS")) 42 43 'ファイルの最後までループ 44 Do Until sr.Peek() = -1 45 ReDim Preserve PD(PDCount) 46 ReadItems = Split(sr.ReadLine(), ",") 47 48 PD(PDCount).Xpoint = CDbl(ReadItems(0)) 49 PD(PDCount).Ypoint = CDbl(ReadItems(1)) 50 PD(PDCount).Zpoint = CDbl(ReadItems(2)) 51 52 'データ確認用 53 Console.WriteLine(PD(PDCount).Xpoint & vbTab & PD(PDCount).Ypoint & vbTab & PD(PDCount).Zpoint) 54 PDCount += 1 55 Loop 56 57 Catch ex As Exception 58 MessageBox.Show(ex.Message) 59 End Try 60 61 Else 62 MessageBox.Show(.FileName & "の読み込みに失敗しました。", 63 My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Warning) 64 End If 65 End With 66 End Sub 67 68 '要素の数を取得 69 Private Sub CountButton_Click(sender As Object, e As EventArgs) Handles CountButton.Click 70 NewPDCount = UBound(PD) 71 MessageBox.Show(NewPDCount) 72 End Sub 73 74 '座標取得 75 Private Sub GetXpointButton_Click(sender As Object, e As EventArgs) Handles GetXpointButton.Click 76 MessageBox.Show(PD(5).Xpoint & PD(5).Ypoint & PD(5).Zpoint) 77 End Sub 78 79 ~~Private Sub GetPointButton_Click(sender As Object, e As EventArgs) Handles GetPointButton.Click 80 For i As Integer = 0 To PDCount 81 Console.Write(PD(i).Xpoint) 82 Next 83 End Sub~~ 84End Class

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

CSVから読み込む時に全てのデータを処理するのですから、その時に比較して、Xpointが一番小さいインデックスを覚えておけばいいのではないでしょうか?

VB.NET

1Dim Xpoint_Min As Double = Double.MaxValue 2Do Until sr.Peek() = -1 3 ReDim Preserve PD(PDCount) 4 ReadItems = Split(sr.ReadLine(), ",") 5 6 PD(PDCount).Xpoint = CDbl(ReadItems(0)) 7 PD(PDCount).Ypoint = CDbl(ReadItems(1)) 8 PD(PDCount).Zpoint = CDbl(ReadItems(2)) 9 10 '最小値確認 11 If Xpoint_Min > PD(PDCount).Xpoint Then 12 XpointMinIndex = PDCount 13 End If 14 15 'データ確認用 16 Console.WriteLine(PD(PDCount).Xpoint & vbTab & PD(PDCount).Ypoint & vbTab & PD(PDCount).Zpoint) 17 PDCount += 1 18Loop 19

みたいな感じで

また、他のことに関してですが、どうやってどううまくいかなかったのでしょうか?
実際に書いたコードとどうダメだったのかの説明があれば、どの程度理解されているかの目安にもなりますし、人に説明することによりご自身で問題の整理が出来るかと思います。

投稿2018/11/13 11:13

YAmaGNZ

総合スコア10258

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mah1107

2018/11/13 12:41

回答ありがとうございます。 確かに質問の仕方が甘かったです。 たしかに文字として書き出せば整理ができますね。 今回の不明点は改めて整理し、質問の仕方も参考にしてみます。 ご指摘ありがとうございます。
guest

0

ベストアンサー

第一に、今から勉強をはじめるのに、VBをやるべきではないです。理由は、世の中の新しいコードのサンプルがだいたいC#で書かれているのと、初心者は古い書式かどうかが分からないなか、.NET以前の古いコードを見てつまづいてしまうからです。検索ワードすらわからない中で、ググって現代的コードを見つけるのは難しいと思います。
.NET基盤である以上、C#にも同じことができますし、既にvb.netの(負の)資産があるとしても、vb.netからc#(dll)を呼び出すのは可能(おそらく容易)なはずなので、本気でC#への方針転換を考えたほうがいいです。
※ VBAやVB6.0の経験がある人が覚える場合とは訳がちがいます

第二に、(VB.NETだとしても)Linqというのを調べて覚えてください。話はそれからです

試しに、今検索して、コンソールアプリで特定のファイルを読んでXpointの最小値と全ての値を取るコードを書いてみました。
try以下のところで下記のロジックを持ってくれば、最小値が取れると思います。

VB

1 Public Structure PointData 2 Dim Xpoint As Double 'X座標 3 Dim Ypoint As Double 'Y座標 4 Dim Zpoint As Double 'Z座標 5 ' コンストラクタ 6 Sub New(ByVal x As Double, ByVal y As Double, ByVal z As Double) 7 Xpoint = x 8 Ypoint = y 9 Zpoint = z 10 End Sub 11 End Structure 12 13 Sub Main() 14 Dim textFile As String = "C:\work\1.txt" 15 Dim enc As Text.Encoding = Text.Encoding.GetEncoding("shift_jis") 16 17 'このあたりから下をtry構文の中にもってくればいいはず 18 Dim lines As String() = System.IO.File.ReadAllLines(textFile, enc) 19 Dim dats As PointData() = lines.Select(Function(x) x.Split(",")).Select(Function(x) New PointData(Double.Parse(x(0)), Double.Parse(x(1)), Double.Parse(x(2)))).ToArray() 20 Dim AllX As Double() = dats.Select(Function(x) x.Xpoint).ToArray() 21 Dim MinX As Double = dats.Min(Function(x) x.Xpoint) 22 End Sub

投稿2018/11/13 11:06

papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

papinianus

2018/11/13 11:08

> 検索しても良いサンプルが見つからなかった と書いておられるとおりです。C#への転向を奨めます
mah1107

2018/11/13 12:26

回答ありがとうございます。 vb.netからC#への転向ということで質問があるのですが、C#もvb.netのフォームのようなデザインできるのもがあるでしょうか? あまりvb.netがどのような言語なのかわかっていなくてすいません。 フォームでデザインして動くものを作りたいのが目的です。 コードはとりあえず参考にして目的のものができるまではがんばってみようかなと思っています、、、
papinianus

2018/11/13 15:21 編集

↑の書いたコードはVB.NETですよ、ねんのため。いずれにせよ、LINQは覚えてください。VB.NETを作るのですから。VBAではないのです。 最初はLINQを書くこと自体が難しいかもしれませんが、LINQでMaxが書ければ最大値が取れます。forで書く限りバグがないか心配しないといけません。 ボタンとかチェックボックスとかはwindows formの機能なので、C#であっても同じフォームパーツを同じように配置可能です。(VB.NETもC#も".NET"という仕組みの上で動くので原理的に同じことができます、VBはVisualBasicっぽい文法で、C#はCっぽい文法なだけ)。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問