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

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

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

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

Q&A

解決済

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

h-kn
reimei

総合スコア10

VB.NET

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

1回答

0グッド

0クリップ

226閲覧

投稿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つの型のみです。
必要情報がない場合教えてください。

以下のような質問にはグッドを送りましょう

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

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

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

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

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

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

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

適切な質問に修正を依頼しましょう。

cure_fontaine

2022/10/18 03:30

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

2022/10/18 04:13

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

回答1

1

ベストアンサー

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

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

総合スコア2252

reimei🎉を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

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

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

このような回答には修正を依頼しましょう。

回答へのコメント

h-kn

2022/10/18 07:12

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

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

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

VB.NET

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