|
▼ichinose さん:
>>ichinoseさんへ
>>
>>自分もエクセル2002です。(10.2614.2625)
>>デバック出なかったですか・・・・・・・?自分のはバリバリ出るんですが・・・・・・何が違うんでしょう・・・・・
>
>再度、新規ブックにて試してみてください。
>
>ThisWorkbook.Worksheets(1).Cells(ThisWorkbook.gyou, 1) = TextBox1.Text
>
>で
>「実行時エラー'1004':アプリケーション定義またはオブジェクト定義のエラーです。」
>は、
>
>ThisWorkbook.gyouが0の時に発生しそうです。
>投稿していないコードがありませんか?
>
>
>>また、ichinoseさんだったら問題の一行「ThisWorkbook.Worksheets(1).Cells(ThisWorkbook.gyou, 1) = TextBox1.Text」でichinoseさん流にてどう記述なさいますか?
>
>gyouをPublic変数にした理由は
>
>「他のフォームでも必要な変数だからです」
>
>とありますね!!
>
>ということは、gyouという変数の更新を提示されたコード以外でも
>行う可能性があると言うことですよね!!
>
>こういう変数の更新をいくつものモジュールやプロシジャーで行っていると
>非常にメンテナンスがしにくくなります。
>新規に作成する時は、スコープが広いから使いやすそうに錯覚しがちですが・・。
>
>私なら、このgyouという変数の更新は一つのモジュールだけに限定して、
>そのモジュール内のプロシジャーを呼び出すようにします。
>
>
>新規ブックにて、確認してください。
>
>ユーザーフォームを準備して下さい(Userform1)。
>このUserform1には、
>
> テキストボックス(TextBox1) -- 指定シートに書き出す内容
>
> と
>
> コマンドボタン(CommandButton1) -- 指定シートにTextbox1の内容を書き出す
>
>のふたつのコントロールを用意してください。
>
>Thisworkbookモジュールに
>
>'==============================================================
>Option Explicit
>Public Sub Workbook_Open()
> Call open_tbl(Worksheets(1).Range("a1"), 2)
> UserForm1.Show
> Call close_tbl
>End Sub
>
>
>UserForm1のモジュール
>
>'================================================================
>Option Explicit
>Public Sub CommandButton1_Click()
> Call put_tbl(TextBox1.Text)
>End Sub
>
>
>標準モジュールに
>'適当な列をテーブルに見立ててのI/Oパックサブルーチン
>'gyou等の変数は、この標準モジュール内でしか更新しない
>'================================================================
>Private g_stt As Long
>Private gyou As Long
>Private tbl As Range
>'================================================================
>Sub open_tbl(u_rng As Range, Optional s_gyou As Long = 1)
>'テーブルの初期化処理
> Set tbl = u_rng
> g_stt = s_gyou
> gyou = g_stt
>End Sub
>'================================================================
>Sub put_tbl(txt As Variant)
>'テーブルへのデータの順次書き込み
> tbl.Cells(gyou).Value = txt
> gyou = gyou + 1
>End Sub
>'================================================================
>Function get_tbl(idx As Long) As Variant
>'テーブルから指定されたインデックスのデータを取り出す
>'投稿コードでは使われていませんが、必要になりそうな機能ですよね!!
> If idx >= g_stt And idx < gyou Then
> get_tbl = tbl.Cells(idx).Value
> Else
> get_tbl = CVErr(1004)
> End If
>End Function
>'================================================================
>Sub close_tbl()
>'テーブルのクローズ
> Set tbl = Nothing
> g_stt = 0
> gyou = 0
>End Sub
>
>
>これで適当な名前で保存した後、一度当該ブック閉じた後、改めてこのブックを
>開いてみてください。
>
>ブックが開かれると、Useform1が表示されます。
>
>テキストボックスに適当な文字を入力後(仮に abc)、コマンドボタンをクリックしてください。
>最左端のシートのセルA2にテキストボックスの内容が表示されます。
>その次にクリックすれば、A3、その次はA4と順次テキストボックスの内容を
>表示するセルは変わっていきます。
>
>
>上記のコードは、Open_tblとclose_tblを実行させるタイミングを工夫すれば、
>二つのフォームでも共有できると思いますよ!!
>
>試してみてください。
丸一日空けてしまって大変申し訳ありませんでした。
先程、ichinoseさんのレスを読ませて頂き、
>再度、新規ブックにて試してみてください。
>
>ThisWorkbook.Worksheets(1).Cells(ThisWorkbook.gyou, 1) = TextBox1.Text
>
>で
>「実行時エラー'1004':アプリケーション定義またはオブジェクト定義のエラーで>す。」
>は、
>
>ThisWorkbook.gyouが0の時に発生しそうです。
をヒントに解決しました。
自分が最初に記述したコードで
>'以下、ThisWorkbookに記述。
>Public gyou As Integer
>Private Sub Workbook_Open()
> gyou = 2
> UserForm1.Show
>End Sub
の部分でThisWorkbookを開いたら変数gyouに2を代入していたことにお恥ずかしながら気付きませんでした。
エラーが発生した理由は、自分の検討違いもいいとこで、ThisWorkbookを開くイベントを蹴ってUserForm1だけにデバックをかけていたためだと思われます。
'以下、UserForm1(イベントハンドラのすぐ下)に記述
If ThisWorkbook.gyou = 0 Then
ThisWorkbook.gyou = 2
End If
を記述することにしました。
大変、多大なるご迷惑をお掛けしました。
>Toshiさんへ
実際に検証していただきありがとうございます。
>Toshiさん、ichinoseさんへ
掲載していないコードについての件なのですが、その後にUserForm1とほとんど同様の処理が開始します。次は横バージョンです!!(「セルB1」から右に向かって)
ThisWorkbookには、もう一つPublic変数のretsuが記述されています。また、UserForm1には実をいうともう一つコマンドボタン(CommandButton2)を用意してます。そのCommandButton2を押すことによりUserForm1にそっくりなUserForm2を表示して横バージョンの開始となるのが実際のコードです。
>ichinoseさんへ
おかげさまで解決することが出来ました。
また、ichinoseさん流のコードの記述を自分で希望したにも関わらず、自分のキャパシティが全くなく理解することが出来ませんでした。お忙しい中、記述して頂いたのに大変申し訳ないと心から反省しています!ichinoseさんから見たら自分勝手も程々にしろって話しですよね・・・・・・重々、反省しております!
>ハチさんへ
そこまで、責める気は全くないので全然気にしないで下さい。失礼な言動がありましたら謝罪いたします。
もとをただせば、理解不明な日本語でこんなことを聞いてる僕がいけないのですから。
皆さん、本当にありがとうございました。
|
|