[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2005/01/26(Wed) 19:32
投稿者名:ligaro
URL :
タイトル:
別フォームから同じExcelシートを使う
名簿作成システムを作っています。
フォーム(1)からの処理結果を出力したエクセルシートに、
続けてフォーム(2)の処理結果も出力したいと思っています。
フォーム(1)の処理結果は、(1,1)に番号、(1,2)に氏名という風に
(1,1)から(1,5)までを一人分の情報としてエクセルのシートに出力したもので、
(2,1)から(2,5)までがまた一人分、と一行ずつに個人情報が入っているものです。
そのシートに続けてフォーム(2)の処理結果も出力していきます。
フォーム(2)では使用するデータが違うだけで処理内容はフォーム(1)と同じです。
例えば、フォーム(1)の処理結果が15行目まで出力されたものだったら、
フォーム(2)は16行目から出力させていきます。
お聞きしたいことは、
・xlNewsheetをグローバル変数として使うことは可能か
・フォーム(1)から開いたエクセルシートは、一度閉じたり保存したりしなくても
フォーム(2)で開けるか(使えるか)についてです。よろしくお願いします。
xlBook,xlNewsheet,lastrowはグローバル変数です。

フォーム(1)
Private Sub Command1_Click()
Set xlApp = CreateObject("Excel.Application") 'エクセル起動
xlFileName = strFileName ’一つ前のフォームからのファイルパス
Set xlBook = xlApp.Workbooks.Open(xlFileName)
Set xlNamesheet = xlBook.Sheets.Item(1)
Set xlApp = CreateObject("Excel.Application") ’出力用の新しいエクセルシートを開く
Set xlBook = xlApp.Workbooks.Add
Set xlNewsheet = xlBook.Worksheets(1)

lastrow = 1
cnt = 0
rowNum = xlNamesheet.Range("A1").CurrentRegion.Rows.Count ’開いたエクセルのデータの行数を数
える
For i = 1 To rowNum
shusseki = xlNamesheet.Cells(i, 5).Value ’5セル目(出席回数)をチェック
        If IsNumeric(shusseki) Then ’5セル目に数字が入っていれば
                    その人の情報(5セル分)を出力用の新しいエクセルシートに出力
            stno = xlNamesheet.Cells(i, 1)
            stno = Form10.Text1 & stno
            xlNewsheet.Cells(lastrow, 1) = stno
            lastrow = lastrow + 1
            cnt = cnt + 1
            For j = 2 To 5
            xlNewsheet.Cells(cnt, j).Value = xlNamesheet.Cells(i, j).Value
            Next j
        End If
Next i

フォーム(2)
Private Sub Command1_Click()
Set xlApp = CreateObject("Excel.Application")
xlFileName = strFileName ’パス名はフォーム(1)と同じですがデータは別物です
Set xlBook2 = xlApp.Workbooks.Open(xlFileName)
Set xlNamesheet = xlBook2.Sheets.Item(1) ’これは必要でしょうか?
Set xlNewsheet = xlBook.Worksheets(1) ’ここでエラーが出てしまいます。
   このxlNewsheetはグローバル変数で宣言してありフォーム(1)と同じもの、出力用のシートです

rowNum = xlNamesheet.Range("A1").CurrentRegion.Rows.Count
For i = 1 To rowNum
shusseki = xlNamesheet.Cells(i, 5).Value
        If IsNumeric(shusseki) Then
            stno = xlNamesheet.Cells(i, 1)
            stno = Form7.Text1 & stno
            xlNewsheet.Cells(lastrow, 1) = stno ’同じシートに出力
            lastrow = lastrow + 1
            cnt = cnt + 1
            For j = 2 To 5
            xlNewsheet.Cells(cnt, j).Value = xlNamesheet.Cells(i, j).Value
            Next j
        End If
Next i

投稿時間:2005/01/26(Wed) 21:05
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re: 別フォームから同じExcelシートを使う
> お聞きしたいことは、
> ・xlNewsheetをグローバル変数として使うことは可能か
> ・フォーム(1)から開いたエクセルシートは、一度閉じたり保存したりしなくても
> フォーム(2)で開けるか(使えるか)についてです。

聞く前に試して見たらどうでしょう。自分で試せる事は試して下さい。
そこまでできているなら、長い質問を書くより試す方が簡単では。
そうすれば、少なくても質問内容が違ってくるでしょう。

投稿時間:2005/01/27(Thu) 10:28
投稿者名:ligaro
URL :
タイトル:
Re^2: 別フォームから同じExcelシートを使う
> 聞く前に試して見たらどうでしょう。自分で試せる事は試して下さい。
> そこまでできているなら、長い質問を書くより試す方が簡単では。
> そうすれば、少なくても質問内容が違ってくるでしょう。

申し訳ないです! 試したところ

フォーム(2)
Private Sub Command1_Click()
Set xlApp = CreateObject("Excel.Application")
xlFileName = strFileName ’パス名はフォーム(1)と同じですがデータは別物です
Set xlBook2 = xlApp.Workbooks.Open(xlFileName)
Set xlNamesheet = xlBook2.Sheets.Item(1) ’これは必要でしょうか?
Set xlNewsheet = xlBook.Worksheets(1) ’ここで「オブジェクトが必要です」というエラーが出ます。

それ以外はデバッグしたところパスも渡せているし引数も入っています。
あとは何が必要なのでしょうか?

投稿時間:2005/01/27(Thu) 11:01
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^3: 別フォームから同じExcelシートを使う
以下のコードを試して見て下さい。
後は自分で試して確認して覚えるようにして下さい。
ろくに試しもせず、聞いてばかりいては同じ事の繰り返しですよ。

ligaro さん or セルのコピーの仕方 - ともみ 01/13-16:34 No.1568 さん

'-------------------------------------------------------------

Option Explicit     '標準モジュールに以下を記入
Public xlApp   As Excel.Application
Public xlBook As Excel.Workbook
Public xlSheet As Excel.Worksheet

Public Sub ExcelOpen()
    Set xlApp = CreateObject("Excel.Application")
    Set xlBook = xlApp.Workbooks.Add
    Set xlSheet = xlBook.Worksheets(1)
    xlApp.Visible = True
    xlSheet.Cells(1, 2).Value = "りんご"
End Sub

'------------------------------------------------------------------

Option Explicit     'Form1 に以下のコードを記入

Private Sub Form_Load()
    Call ExcelOpen
    Form2.Show
End Sub

Private Sub Command1_Click()
    Print xlSheet.Cells(1, 2).Value
    xlSheet.Cells(4, 2).Value = "Form1から書き込みました"
End Sub

Private Sub Form_Unload(Cancel As Integer)
    xlApp.DisplayAlerts = False
    xlApp.Quit
    Set xlSheet = Nothing
    Set xlBook = Nothing
    Set xlApp = Nothing
End Sub

'---------------------------------------------------------
当然参照設定はしておいて下さい。

投稿時間:2005/01/27(Thu) 18:12
投稿者名:ligaro
URL :
タイトル:
Re^4: 別フォームから同じExcelシートを使う
試してみましたが別の方法で完成させました。
どうもありがとうございました。

投稿時間:2005/01/28(Fri) 13:03
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
いつもの事ながら
> 試してみましたが別の方法で完成させました。
> どうもありがとうございました。

貴方っていつもこうじゃないですか?
次回から質問する前に十分自分で調べて、試してからにして下さいね。

投稿時間:2005/01/28(Fri) 14:06
投稿者名:るしぇ
Eメール:
URL :
タイトル:
というか
hhttp://otd12.jbbs.livedoor.jp/1223660/bbs_tree
マルチポストもしてるようですし…承知の上でやってる
事ではないでしょうか?。…どこかの掲示板で回答が
付いたのかも?(^^;)…すべてあて推量ですが。

…のれんに腕押しな感じはします。

投稿時間:2005/01/28(Fri) 14:23
投稿者名:いな
Eメール:
URL :
タイトル:
Re: というか
> hhttp://otd12.jbbs.livedoor.jp/1223660/bbs_tree
> マルチポストもしてるようですし…承知の上でやってる
> 事ではないでしょうか?。…どこかの掲示板で回答が
> 付いたのかも?(^^;)…すべてあて推量ですが。
>
> …のれんに腕押しな感じはします。

第一、
『自分が解決したから、スレッドを閉じます。』
そもそも、解決報告って、こうゆうのじゃないよね?

疑問点、質問があって、それをどのように解決したか?
コードが必要ならば、説明に必要な最低限のコードや画像(のURL)を転記し、
自分以外の第3者が似たような疑問点を持ったとき、
『過去ログ』を見て、自力で解決出来るような情報共有の場、だと思ってたのに・・・。

最近はHelpやNet上に公開されているサンプルを組み合わせればすぐ解決するような物ばかり、
知的好奇心を満たしてくれない。

ものの調べ方の引出しが足りないのだろうか?
自分で苦労して悩んで探さないと、考え方自体身につかないだろうと思う。

#でも、"VBお薦めリンク集"をもう少し目立つところにって思ったりもする。
#ここらのリンクに記載されている過去ログや、さらにその先のリンクを読めば、
#かなりの情報資産になっているはずなんだが・・・。