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

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

ただいまの
回答率

90.49%

  • Visual Studio

    1903questions

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

  • VB.NET

    938questions

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

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 1,445

NobNishihata

score 6

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の値を代入する方法がどうしてもわかりません。どのようにすればよいでしょうか?
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/08/21 09:25

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

    キャンセル

  • 2015/08/21 11:11 編集

    解決策のご提示、ありがとうございます。
    この線でやってみましたが・・・

    二次元配列のコードをボタン生成前の部分に挿入し、
    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)
    という記述に問題があるのでしょうか?

    キャンセル

  • 2015/08/21 13:29

    csvデータは、1~50件分ありますか?

    すいません、1点間違ってました。
    iは1から始まってましたね、下記の通り、i-1としてください。
    testButtons(i).Text = strArr(i-1)(1)

    50件のデータがそろっていないのであれば、
    strArrデータ件数に応じて、条件式で範囲チェック等の処理を行ってください。

    キャンセル

  • 2015/08/21 17:27

    以下の2つで解決しました!

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

    - strArr(i)(1)をstrArr(i-1)(1)とする

    ta-kunさんのおかげで無事解決することができました!
    ありがとうございました!

    キャンセル

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Visual Studio

    1903questions

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

  • VB.NET

    938questions

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