DOBON.NET DOBON.NETプログラミング掲示板過去ログ

エクセル取込処理について

環境/言語:[VB.NET、.NET Frameworkのバージョン(2.0 SP2)]
分類:[.NET]

こんにちは。

現在、vb.netにて開発を行っています。
開発環境としては、c/sでvs2005,postgresを使用しています。

現在、エクセルにて入力したデータを画面に取込む処理を作成しているのですが、
エクセルの列を一部非表示にして取り込み処理を行うと、エラーとなってしまいます。

この非表示列を、表示状態にして取込を行うと正常に終了します。

非表示だと取込まれないのでしょうか?
■No27532に返信(nosuさんの記事)

取込み方をどのように行っているかというのが分からないと
なんとも言えないです。
■No27534に返信(shuさんの記事)
> ■No27532に返信(nosuさんの記事)
>
> 取込み方をどのように行っているかというのが分からないと
> なんとも言えないです。

すみません。
取り込み方としては、対象のEXCELを選択し、そのEXCELをオープンし、
各CELLの値をチェックし、あてはまれば、その値をDBに保存する。

という方法です。
■No27536に返信(nosuさんの記事)
> 取り込み方としては、対象のEXCELを選択し、そのEXCELをオープンし、
> 各CELLの値をチェックし、あてはまれば、その値をDBに保存する。
尋ねているのは、手順ではなく、技術的に何を用いているか、どういったコードで実現しているかといった話だと思います。

(1) COM を参照設定で追加した?(事前バインディング)
(2) 遅延バインディング(Activator.CreateInstance, InvokeMember などを使う)を利用しているか?
 http://support.microsoft.com/kb/302902/ja
(3) 対象のウィンドウから無理矢理テキストを引っ張るような仕組みを使っているか?
(4) Microsoft.Jet.OLEDB を使っているか?
 http://support.microsoft.com/kb/316934/ja

また、使っている手法のほかに、どういったコードを書いているかは示すべきです。
そうでないと、使い方の問題なのか、使っている手法における制限なのか判断しようがありません。
■No27536に返信(nosuさんの記事)
> ■No27534に返信(shuさんの記事)
>>■No27532に返信(nosuさんの記事)
>>
>>取込み方をどのように行っているかというのが分からないと
>>なんとも言えないです。
> 
> すみません。
> 取り込み方としては、対象のEXCELを選択し、そのEXCELをオープンし、
> 各CELLの値をチェックし、あてはまれば、その値をDBに保存する。
> 
> という方法です。
Azuleanさんの言うようにこれでは何が駄目なのか分かりません。

ちなみに
Sheet1の A1〜D3までセルに設定しておいて
B列を非表示にして
Sheet1に次のコードを記述し実行してもaには問題なくA1〜D5までの値が入ります。(A4〜D5はEmptyになります)

Public Sub Test()
    Dim a As Variant
    a = Range("A1:D5").Value2
End Sub
■No27539に返信(shuさんの記事)
■No27539に返信(shuさんの記事)

Private Function Set_MeisaiWork(ByVal pFileName As String) As String
Dim dSQL As String = ""
Dim rStr As String = ""
Dim rTB As New DataTable
Dim strItemName(0 To 15) As String
Dim i As Integer
Dim cnt_midashi1 As Integer
'テナント合計(収入)見出しテーブル
Dim dkmk_mei1() As String = {"", ""}
Dim dkmk_data1() As String 'テナント合計(収入)明細テーブル
'収入明細行を求める
Dim cnt_gyo As Integer
Dim cnt_gyo2 As Integer

'回収支払明細ワークのクリア
dSQL = "select func_RM04006('" & clsCommon.ComData.UserID & "','')"
rStr = clsCommon.SelectDataSQL(dSQL, rTB)
If Not rStr.Equals("") Then Return rStr

'EXCELファイルより回収支払明細ワークへ出力する
Try
''ファイルオープン
objApp = CreateObject("Excel.Application")
objBooks = objApp.Workbooks
objBook = objBooks.Open(pFileName)
objSheets = objBook.Worksheets
objSheet = objSheets.Item(1)
objCells = objSheet.Cells
objApp.Visible = False

dkariNo = 0 '仮回収支払番号の初期化(回収支払番号採番用)

'****************** テナント合計見出し項目の取得 *****************
'物件番号の設定
objCell = objCells(2, 3)
If objCell.text = "" Then
rStr = "E00091" 'レイアウト不正
Throw New ApplicationException("")
End If
clsCommon.ComData.Bukken.Code = objCell.text
Excel_ObjCell_Nothing() 'objCell解放処理

'物件名の設定
objCell = objCells(3, 3)
If objCell.text = "" Then
rStr = "E00091" 'レイアウト不正
Throw New ApplicationException("")
End If
clsCommon.ComData.Bukken.Name = objCell.text
Excel_ObjCell_Nothing() 'objCell解放処理

'固定見出しのチェック
strItemName(2) = "物件内訳番号"
strItemName(3) = "物件内訳名称"
strItemName(4) = "契約先名称"
strItemName(5) = "計上月"
strItemName(6) = "テナント入金日"
For i = 2 To 6
objCell = objCells(C_MeisaiStartRow, i)
If objCell.text <> strItemName(i) Then
rStr = "E00091" 'レイアウト不正
Throw New ApplicationException("")
End If
Excel_ObjCell_Nothing() 'objCell解放処理
Next

'見出し数を求める
i = 1
cnt_midashi1 = 0
Do
i += 1
objCell = objCells(C_MeisaiStartRow, i)
'指定セルが空白までカウントする
If objCell.text = "" OrElse objCell.text Is DBNull.Value Then
Excel_ObjCell_Nothing() 'objCell解放処理
Exit Do
Else
cnt_midashi1 += 1
ReDim Preserve dkmk_mei1(cnt_midashi1)
dkmk_mei1(cnt_midashi1) = objCell.text '見出し名を退避
End If
Excel_ObjCell_Nothing() 'objCell解放処理
Loop

ReDim dkmk_data1(cnt_midashi1)

'物件番号の名称と番号を見出し部とデータ部の各テーブル(0)番目へ設定
dkmk_mei1(0) = "物件番号"
dkmk_data1(0) = ComData.Bukken.Code

'回収支払明細ワークの空テーブルを取得
NewDataTable("回収支払明細ワーク", Me.pCustumTB(1))

'見出しの金額項目が存在する場合のみ実施
If cnt_midashi1 > C_MeisaiStartColumns Then
'テナント明細行数分処理を実行
cnt_gyo = C_MeisaiStartRow
Do
'次行の物件内訳番号が空白の場合、テナント明細終わりと判断する。
objCell = objCells(cnt_gyo + 1, 2)
If objCell.text = "" Then
Excel_ObjCell_Nothing() 'objCell解放処理
Exit Do
End If
Excel_ObjCell_Nothing() 'objCell解放処理
cnt_gyo += 1
'横一列分のデータを退避
For i = 1 To cnt_midashi1
objCell = objCells(cnt_gyo, i + 1)
dkmk_data1(i) = objCell.text
Excel_ObjCell_Nothing() 'objCell解放処理
Next
clsCommon.ComData.Utiwake.Code = dkmk_data1(1)
clsCommon.ComData.Data_From = dkmk_data1(4)
'回収支払明細テーブルへデータを作成
rStr = fEditData1(dkmk_mei1, dkmk_data1, cnt_midashi1)
Loop
End If

'****************** 管理合計見出し項目の取得 ***********************

'ヘッダ行検索
For i = (cnt_gyo) To (cnt_gyo + 50)
objCell = objCells(i, 2)
If objCell.text = "収支区分" Then
Excel_ObjCell_Nothing() 'objCell解放処理
Exit For
ElseIf i >= (cnt_gyo + 50) Then
rStr = "E00091" 'レイアウト不正
Throw New ApplicationException("")
End If
Excel_ObjCell_Nothing() 'objCell解放処理
Next
cnt_gyo2 = i 'ヘッダ行

・・・省略・・・

ここで、
'回収支払明細テーブルへデータを作成
rStr = fEditData1(dkmk_mei1, dkmk_data1, cnt_midashi1)
を呼んでいるところで、

'見出しと1行分のテナント合計(収入)excelデータとitemカウントより回収支払明細ワークを編集する
Public Function fEditData1(ByVal dkmk_mei() As String, ByVal dkmk_data() As String, ByVal dCntClm As Integer) As String

Dim rStr As String = ""
Dim dHinmei As String = ""
Dim dHinmei_w As String = ""
Dim dkbn0 As String = ""
Dim dkbn1 As String = ""
Dim dkbn2 As String = ""
Dim dKngk_J() As Integer = {0, 0} '入出金額
Dim dKngk_Y() As Integer = {0, 0} '請求金額
Dim StringPos As Integer = 0
Dim sb As String = ""
Dim rTB As New DataTable
Dim i, j As Integer

'内訳番号未入力
If clsCommon.ComData.Utiwake.Code = "" Then Return "E00091" 'レイアウト不正
'計上年月未入力
If clsCommon.ComData.Data_From = "" Then Return "E00091" 'レイアウト不正

Try

For i = C_MeisaiStartColumns To dCntClm - 1
'金額が設定されている項目を検索
If dkmk_data(i) <> 0 Then
'ワーク金額のクリア
For j = 0 To 1
dKngk_J(j) = 0
dKngk_Y(j) = 0
Next
'金額(実)〜消費税(予定)までの金額を設定
For j = 0 To 3
If dCntClm < (i + j) Then
Exit For
End If
'品名をセット
rStr = GetHinmei(dkmk_mei(i + j), dHinmei_w)
If j = 0 Then
dHinmei = dHinmei_w
ElseIf dHinmei <> dHinmei_w Then
'品名が異なる場合は、BREAK
Exit For
End If
'金額の設定
Select Case rStr
Case "1"
dKngk_J(0) = dkmk_data(i + j)
Case "2"
dKngk_J(1) = dkmk_data(i + j)
Case "3"
dKngk_Y(0) = dkmk_data(i + j)
Case "4"
dKngk_Y(1) = dkmk_data(i + j)
End Select
Next

・・・省略・・・

「 If dkmk_data(i) <> 0 Then 」

の部分で、落ちてしまいます。
エラー内容:String "" から型 'Double' への変換は無効です。

エクセルのセルには、「0」を入れているのですが、列を非表示にしているため
""で取ってきているみたいです。

■No27618に返信(nosuさんの記事)

Text => Value

DOBON.NET | プログラミング道 | プログラミング掲示板