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

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

新規登録して質問してみよう
ただいま回答率
85.48%
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回答

3513閲覧

csvファイルから要素を取得し、コントロールのTextに反映させたい

NobNishihata

総合スコア12

Visual Studio

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

VB.NET

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

0グッド

0クリップ

投稿2015/08/20 07:24

VB.Net初心者です。

VB.netのフォーム上でPowerPointプレゼンテーションを表示するアプリを作っています。

  • 最初の画面はメニュー画面で、プレゼンテーションの題名を表示したボタンが並んでいる。
  • ボタンを押すとそのボタンに応じたプレゼンテーションが全画面で立ち上がる。
  • プレゼンテーションは閲覧者が自分で操作し、閲覧できる。
  • escキーを押すとプレゼンが終了し、メニュー画面に戻る。
  • ボタンは50個程度作る必要がある。

これらの条件をVisualStudio2015を使い、Windowsフォームアプリケーションで以下の形でどうにか実現しました。(あちこちのWebページからのコピペのつぎはぎですが)
50個のボタンは動的に生成し、Cドライブ直下、「pptData」フォルダにある、(ボタン名).ppsxファイルを開く形です。
PowerPointの作業画面を見せたくないので「PPTApp.Top = 900」で画面の外に追い出しています。

Imports Microsoft.Office
Imports PowerPoint = Microsoft.Office.Interop.PowerPoint

Public Class Form1
Public Sub New()
InitializeComponent()
FormBorderStyle = FormBorderStyle.None
WindowState = FormWindowState.Maximized
StartPosition = FormStartPosition.CenterScreen
Show()
End Sub

'ボタンコントロール配列のフィールドを作成 Private testButtons() As Button 'フォームのLoadイベントハンドラ Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load 'ボタンコントロール配列の作成 testButtons = New Button(50) {} 'ボタンコントロールのインスタンス作成し、プロパティを設定する SuspendLayout() Dim i As Integer For i = 1 To testButtons.Length - 1 'インスタンス作成 testButtons(i) = New Button 'ボタンプロパティ設定 testButtons(i).Name = "Button" + i.ToString() testButtons(i).Text = i.ToString '(ボタン色、サイズ等のプロパティ省略) 'イベントハンドラに関連付け AddHandler testButtons(i).Click, AddressOf testButtons_Click Next i 'フォームにコントロールを追加 Controls.AddRange(testButtons) ResumeLayout(False) End Sub Private Sub testButtons_Click(ByVal sender As Object,ByVal e As EventArgs) 'クリックされたボタンのNameをファイル名に Dim activeButton As New Button activeButton = CType(sender, Button) Dim PPTApp As PowerPoint.Application = New PowerPoint.Application PPTApp.Visible = True Dim PPTFileName As String = activeButton.Text & ".ppsx" Dim PPTFilePath As String = "C:\pptData\" & PPTFileName 'PowerPointを開く Dim PPTPresentations As PowerPoint.Presentations = PPTApp.Presentations PPTPresentations.Open(PPTFilePath, WithWindow:=Core.MsoTriState.msoTrue) 'PPT作業画面を画面の外で表示 PPTApp.Top = 900 End Sub

End Class

問題はボタンのTextで、現状だと整数の番号しか表示できず、任意のテキストを表示できないことになります。エクセルでリストを作り、csvファイルに出力したもの

1,題名1
2,題名2
3,題名3


から2次元配列を作り、題名を取得しようとして以下のコードを作りました(これもほとんどコピペですが)

Private Sub Form1_Load() Handles MyBase.Load 'csvファイル読み込み Dim strArr()() strArr = Test("C:\pptData\dataName.csv") End Sub Public Function Test(ByVal fileName As String) ' StreamReader の新しいインスタンスを生成する Dim cReader As New System.IO.StreamReader(fileName, System.Text.Encoding.Default) Dim textLines As New List(Of String()) ' 読み込んだ結果をすべて格納するための変数を宣言する Dim stResult As String = String.Empty ' 読み込みできる文字がなくなるまで繰り返す While (cReader.Peek() >= 0) ' ファイルを 1 行ずつ読み込む Dim stBuffer As String = cReader.ReadLine() ' 読み込んだものを追加で格納する Dim cols() As String cols = Split(stBuffer, ",") textLines.Add(cols) End While cReader.Close() Dim strArr()() As String strArr = textLines.ToArray Return strArr End Function

ここから、ボタンのTextプロパティに ボタン名 i に対応する strArrの値を代入する方法がどうしてもわかりません。どのようにすればよいでしょうか?

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

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

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

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

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

guest

回答2

0

以下のコードで解決しました!

Imports Microsoft.Office
Imports PowerPoint = Microsoft.Office.Interop.PowerPoint

Public Class Form1
Public Sub New()
InitializeComponent()
FormBorderStyle = FormBorderStyle.None
WindowState = FormWindowState.Maximized
StartPosition = FormStartPosition.CenterScreen
Show()
End Sub

'ボタンコントロール配列のフィールドを作成 Private testButtons() As Button ’ボタンに表示するテキスト用の二次元配列作成 Private Function Test(ByVal fileName As String) ' StreamReader の新しいインスタンスを生成する Dim cReader As New System.IO.StreamReader(fileName, System.Text.Encoding.Default) Dim textLines As New List(Of String()) ' 読み込んだ結果をすべて格納するための変数を宣言する Dim stResult As String = String.Empty ' 読み込みできる文字がなくなるまで繰り返す While (cReader.Peek() >= 0) ' ファイルを 1 行ずつ読み込む Dim stBuffer As String = cReader.ReadLine() ' 読み込んだものを追加で格納する Dim cols() As String cols = Split(stBuffer, ",") textLines.Add(cols) End While cReader.Close() Dim strArr()() As String strArr = textLines.ToArray Return strArr End Function 'フォームのLoadイベントハンドラ Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load '二次元配列用のcsvファイル読み込み Dim strArr()() strArr = Test("C:\pptData\dataName.csv") 'ボタンコントロール配列の作成 testButtons = New Button(50) {} 'ボタンコントロールのインスタンス作成し、プロパティを設定する SuspendLayout() Dim i As Integer For i = 1 To testButtons.Length - 1 'インスタンス作成 testButtons(i) = New Button 'プロパティ設定 testButtons(i).Name = i.ToString() testButtons(i).Text = strArr(i - 1)(1) ’ボタンサイズ等のプロパティは省略 'イベントハンドラに関連付け AddHandler testButtons(i).Click, AddressOf testButtons_Click Next i 'フォームにコントロールを追加 Controls.AddRange(testButtons) ResumeLayout(False) End Sub 'Buttonのクリックイベントハンドラ Private Sub testButtons_Click(ByVal sender As Object,ByVal e As EventArgs) 'クリックされたボタンのNameを表示する Dim activeButton As New Button activeButton = CType(sender, Button) Dim PPTApp As PowerPoint.Application = New PowerPoint.Application PPTApp.Visible = True Dim PPTFileName As String = activeButton.Name & ".ppsx" Dim PPTFilePath As String = "C:\pptData\" & PPTFileName Dim PPTPresentations As PowerPoint.Presentations = PPTApp.Presentations PPTPresentations.Open(PPTFilePath, WithWindow:=Core.MsoTriState.msoTrue) PPTApp.Top = 900 End Sub

End Class

投稿2015/08/21 08:33

NobNishihata

総合スコア12

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

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

0

ベストアンサー

csvの1列目が150(並びが昇順でない、抜けもありと考えて)、初期のボタン名も150と考えます。
strArr(j)(0)がボタン名と一致したら、str(j)(1)に置き換える処理です。

vb.net

1 For Each btn As Button In Me.Controls 2 For j As Integer = 0 To strArr.GetLength(0) - 1 3 If (btn.Text = strArr(j)(0)) Then 4 btn.Text = strArr(j)(1) 5 End If 6 Next 7 Next

投稿2015/08/20 08:36

編集2015/08/21 00:13
ta-kun

総合スコア59

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

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

ta-kun

2015/08/21 00:25

csvデータが1~50まであると決まっている場合、 ボタン生成前に読み込んでおけば、 testButtons(i).Text = i.ToString のところで、 testButtons(i).Text = strArr(i)(1) と出来ますよね。
NobNishihata

2015/08/21 03:31 編集

解決策のご提示、ありがとうございます。 この線でやってみましたが・・・ 二次元配列のコードをボタン生成前の部分に挿入し、 testButtons(i).Text = i.ToString を testButtons(i).Text = strArr(i)(1) に変更してみたのですが、ボタンのところで'strArrは宣言されていません' になってしまいます。 配列作成部分のコード、End Functionの前でReturn strArr の代わりに MsgBox(strArr(1)(1))などとやると、要素のテキストが表示されるので、 配列の値はとれているようです。 配列作成 開始部分の Public Function Test(ByVal fileName As String) という記述に問題があるのでしょうか?
ta-kun

2015/08/21 04:29

csvデータは、1~50件分ありますか? すいません、1点間違ってました。 iは1から始まってましたね、下記の通り、i-1としてください。 testButtons(i).Text = strArr(i-1)(1) 50件のデータがそろっていないのであれば、 strArrデータ件数に応じて、条件式で範囲チェック等の処理を行ってください。
NobNishihata

2015/08/21 08:27

以下の2つで解決しました! - csvファイルの読み込み   Dim strArr()() strArr = Test("C:\pptData\dataName.csv") をフォームのイベントハンドラの下に配置、 つまりボタンフィールドの作成と同時に行うようにする (ちょっとわかりにくいですが自己解決のところにすべてのコードを  残してみました) - strArr(i)(1)をstrArr(i-1)(1)とする ta-kunさんのおかげで無事解決することができました! ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問