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

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

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

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

Q&A

解決済

1回答

1090閲覧

事前に定義してある型に応じて、データの取得方法を変えたい

h-kn

総合スコア30

VB.NET

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

0グッド

0クリップ

投稿2022/10/18 03:05

前提

ExcelCreatorを利用して、該当のデータ型に応じてセル内のデータを取得しています。
(vb.net自体を最近始めたばかりなので方法を知らないだけかもしれません。)

該当のソースコード

ExcelLibModels

1Public Class [DataName] 2 Public Property 数字 As Integer? 3 Public Property 文字 As String 4 Public Property 日付 As Date? 5 Public Property 小数 As Decimal? 6End Class

main(該当処理部分のみ)

1 Dim model = New ExcelLibModels.DataName 2 model.数字 = XlsxCreator.Cell("H4").GetInteger 3 model.文字 = XlsxCreator.Cell("J4").Str 4 model.日付 = XlsxCreator.Cell("K4").GetDate 5 model.小数 = XlsxCreator.Cell("E7").GetDecimal 6 Return model

実現したいこと

  • セル毎に該当の型を毎回処理しているのですが、処理部分を一つにまとめたい

(実際のデータは200項目程あるので見づらい)

main(該当処理部分のみ)

1 Dim model = New ExcelLibModels.DataName 2 Dim GetExcelData = Function(Cells As String) 3    'ここで該当の型を判定して、データに合った方法で取りたい 4 End Function 5 model.数字 = GetExcelData("H4") 6 model.文字 = GetExcelData("J4") 7 model.日付 = GetExcelData("K4") 8 model.小数 = GetExcelData("E7") 9 Return model

試したこと

下記のように書いていたのですが、model.~の文字が長いものもあって逆に見づらくなるので避けたい。

main(該当処理部分のみ)

1 Dim model = New ExcelLibModels.DataName 2 Dim GetExcelData = Function(DataType As Type, Cells As String) 3    'case TypeName = で判定、処理 4 End Function 5 model.数字 = GetExcelData(model.数字.GetType(),"H4") 6 model.文字 = GetExcelData(model.文字.GetType(),"J4") 7 model.日付 = GetExcelData(model.日付.GetType(),"K4") 8 model.小数 = GetExcelData(model.小数.GetType(),"E7") 9 Return model

下記の方法だとmodel内に取得した情報が入らなかった。
(一部どうやってやったのかうろ覚えです、すみません)

main(該当処理部分のみ)

1 Dim model = New ExcelLibModels.DataName 2 3 with model 4 'DataTypeを型宣言せずどうやってとっていたのか不明です 5 Dim inputExcelData = Sub(DataType, Cells As String) 6     'if分岐で型を取得 7     'DataType = XlsxCreator.Cell(Cells).Str 8 End Sub 9 inputExcelData(model.数字,"H4") 10 inputExcelData(model.文字,"J4") 11 inputExcelData(model.日付,"K4") 12 inputExcelData(model.小数,"E7") 13 End with 14 15 Return model

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

利用しているのは上記に書いてある4つの型のみです。
必要情報がない場合教えてください。

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

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

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

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

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

cure_fontaine

2022/10/18 03:30

XlsxCreator.Cell("xxx") の行を200行実行するよりも、A1~Z50などの様にセルをまとめて配列に格納した方が早いのではないでしょうか。
h-kn

2022/10/18 04:13

確かにそうですね。その考え方は思いつかなかったです。 まだ当方の技術不足で、うまく活用できる方法が明確に浮かびませんが その方法も視野にいれてコーディングしてみます。
guest

回答1

0

ベストアンサー

「まとめる」という意味を取り違えていたらごめんなさい、と前置きしておきます。

ExcelLibModels.DataName に対する各プロパティが、どのセル位置にあるか示す属性を作成します。

vb.net

1Public Class CellsAttribute 2 Inherits Attribute 3 Public Sub New(cells As String) 4 Me.Cells = cells 5 End Sub 6 Public ReadOnly Property Cells As String 7End Class

これを使ってプロパティを修飾します。

vb.net

1Public Class DataName 2 <Cells("H4")> Public Property 数字 As Integer? 3 <Cells("J4")> Public Property 文字 As String 4 <Cells("K4")> Public Property 日付 As Date? 5 <Cells("E7")> Public Property 小数 As Decimal? 6End Class

リフレクションを使ってプロパティを列挙し、プロパティの型、CellsAttribute からセル位置を取得し、値をセットします。

vb.net

1Imports System.Reflection 2 3 4Dim GetExcelData = Function(DataType As Type, Cells As String) 5 Select Case DataType 6 Case GetType(Integer?) 7 Return XlsxCreator.Cell(Cells).GetInteger 8 Case GetType(String) 9 Return XlsxCreator.Cell(Cells).Str 10 Case GetType(Date?) 11 Return XlsxCreator.Cell(Cells).GetDate 12 Case GetType(Decimal?) 13 Return XlsxCreator.Cell(Cells).GetDecimal 14 Case Else 15 Return Nothing 16 End Select 17 End Function 18 19Dim model As New ExcelModels.DataName 20For Each pi As PropertyInfo In model.GetType().GetProperties() 21 Dim cellsAttr As CellsAttribute = TryCast( 22 pi.GetCustomAttributes(GetType(CellsAttribute), True).FirstOrDefault, 23 CellsAttribute) 24 If cellsAttr IsNot Nothing Then 25 Dim value As Object = GetExcelData(pi.PropertyType, cellsAttr.Cells) 26 pi.SetValue(model, value) 27 End If 28Next

追記

単純に、オーバーロード関数を作るのもいいいかもしれません。

vb.net

1Sub inputExcelData(ByRef Item As Integer?, Cells As String) 2 Item = XlsxCreator.Cell(Cells).GetInteger 3End Sub 4Sub inputExcelData(ByRef Item As String, Cells As String) 5 Item = XlsxCreator.Cell(Cells).Str 6End Sub 7Sub inputExcelData(ByRef Item As Date?, Cells As String) 8 Item = XlsxCreator.Cell(Cells).GetDate 9End Sub 10Sub inputExcelData(ByRef Item As Decimal?, Cells As String) 11 Item = XlsxCreator.Cell(Cells).GetDecimal 12End Sub

使い方

vb.net

1inputExcelData(model.数字, "H4") 2inputExcelData(model.文字, "J4") 3inputExcelData(model.日付, "K4") 4inputExcelData(model.小数, "E7")

投稿2022/10/18 05:32

編集2022/10/18 06:05
KOZ6.0

総合スコア2626

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

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

h-kn

2022/10/18 07:12

まさに望んでいたものでした! 確認したところ正常に動きかつ見やすくなり、助かりました。 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問