[リストへもどる]
一括表示

投稿時間:2003/04/30(Wed) 11:41
投稿者名:ゆうや
Eメール:curren62036@yahoo.co.jp
URL :
タイトル:
Excelのシートからデータが読み込めません。
こんにちは。わからないことがあるので投稿してみました。
WinXP で VB6.0 SP5 を使っています。
Excelのシートからデータを読み込もうとしています。元はWin98で作成されたファイルなのですが、X
Pで保存しておくと読み込めて、以前のバージョン(多分Win98です)のままだと「#Name?」が返されて読
み込めません。
自分でも色々考えているのですが全然分からす、皆さんのお知恵をお借りしたいと思います。
何方かご存知の方、教えてください。宜しく御願いします。
以下のようなコードで実行しています。プロジェクトの参照設定で「Microsoft Excel 10.0 Object L
ibrary」にチェックはしました。

Dim n As Long                           'For文カウンター
Dim cell1 As String, cell2 As String    '読み込みセル文字
Dim excelApp As Excel.Application       'Excelアプリケーションオブジェクト
Dim excelBook As Excel.Workbook         'Excelワークブックオブジェクト
Dim excelSheet As Excel.Worksheet       'Excelシートオブジェクト

On Error Resume Next

    Set excelApp = CreateObject("Excel.Application")
    With excelApp
        .DisplayAlerts = False                          '終了時のダイアログボックスを非表示
設定
        Set excelBook = .Workbooks.Open(temp)           'Excelファイルオープン
    End With

    '★指定シート名の検索、シートオブジェクトの設定
    For n = 1 To excelApp.Worksheets.count
        If temp = "テスト" Then               '指定シート名の判定
            Set excelSheet = excelBook.Worksheets(n)
        End If
    Next

    With excelSheet
        For n = 1 To 256                           '256行迄を参照
            cell1 = .Cells(n, 1).Text              '各セル内容を取得
            cell2 = .Cells(n, 2).Text
            temp = UCase(cell1 & "," & cell2)       '連結して格納(大文字)
        Next
    End With

    '★エクセルオブジェクトの解放
    excelApp.Quit                                       'Excelアプリケーションの終了
    Set excelApp = Nothing                              'アプリケーションオブジェクト解放
    Set excelBook = Nothing                             'ワークブックオブジェクト解放
    Set excelSheet = Nothing                            'シートオブジェクト解放

投稿時間:2003/04/30(Wed) 20:12
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re: Excelのシートからデータが読み込めません。
> XPで保存しておくと読み込めて、以前のバージョン(多分Win98です)のままだと「#Name?」が返されて読
> み込めません。

エラー値 #NAME? は、Excel で認識できない名前が使われた場合に返されます。

どこの部分ででるのですか? そのデータは Excel上ではどのように表示されていますか?
又、Excelのどのバージョンで作成されたデータですか?
この場合OSは関係ないかと思いますよ

>     With excelSheet
>         For n = 1 To 256                           '256行迄を参照
>             cell1 = .Cells(n, 1).Text              '各セル内容を取得
>             cell2 = .Cells(n, 2).Text
>             temp = UCase(cell1 & "," & cell2)       '連結して格納(大文字)
>         Next
>     End With

因みに、この部分は何をされているのでしょうか?したいのでしょうか?

投稿時間:2003/05/01(Thu) 10:32
投稿者名:ゆうや
Eメール:curren62036@yahoo.co.jp
URL :
タイトル:
Re^2: Excelのシートからデータが読み込めません。
花ちゃんさん>
御返事ありがとう御座います。割愛し過ぎてよく分かりませんでしたね。具体的に書きます。
元ファイルはWin98 Excel2000で作りました。
シート名「Sheet1」のセルA1に0〜255迄の10進数値を入れ、セルB1に「=dec2hex(A1,2)」数式を入れま
す。
シート名「テスト」のセルA1に「="BW" & Sheet1!B1」数式を入れセルB2には何か適当な
文字を入れます。
これが256行迄続いています。で、昨日掲示板に載せましたコードをWinXP Excel2002が入っているPCで
実行しようとしました。

因みにVBコーディングはWinXP Excel2002が入っているPCで作業しています。
「cell1 = 〜」の行で"BWxx"という文字列が入るはずなのですが読み込めません。
あと、WinXPで作業したプロジェクトファイルをWin98のPCに入れて実行しようとしたら「Microsoft Exc
el10.0 Object Library」が参照不可になっていました。なのでWin98上で「Microsoft Excel 9.0 Object
Library」を参照するように変更しました。

temp = UCase〜の部分は、tempに格納した文字列をMSCommで送信する、ということになっていますが、
内容上書きませんでした。

OSは関係ないというご指摘から、Excelのバージョン違いによるものかな?とも思っています。
一応昨日のコードを記載させて頂きます。

なかなか分かりません。どうか皆様宜しくお願いします。

Dim n As Long 'For文カウンター
Dim cell1 As String, cell2 As String '読み込みセル文字
Dim excelApp As Excel.Application 'Excelアプリケーションオブジェクト
Dim excelBook As Excel.Workbook 'Excelワークブックオブジェクト
Dim excelSheet As Excel.Worksheet 'Excelシートオブジェクト

On Error Resume Next

Set excelApp = CreateObject("Excel.Application")
With excelApp
    .DisplayAlerts = False '終了時のダイアログボックスを非表示設定
    Set excelBook = .Workbooks.Open(temp) 'Excelファイルオープン
End With

'★指定シート名の検索、シートオブジェクトの設定
For n = 1 To excelApp.Worksheets.count
    If excelApp.Worksheets(n).name = "テスト" Then '指定シート名の判定
        Set excelSheet = excelBook.Worksheets(n)
    End If
Next

With excelSheet
    For n = 1 To 256 '256行迄を参照
        cell1 = .Cells(n, 1).Text '各セル内容を取得(此処で"BWxx"が入るはずなのです)
        cell2 = .Cells(n, 2).Text
        temp = UCase(cell1 & "," & cell2) '連結して格納(大文字)
    Next
End With

'★エクセルオブジェクトの解放
excelApp.Quit 'Excelアプリケーションの終了
Set excelApp = Nothing 'アプリケーションオブジェクト解放
Set excelBook = Nothing 'ワークブックオブジェクト解放
Set excelSheet = Nothing 'シートオブジェクト解放

投稿時間:2003/05/01(Thu) 12:28
投稿者名:みゃお
Eメール:
URL :
タイトル:
Re^3: Excelのシートからデータが読み込めません。
=dec2hex(A1,2)
は 分析ツールアドインをチェックしていないと使えないのでは?

投稿時間:2003/05/01(Thu) 14:33
投稿者名:ゆうや
Eメール:curren62036@yahoo.co.jp
URL :
タイトル:
Re^4: Excelのシートからデータが読み込めません。
みゃおさん>
御返事どうもありがとう御座いました。
> =dec2hex(A1,2)
> は 分析ツールアドインをチェックしていないと使えないのでは?
はい。しかし元ファイル上では「分析ツールアドイン」にはチェックしています。「ツール」メニュー→「アドイン」ですよね??「条件付き合計ウィザード」「分析ツール」「分析ツール-VBA」にチェックしています。WinXP上も同じ設定です。

因みに、n=1の時、「cell1 = .Cells(n,1)」のところで「excelsheet.Cells(1,1)」を「ウォッチ式の追
加」で見たところ、Textプロパティには「"NAME?"」が、Value2プロパティには「エラー2029
」が入っていました。

また、式をdec2hexではなく、SUMとか、ただの足し算とか入れるとエラーは出ませんでした。

投稿時間:2003/05/01(Thu) 21:23
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^5: Excelのシートからデータが読み込めません。
試してみたらやはりそのようになりますね。
VBからシートを開くとだめのようですね!
計算式やデータをすべて削除して書き直してもそのシートを使えばだめの
ようです。

投稿時間:2003/05/02(Fri) 11:45
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^5: Excelのシートからデータが読み込めません。
下記のように追加して見て下さい。

  >     Next
  > End With
  >

    '一旦チェックを解除
    excelApp.AddIns("分析ツール").Installed = False
    '新たにチェックをする
    excelApp.AddIns("分析ツール").Installed = True
    '再計算
    excelSheet.Calculate


  > '★エクセルオブジェクトの解放
  > excelApp.Quit 'Excelアプリケーションの終了
  > Set excelApp = Nothing 'アプリケーションオブジェクト解放

投稿時間:2003/05/02(Fri) 14:44
投稿者名:みゃお
Eメール:
URL :
タイトル:
Re^5: Excelのシートからデータが読み込めません。
[XL] CreateObject を使用しているとアドインが読み込まれない
http://support.microsoft.com/default.aspx?scid=kb;ja;108888

を見ると、自力でファイル名を指定して開かなければならないようですよ。
アドインファイルを探して試してみてください。

投稿時間:2003/05/12(Mon) 22:11
投稿者名:ゆうや
Eメール:curren62036@yahoo.co.jp
URL :
タイトル:
解決: Excelのシートからデータが読み込めません。
花ちゃんさん、みゃおさん>
書き込みが遅くなりました・・・
お返事ありがとうございました。こちらでデバッグした結果、
結局「分析ツール」で再計算しないといけなかったようです。

みゃおさんが教えてくださった方法を試したのですがエラーが出たりして、エラーとるのに少々時間がかかりそうでした。
(ライブラリのパスのところでエラーが出ていました。)
花ちゃんさんが教えてくださった方法を試したのですがこちらはエラーは出ず、アプリケーションにすぐ組み込めそうでした。
また、「セルの内容が読めない」というくともなく普通に読み込めました。
なので、今回は申し訳ないのですが花ちゃんさんが教えてくださった方法を採用させていただこうと思います。
みゃおさんが教えてくださった方法も検討したいと思います。

教えてくださってどうもありがとうございました!!!!


実際のモジュールのコードを以下に掲載させていただきます。他の方の参考になれば、と思います。


Dim n As Long                           'For文カウンター
Dim temp As String                      '一時使用文字列変数
Dim xlsver As String                    '使用Excel Version
Dim cell1 As String, cell2 As String    '読み込みセル文字
Dim excelApp As Object                  'Excelアプリケーション用オブジェクト
Dim excelBook As Object                 'Excelワークブック用オブジェクト
Dim excelSheet As Object                'Excelシート用オブジェクト

On Error Resume Next

    '★Microsoft Excelオブジェクトの取得(InstallされているExcel Versionを取得、設定)
    'Microsoft Excel *.* Object Library の参照設定をしなくても可
    'Excelのバージョンが9(Excel2000)なら"Excel.Application.9"
    'Excelのバージョンが10(Excel2002)なら"Excel.Application.10"
    'インターネット上から情報を頂きました。
    Set excelApp = CreateObject("Excel.Application")    'Excelオブジェクトの取得
    xlsver = excelApp.Version                           'Excel versionの取得
    xlsver = Left(xlsver, InStr(1, xlsver, ".") - 1)
    xlsver = "Excel.Application." & xlsver              '使用Excel Version名設定
    Set excelApp = Nothing                              'Exceオブジェクトの解放
    Set excelApp = CreateObject(xlsver)                 'Excelオブジェクト再取得
    
    '★Excel再設定、ワークシートオープン
    '(変数tempには予めファイル名がフルパスで設定されているものとします)
    With excelApp
        '「分析ツール」一旦チェックを解除、設定しなおす
        .AddIns("分析ツール").Installed = False         '「分析ツール」チェック解除
        .AddIns("分析ツール").Installed = True          '「分析ツール」チェック設定
        .DisplayAlerts = False                          '終了時のダイアログボックスを非表示設定
        Set excelBook = .workbooks.Open(temp)           '指定Excelファイルオブジェクトの取得
    End With

    '★指定シート名の検索、シートオブジェクトの設定
    '指定シート名「テスト」の検索
    For n = 1 To excelBook.Sheets.count
        If excelBook.Sheets.Item(n).name = "テスト" Then'指定シート名の判定
            Set excelSheet = excelBook.Worksheets(n)    'シートオブジェクトの取得
            Exit For
        End If
    Next

    '★データの取得
    temp = vbNullString: cell1 = vbNullString: cell2 = vbNullString
    n = 1
    With excelSheet
        .Calculate                                      '「分析ツール」を使ってExcel内で再計算
        '★------------------------------------------★
        '   此処から先は各自の処理に変更してください。
        '★------------------------------------------★
        For n = 1 To I2C_DAT_NUM
            DoEvents
            cell1 = .Cells(n, 1)                        '各セル内容を取得
            cell2 = .Cells(n, 2)
            temp = UCase(cell1 & "," & cell2)           'A列とB列を連結して格納(大文字)
        Next
    End With

    '★エクセルオブジェクトの解放(これは必要)
    excelApp.Quit                                       'Excelアプリケーションの終了
    Set excelApp = Nothing                              'アプリケーションオブジェクト解放
    Set excelBook = Nothing                             'ワークブックオブジェクト解放
    Set excelSheet = Nothing                            'シートオブジェクト解放