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

投稿時間:2002/12/18(Wed) 14:23
投稿者名:秋風
Eメール:
URL :
タイトル:
Excelがタスクに残る現象について
こんにちは。

 質問なのですが、下記のコードで、csvファイルをエクセルに
変換しているのですが、1MBくらいのファイルになると、Excelが
タスクに残ってしまいます。(それ以下は、タスクには残りません
が)ずっと考えていましたが、どうにも
対策が思いつきません。どなたかお分かりの方、下記のコードで、
不備な点を教えて下さい。申し訳ない質問ですが、お願いします。
m(_ _)m
Private Sub Output_Excel_cmd_Click()

    On Error GoTo Err_
    Dim xlApp As excel.Application
    Dim xlBook As excel.Workbook
    Dim xlSheet As excel.Worksheet
    Dim aaa As String
    Dim bbb As String
    Dim ccc As String
    Dim ddd As String
    Dim eee As String
    Dim fff As String
    Dim ggg As String
    Dim hhh As String
    Dim lngline As Long
    Dim introw As Integer
    Dim strlst As String
    Dim strday As String
    Dim strtime As String
    Dim intflag As Integer
    Dim intfileno As Integer
    Dim iii As String
    Dim strid As String
    Dim iii_1 As String
    Dim kkk As String
    Dim lngfline As String
    Dim strpn As String
    Dim strpn_1 As String
    Dim strpn_2 As String
    Dim inticheck As Integer
    Dim intscheck As Integer
    Dim intdcheck As Integer
    
    Screen.MousePointer = vbHourglass
    intfileno = FreeFile()
    lngline = 1
    strlst = ファイル名lst.Text
    strpn_1 = RightB(strlst, 24)
    strpn_2 = LeftB(strpn_1, 2)
    
    Select Case strpn_2
    Case "I"
        strpn = "abc"
    Case "J"
        strpn = "etd"
    Case "K"
        strpn = "agd"
    Case "B"
        strpn = "gee"
    End Select
    
    If strlst = Empty Then
        MsgBox "出力したいファイルを選んで下さい。", vbCritical + vbOKOnly, "警告"
        Screen.MousePointer = vbDefault
        Exit Sub
    Else
        Open strlst For Input As #intfileno
        Set xlApp = New excel.Application
        Set xlBook = xlApp.Workbooks.Add
        Set xlSheet = xlBook.Worksheets(1)
        
        With xlApp
            .ScreenUpdating = False
            .DisplayAlerts = False
        End With
        With xlSheet
            .Cells(2, 1).Value = "a:"
            .Cells(2, 6).Value = "g:"
            .Cells(2, 8).Value = strpn
            .Cells(3, 1).Value = "c:"
            .Cells(3, 6).Value = "d:"
            .Cells(4, 1).Value = "e"
            .Cells(4, 2).Value = "f"
            .Cells(4, 3).Value = "gf"
            .Cells(4, 4).Value = "i"
            .Cells(4, 5).Value = "h"
            .Cells(4, 6).Value = "i"
            .Cells(4, 7).Value = "b"
            .Cells(4, 8).Value = "z"
            .Cells(4, 9).Value = "t"
            .Cells(4, 10).Value = "fa"
            .Cells(4, 11).Value = "fe"
            .Cells(4, 12).Value = "wd"
            .Cells(4, 13).Value = "qe"
        End With
        
        Call Bord_C(xlSheet, 2, 1)
        Call Bord_C(xlSheet, 2, 6)
        Call Bord_C(xlSheet, 3, 1)
        Call Bord_C(xlSheet, 3, 6)
        xlSheet.Range("A4:M4").Font.Bold = True
                                                    
                                                    
        Do While Not EOF(1)
            Line Input #intfileno, aaa
            bbb = Trim(LeftB(aaa, 14))
            ccc = Trim(MidB(aaa, 15, 16))
            ddd = Trim(MidB(aaa, 31, 22))
            eee = Trim(MidB(aaa, 53, 16))
            fff = Trim(MidB(aaa, 69, 12))
            hhh = LeftB(bbb, 2)
            intdcheck = InStr(ddd, "e")
            
            If intdcheck <> 0 Then
                ddd = "'" & ddd
            End If
            
            If hhh <> "*" And hhh <> "" Then
                
                If intflag = 0 Then
                    xlSheet.Cells(lngline + 4, 1).Value = bbb
                    xlSheet.Cells(lngline + 4, 2).Value = ccc
                    xlSheet.Cells(lngline + 4, 3).Value = eee
                   'xlSheet.Cells(lngline + 4, 9).Value = fff
                End If
                
                If NGflag = True Then
                        
                        If fff <> "NG" And fff <> "LO" And fff <> "HI" Then
                            
                            xlSheet.Cells(lngline + 4, 14 + introw).Value = ddd
                        End If
                    
                Else
                    
                    If fff = "NG" Or fff = "LO" Or fff = "HI" Then
                            With xlSheet.Cells(lngline + 4, 14 + introw).Interior
                                .ColorIndex = 3
                                .Pattern = xlSolid
                            End With
                    End If
                        xlSheet.Cells(lngline + 4, 14 + introw).Value = ddd
               End If
                
            Else
                ggg = MidB(aaa, 7, 22)
                strtime = MidB(aaa, 49, 10)
                iii = LeftB(ggg, 16)
                strid = MidB(aaa, 33, 8)
                inticheck = InStr(strid, "abd")
                
                If lngfline = "" Then lngfline = lngline

                If inticheck <> 0 Then
                
                    If intflag = 0 Then
                        iii_1 = RightB(strid, 2)
                        xlSheet.Cells(3, 3) = iii_1
                    End If
                    
                End If
                
                intscheck = InStr(ggg, "(")
                
                If intscheck = 0 Then
                    If ggg Like "******-****" Then
                        xlSheet.Cells(4, 14 + introw).Value = strtime
                        
                        If intflag = 0 Then
                            strday = MidB(aaa, 31, 16)
                            With xlSheet
                                .Cells(2, 3).Value = ggg
                                .Cells(3, 8).Value = "'" & strday
                            End With
                        End If
                    
                    ElseIf hhh = "" Then
                        If intflag = 0 Then intflag = 1
                        introw = introw + 1
                        lngline = 0
                        
                    End If
                End If
            End If
                lngline = lngline + 1
        Loop
        
        xlApp.Intersect(xlSheet.UsedRange, xlSheet.Range("4:65536")).Borders.LineStyle = xlContinuous
        Close #intfileno
    End If
            
    Dim t_gyou As Long
    Dim i As Long
    t_gyou = lngfline - 1

    For i = 1 To t_gyou
        kkk = "N" & i + 4 & ":" & "IV" & i + 4

        With xlSheet
            .Cells(i + 4, 5).Value = "=Min(" & kkk & ")"
            .Cells(i + 4, 6).Value = "=MAX(" & kkk & ")"
            .Cells(i + 4, 10).Value = "=AVERAGE(" & kkk & ")"
            .Cells(i + 4, 11).Value = "=STDEV(" & kkk & ")"
        End With
    Next i
    
    xlBook.VBProject.VBComponents.Import App.Path & "\Module3.bas"

    With xlSheet
            .Range("J5:J500").NumberFormatLocal = "0.000"
            .Range("K5:K500").NumberFormatLocal = "0.000"
            .Range("L5:L500").NumberFormatLocal = "0.000"
            .Range("M5:M500").NumberFormatLocal = "0.000"
            .Range("D5:D500").HorizontalAlignment = xlCenter
    End With
                
    With xlApp
        .ScreenUpdating = True
        .DisplayAlerts = True
        .Visible = True
    End With
        
    Set xlSheet = Nothing
    Set xlBook = Nothing
    Set xlApp = Nothing
    
    Call Clear_cmd_Click
    Screen.MousePointer = vbDefault
    
    Exit Sub
    
Err_:
    MsgBox Err.Description, vbCritical + vbOKOnly, "警告"
    
    Close #intfileno
    xlApp.Quit
    
    Set xlSheet = Nothing
    Set xlBook = Nothing
    Set xlApp = Nothing
    Screen.MousePointer = vbDefault
    
End Sub

投稿時間:2002/12/18(Wed) 15:19
投稿者名:とろ
Eメール:
URL :
タイトル:
Re: Excelがタスクに残る現象について
>  質問なのですが、下記のコードで、csvファイルをエクセルに
> 変換しているのですが、1MBくらいのファイルになると、Excelが
> タスクに残ってしまいます。(それ以下は、タスクには残りません
> が)ずっと考えていましたが、どうにも

よく分からないんですけど、処理が終了すると、
Excel のウィンドウを表示させていますよね。
そのウィンドウを閉じても、
Excel のタスクが残ったままになるということですか?

投稿時間:2002/12/18(Wed) 15:27
投稿者名:秋風
Eメール:
URL :
タイトル:
Re^2: Excelがタスクに残る現象について
>とろさん。

 返答ありがとうございます。今急いでいますので助かります。
 そうです。ウィンドウを閉じてもタスクに残ってしまいます。
今までテストしていましたが、500KBまでのファイルは正常に
終了できるのですが、それ以上になると、タスクに残ってし
まいます。お分かりでしたら教えて下さい。m(_ _)m

投稿時間:2002/12/18(Wed) 15:55
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^3: Excelがタスクに残る現象について
Excelのバージョン等が記入されていないので違うかも知れませんが
下記に該当しませんか?

XL2000] オートメーションでセルの値の取得やコピーを繰り返すとハングアップ
http://support.microsoft.com/default.aspx?scid=kb;ja;JP414107

投稿時間:2002/12/18(Wed) 16:42
投稿者名:秋風
Eメール:
URL :
タイトル:
Re^4: Excelがタスクに残る現象について
 >花ちゃんさん。

 返答ありがとうございます。
 今教えていただきましたHPを確認しました。どうやら
可能性はあるかもしれません。(VBは5.0,Excelは2000です。)
ただ、サンプルを見ていると、そのままコピーし、セル指定
なく貼りつけるだけですので、簡単なコードで書けるのですが、
私のはセル指定し、csvのデータを抜き出して貼りつける為、
配列での使用が、以前作成してみたのですが、結局ループして
貼付ける方法しか私の知識ではできなく、コードが増えすぎて
しまった為、断念してしまいました。データとしては、

0005  aaa            0.1260 S    OK      
0010  bbb            3.480 V    OK      
0010  ccc            1.001 V    OK      
0010  ddd            0.578 V    OK      
** aaa (dd-abc) aaa5                  **
** abdcdd No. : aaa-abcd              **
** 111111-1234 02/11/25 11:07         **
** a                                  **

みたいなファイル(バイナリ形式なのですが、最後に
改行が入っている為、バイナリではなくcsv形式で
作成してみてと言われた為、csvと先程は記述しました。)
です。説明下手で申し訳ありませんが、配列使用の時、
Excel起動後実行時、ループを使用しない方法が分かる
方いましたら、教えて下さい。m(_ _)mかなりご無理を
言ってるのは承知ですが、どうしても作成できず、教えて
くれる方が回りにいない為、お願いさせてもらいます。
m(_ _)m

投稿時間:2002/12/18(Wed) 23:15
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^5: Excelがタスクに残る(ゴミレス)
1.ファイルをCSV形式で整形してからExcelへ読込む。
2.ファイルサイズを区切って処理する。
3.違う処理方法を試して見る。(高速読込処理とかでV友だったかな、変った処理の方法が
  掲示板にあったように記憶していたのですが思い出せませんし、それで解決できるか解りません)

私が試すならこれ位しか思い浮びません。ゴミレスですみません。

#ここの掲示板を調べていたら No.1295で魔界の仮面弁士さんが同様の質問で回答されておられます。
http://www.bcap.co.jp/hanafusa/vbbbs/wforum.cgi?295&reno=1293&oya=1293&mode=msgview&page=150

投稿時間:2002/12/19(Thu) 08:43
投稿者名:秋風
Eメール:
URL :
タイトル:
Re^6: Excelがタスクに残る
おはようございます。
>花ちゃんさん。

返答ありがとうございます。1.の方法ですが、すでに作成済み
のコードが(以前途中まで作成していましたので)ありますので
そこからまた考えて作成していきます。
教えていただきました掲示板を確認しました。ADOやSQLなどは、
まだVBやEXCELVBAをやり始めたばかりで全然理解できていません
ので、これから勉強しながら理解していきます。
ご無理なお願いをしてしまったのに、丁寧に返答くださいまして
ありがとうございました。m(_ _)m

投稿時間:2002/12/19(Thu) 12:07
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re^5: Excelがタスクに残る現象について
元のコードのように、
  〜.Cells(〜).Value = 〜
で繰り返し出力した場合は、毎回、Excelとの通信が発生する事になるため、
処理的にも遅くなりますし、ハングアップの原因ともなります。


> ただ、サンプルを見ていると、そのままコピーし、セル指定
> なく貼りつけるだけですので、簡単なコードで書けるのですが、

たとえば、複数のセル範囲 B10:D30 に対してデータを格納する場合、
  Set objRange = objSheet.Range("B10:D30")
  varRange = objRange.Value
のようにします。

この時、varRangeには、(1, 1)〜(21, 3) なVariant型の2次元配列が格納されます。

そして、この2次元配列の各位置に、csvから読み込んだデータを格納していき、最後に
  objRange.Value = varRange
としてみてください。(元となる配列は、ReDimで作成してもOKです)

配列を一括代入した場合は、Excelとの通信はその1回分しか発生しませんので、
Cells(〜).Valueを繰り返すよりも、パフォーマンスが良くなります。


なお、配列ではなく、単一の値を代入した場合は、それらの各セルに、
同一の値が格納される事になります。また、1次元配列を代入した場合は、
それが列方向に繰り返されて出力されます。


それと、配列のサイズとセル範囲が一致していなかった場合は、以下のように動作します。

・配列の方が大きい場合は、余分な範囲のデータは無視されます(Excelには出力されません)。
・配列の方が小さい場合は、不足しているセルに #N/A エラーが出力されます。

投稿時間:2002/12/19(Thu) 13:38
投稿者名:秋風
Eメール:
URL :
タイトル:
Re^6: Excelがタスクに残る現象について
>魔界の仮面弁士さん。

返答ありがとうございます。現在、配列を使用して、
データを格納しているのですが、配列要素が多すぎて、
ハングアップしてしまいます。質問が追加になってしまい
大変申し訳ありませんが、2次元配列の要素数は、限界は
どのくらいなのでしょうか?今も検索して確認中なのですが、
結果を見つける事ができません。お分かりでしたら教えて
下さい。m(_ _)m