[[20100305191209]] 『ユーザーフォームがひらけません。』(キョッチャン) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『ユーザーフォームがひらけません。』(キョッチャン)
 WindowsXP Excel2003

 単純な質問です。Module1に

 Sub ユーザーフォームを開く()
    UserForm3.Show
 End Sub

 をを書き込み、表示、ツールバー、フォーム、ボタンでボタンを作成し、このボタンに
「ユーザーフォームを開く」を登録しても、エラーになります。エラー表示は
「オブジェクトが必要です。」です。正常に作動させるためには、どのような対策が
必要ですか?


 外しているかもしれませんが、、、
 
 そのユーザーフォームは、本当にUserForm3でしょうか?
                                     ~~~
 (キリキ)(〃⌒o⌒)b


 どの行で「オブジェクトが必要です。」というエラーが発生しますか?
 こういう記述を例え3行のコードでもきっちり規定する癖を付けてください。

 このエラーが

 UserForm3.Show

 ここで発生しているとしたら、
 考えられるのは、

 1 Userform3というオブジェクトが実は、存在しない

 2 Userform3内に記述してある コードにエラーになる原因がある
 この場合、以下の確認をしてください。
 VBEにて、「ツール」----「オプション」とクリックし、「オプション」ダイアログを
 表示させてください。
 全般タブのエラートラップは、何が選択されていますか?
 「エラー処理対象外のエラーで中断」が選択されていたら、
 「クラスモジュールで中断」を選択してOKをクリックしてください。

 これで再度コードを実行してみてください。

 2が原因なら、今度は、別の行でエラーが発生したことがわかるはずです。

 3 VBEのバグの可能性
  再度新規ブックにて、同じようなことをしてみてください。
  同じエラーが発生するか 確認してください。

 試してみてください。

 ichinose


 ichinoseさん有難うございました。
 2.の原因でエラーが発生していました。ご指摘どうりに行ったところ、エラー箇所が解りそれを
修正したところ、正常に作動するようになりました。また一つ勉強しました。(キョッチャン)


 新たな質問です。

 Book1とBook2に記入するデータの中に共通項目が多くあるので、Book1に
ユーザーフォームを作成し双方に入力するデータをすべて書き込める用、
それぞれに対応するテキストボックスを設定し、そのユーザーフォームに
二個のコマンドボタンを作成し、コマンドボタン1にBook1に必要な項目を各セルに
書き込むテキストボックスを指定し、またコマンドボタン2にも同様に指定してす。     
 このユーザーフォームはBook1にあるのでユーザーフォーム内のコマンドボタン2を
クリックしたとき、Book2に書き込めないと考えコマンドボタン2のマクロに

 Workbooks("Book1.xls").Activate
 Worksheets("Sheet1").Activate

 を加え、それぞれのコマンドボタンをクリックするとコマンドボタン1は正常に
作動しますが、コマンドボタン2をクリックした時は、エラーが出ます。エラー表示は
 「インデックスが有効範囲にありません。」
 です。
 どこに間違いがあるのでしょうか。それとも、1個のユーザーフォームで
2個のBookを指示するのに無理があるのでしょうか。ご指導ください。
 (キョッチャン)
 

 すみません。マクロコード内のBook1はBook2の間違いです。(キョッチャン)

 Book1のフォームモジュールで Worksheets("Sheet1").Activate と書くと
無条件で Workbooks("Book1.xls").Worksheets("Sheet1").Activate と解釈されます。
Workbooks("Book1.xls")のワークシートコレクションにSheet1という名前のものが
ない限り、ご提示のエラーが出ます。
 
標準モジュールの場合は無条件でアクティブなオブジェクトが選択されるかも
しれませんが、それ以外のモジュールではParentのオブジェクトに気をつけなければ
なりません。
 With Workbooks("Book2.xls")
    .Activate
    .Worksheets("Sheet1").Activate
 End With
 こういう書き方ができますが、ほとんどのメソッド、プロパティの取得・設定では
アクティブにする必要がありません。
ActivateやSelectなどのメソッドに頼らないコーディングを習得してください。
テキストボックスの値をBook2、Sheet1のセルA1に書き込む ということなら、
 
 Workbooks("Book2.xls").Worksheets("Sheet1").Range("A1").Value = Me.TextBox1.Value
 
このように、SelectやActivateすることなく、一行でダイレクトに実行することができます。
(みやほりん)(-_∂)b

 みやほりんさん有難うございます。

 Private Sub CommandButton2_Click()

    Workbooks("Book2.xls").Activate
    Worksheets("Sheet1").Activate

     Dim insertrow As Long
     Dim rend As Integer

     Cells(rend + 1, 8) = テキストボックス8.Text

     With Range("データ一覧")
        insertrow = .Rows.Count
        .Rows(insertrow).Insert shift:=xlDown

        .Cells(insertrow, 2) = Textbox2.Text
        .Cells(insertrow, 3) = Textbox3.Text
        .Cells(insertrow, 4) = Textbox4.Text
        .Cells(insertrow, 5) = Textbox5.Text
        ・
        ・
        ・
 というように、Book2に「データ一覧」という範囲を指定しそれぞれの最下行のセルを取得して
そこにテキストボックスのデータを書き込むようにしています。それぞれのセルに「Book2のと」
指定したほうがいいのですか?めんどうなので最初にブック、ページ指定をしました。
 修正方法を教えてください。(キョッチャン)


 この相談ではブック名を仮に「Book2」としましたが実際のブック名は違います。それを再度書き直し
マクロの文字も同様に書き直したら、正常に作動するようになりました。ただブック名にマクロで
使用できない文字があるのですか?今回をブック名に()を使用していました。これをそのまま使用
したら、エクセルのエラーが出ました。そこで今回はブック名書き直しと同時にこの()及びその
中の文字も削除して正常に作動するようになりました。(キョッチャン)

 まず、以下は私の勘違いでした。
> Book1のフォームモジュールで Worksheets("Sheet1").Activate と書くと
>無条件で Workbooks("Book1.xls").Worksheets("Sheet1").Activate と解釈されます。
>Workbooks("Book1.xls")のワークシートコレクションにSheet1という名前のものが
>ない限り、ご提示のエラーが出ます。
 
フォームモジュールではブック名を省略したときはアクティブなブックが、
シート名を省略したときはアクティブなシートが取得されますね。
記憶間違い、確認不足でした。申し訳ありません。
 
括弧について。
 ()この括弧はOKだと思いました。
 []この括弧はファイル名をエクスプローラーなどから使うことはできますが、
Excel側からは禁則文字となります。これは外部参照式のブック名識別記号として
利用しているためと思われます。
[[20090728163750]] 『シートの名前の変更について』(yoifuro)
()こちらの括弧だとしたら、原因はスペースの有無など別のものではないかと思われます。
 
>めんどうなので最初にブック、ページ指定をしました。
 
・アクティブにすること
・Rangeオブジェクトの親(シート)、および、親(シート)の親(ブック)を特定すること
この二つは別物だと思ってください。
そういうときこそ、オブジェクト変数を使うべきです。
複数のブックを扱う場合、ブック名、シート名を省略して書いてしまうと、あとで
読み返したときに、「このセルはどちらのブックのつもりだったっけ?」となり、
いわゆる、可読性の低いコードになってしまいます。
 
例えば、二つのブックに同じ範囲名があったとしても、
 Dim rngData1 as Range
 Dim rngData2 as Range
 Set rngData1 = Workbooks("Book1.xls").Worksheets("Sheet1").Range("データ一覧")
 Set rngData2 = Workbooks("Book2.xls").Worksheets("Sheet1").Range("データ一覧")
 
としておけば、書き方もすっきりしますし、区別もしやすくなります。
(みやほりん)(-_∂)b


 Dim rngData1 as Range
 Dim rngData2 as Range
 Set rngData1 = Workbooks("Book1.xls").Worksheets("Sheet1").Range("データ一覧")
 Set rngData2 = Workbooks("Book2.xls").Worksheets("Sheet2").Range("データ一覧")

 これが同じブックのシート違いなので
 Dim rngData1 as Range
 Dim rngData2 as Range
 Set rngData1 = Workbooks("Book1.xls").Worksheets("Sheet1").Range("データ一覧")
 Set rngData2 = Workbooks("Book1.xls").Worksheets("Sheet2").Range("データ一覧")
として貼り付けましたがエラーが出ます。
 エラー表示は「アプリケーション定義またはオブジェクト定義のエラーです。」(キョッチャン)


 >Range("データ一覧") と

 Range("データ一覧") の違いか、"データ一覧"が存在しないか。

 (mitsu)

 確認しましたがどちらもあっています。

 Dim rngData1 as Range
 Dim rngData2 as Range
 Set rngData1 = Workbooks("Book1.xls").Worksheets("Sheet1").Range("データ一覧")
 Set rngData2 = Workbooks("Book1.xls").Worksheets("Sheet2").Range("データ一覧")

 を貼り付けず、シート1への書き込み用「コマンドボタン1」を実行したときは
正常に作動しますが、シート2への書き込み用「コマンドボタン2」ではエラーが
出ます。エラー表示はやはり「アプリケーション定義またはオブジェクト定義の
エラーです。」です。(キョッチャン)

 Book1.Xlsの標準モジュールに

 '================================================================
 Sub test()
    Dim nm As Name
    For Each nm In ThisWorkbook.Names
       Debug.Print nm.NameLocal
       Debug.Print nm.Value
    Next
 End Sub

 これを実行してみてください。結果は、VBEのイミディエイトウインドーに表示されますから、
 (表示されていなければ、VBEにて Ctrl+G で表示されます)

 表示内容は、どのようになっていますか?

 ichinose@昨日飲み過ぎで今日一日つぶしてしまった

 そりゃだめでしょうね。
定義できる名前は「ブック内でユニークでなければならない」です。
Sub test()
Dim objNm As Name
For Each objNm In ActiveWorkbook.Names
Debug.Print objNm.Name
Next
End Sub
 
これを実行してイミディエイトに表示されるのが正式な名前です。
シートが違うと、同じ定義になっているつもりでも、違う名前になるんですよ。
名前定義したシートをコピーしてるのではないですか?
 
ブックひとつだけならこのようにできます。
Dim myrng1 As Range
Dim myrng2 As Range
Set myrng1 = Range("Sheet1!データ一覧")
Set myrng1 = Range("Sheet2!データ一覧")
 
が、ブックを明確にしようと思うと、ブックがアクティブでも↓のようには書けない。
Set myrng1 = Workbooks("Book1").Range("Sheet1!データ一覧")
 
↓のようになんだか二度手間な書き方になります。
Set myrng1 = Workbooks("Book1").WorkSheets("Sheet1").Range("Sheet1!データ一覧")
 
(みやほりん)(-_∂)b


 >確認しましたがどちらもあっています。 という事ですが、

 Sheet1とSheet2に全く同じ名前(データ一覧)を定義出来ているという事ですか?

 そんな事は出来ない筈ですが・・ 再度確認して下さい。

 (mitsu)

 因みに 名前の定義をSheet1!データ一覧等として登録したなら、以下の記述ができます。

 Sub test()
    MsgBox Workbooks("book1.xls").Worksheets("sheet1").Range("データ一覧").Address(, , , True)
    MsgBox Workbooks("book1.xls").Worksheets("sheet2").Range("データ一覧").Address(, , , True)
    MsgBox Application.Range("[book1.xls]sheet1!データ一覧").Address(, , , True)
    MsgBox Application.Range("[book1.xls]sheet2!データ一覧").Address(, , , True)
 End Sub

 他にも Namesを使った記述方法もあります。

 ですから、質問者の名前の定義の定義方法が疑問なんですけどね

 ichinose@やっぱりまだ駄目だ寝よう


 寝る前に・・・・。

 Sheet1!データ一覧 という名前で 例えば =Sheet3!A1 を登録したりしているなら・・・、

 Sub test2()
    MsgBox Application.Range("[book1.xls]sheet1!データ一覧").Address(, , , True)
    MsgBox Application.Range("[book1.xls]sheet2!データ一覧").Address(, , , True)
 End Sub

 これか

 Sub test3()
    MsgBox Workbooks("Book1.xls").Names("sheet1!データ一覧").RefersToRange.Address(, , , True)
    MsgBox Workbooks("Book1.xls").Names("sheet2!データ一覧").RefersToRange.Address(, , , True)
 End Sub

 これかな?

 ichinose


 みやほりんさんichinoseさん有難うございました。

 私はシート1にもシート2にも「挿入」、「名前」、「定義」で確認したところ双方に、「データ
一覧」が表示されるので間違っていないと思っていましたが、再度のご指摘により再確認いたしました。
すると「参照範囲」がシート見出しがシート1に変わその範囲が示されていました。これをシート2に
変更しサイド範囲を指定し名前を変更し実行したところ正常に作動するようになりました。しかし
「データ」と「データ」の差では登録できませんでした。(キョッチャン)

 喜んでいるのもつかの間、Book1を開きユーザーフォーム内のコマンドボタンを、Book2を開かないで
実行したところ、またエラーが出ました。エラー表示は「インデックスが有効範囲にありません。」です。

 マクロの設定は
 Workbooks("Book2.xls").Activate
    Worksheets("Sheet1").Activate
 です。

 いつも初歩的な質問で申し訳ありませんが、何せマクロの入り口にいる私ですのでご指導のほど
よろしくお願いいたします。(キョッチャン)

 そりゃそうだ。
>Book2を開かないで
開いていないブックをアクティブにはできません。エラーメッセージはいかにも
機械的に訳した文章なのでわかりにくいのですが、

「インデックス」
コレクションの構成要素であるオブジェクトそれぞれに割り当てられるIndex(番号)もしくは名前
「有効範囲にありません。」
コレクションの中に指定されたIndexに該当する番号、もしくは名前を持つオブジェクトがない

 ブックコレクションは開いているブックが対象になります。
"Book2.xls"というファイルはPCメモリ上のいろいろなところに保存できますから、
 Workbooks("Book2.xls").Activate
だけで目的のブックを開クコとができないのは、お分かりいただけますよね?
(みやほりん)(-_∂)b


 みやほりんさん有難うございます。
 おっしゃることが解っているだけにそれが処理できないのが歯痒いのです。
Book2を開いていても閉じていてもBook1のコマンドボタンをクリックした時、
指定の処理ができるマクロが知りたいのです。マクロはエクセルに対し万能と
思っています。処理方法をご教授願います。(キョッチャン)

 いい忘れました。Book1とBook2は同じフォルダに保存いたします。(キョッチャン)

 Sub test()
    Dim bk2 As Workbook
    On Error Resume Next
    Set bk2 = Workbooks("book2.xls")
    If Err.Number <> 0 Then
       Err.Clear
       Set bk2 = Workbooks.Open(ThisWorkbook.Path & "\book2.xls")
       If Err.Number <> 0 Then
          MsgBox Err.Description
          Stop
       End If
    End If
    On Error GoTo 0
    With bk2
       .Activate
       .Worksheets("sheet1").Activate
    End With
 End Sub

 このようにしてみては?
 それから、Activateをなるべくしないコードを心がけてください。
 それにより、エラーが出る Activateするとエラーが出ない なら、その原因を突き止めるべきです。
 Activateを入れるとエラーが出ないからいいや で済ませてしまうとVBAの習得進歩が遅れることも
 考えられますので・・・・。

 また、みやほりんさんの投稿にもあるように オブジェクト変数を使う方法も習得してください。
 大事ですよ!!

 ichinose@今日は、すっきり


 ichinoseさんいつもいつも有難うございます。

  Private Sub CommandButton2_Click()
     Dim insertrow As Long
     Dim rend As Integer
     Dim bk2 As Workbook
    On Error Resume Next
    Set bk2 = Workbooks("book2.xls")
    If Err.Number <> 0 Then
       Err.Clear
       Set bk2 = Workbooks.Open(ThisWorkbook.Path & "\book2.xls")
       If Err.Number <> 0 Then
          MsgBox Err.Description
          Stop
       End If
    End If
    On Error GoTo 0
    With bk2
       .Activate
       .Worksheets("sheet1").Activate
    End With

     Cells(rend + 1, 8) = テキストボックス8.Text

     With Range("データ一覧")
        insertrow = .Rows.Count
        .Rows(insertrow).Insert shift:=xlDown

        .Cells(insertrow, 2) = Textbox2.Text
        .Cells(insertrow, 3) = Textbox3.Text
        .Cells(insertrow, 4) = Textbox4.Text
        .Cells(insertrow, 5) = Textbox5.Text
        ・
        ・
        ・
 としましたが、合っていますか。これでCommandButton2をクリックしても、「「ファイル」メニュー
の最近使用したファイルを開こうとしている場合は、その名前が変更されていないこと、移動または
削除されていないことを確認してください。」と表示され「OK」をクリックするとマクロ画面が
表示され「stpo」に黄色マークがついています。
 それと、私はマクロの構造についてはおぼろげながら解ってきたつもりですが、マクロのテクニック
についいては、以前から言っていましたように、まだまだ素人です。わがまま言って申し訳
ありませんが、たとえば、オブジェクト変数という言葉さえ理解できてない私です(多分Dim bk2 As
 Workbookのことだと思いますが。)。何も解らない子供に教えるように説明願います。
ごめんなさい。(キョッチャン)

 表示されたものは、
Workbooks.Open(ThisWorkbook.Path & "\book2.xls")
を実行したら、そのようなエラーが発生した、ということを示しています。
・マクロを実行しているブックと同じフォルダに「book2.xls」という名前のファイルがない、
・保存してないブックからこのマクロを実行した。
 
つまり、このマクロを希望通りに実行する、その前提となる作業が
まだ行われていない、ということになります。
 
>まだまだ素人です。
「こいつぁ、まだ素人なんでさぁ。ちょっと力をつけてきたように思えたんで
任せてみたんですが、どうやら、あっしの思い違いだったようで。
ダンナ、こいつの粗相は、あっしの顔に免じて、今回だけは許してやっちゃもらえませんか?」
っていう場面ではまあいいとして、自分から「素人です」って宣言しないほうが良いですよ。
その時点で「努力」は止まりますし、イイワケを書く必要はないんです。ここは。
 
「それと・・・」以下はないほうがむしろ、印象の良い文章です。
堂々と「ここまではわかっている、ここからがわからない」とポイントを絞って
質問してください。
(みやほりん)(-_∂)b


 みやほりんさん早速のお答え有難うございます。
 マクロの指示どうり行っているつもりですが、実行できないのです。私にわ全く理解できません。
 (キョッチャン)

 Book1.Xls(VBAコードやユーザーフォームがあるブック)とbook2.xlsは、同じフォルダ上に
 存在することは確かなのですか?
 今から、同じような関係のBook1.XlsとBook2.Xlsを作成してみますから、以下の記述どおりに
 ブックを作成し、VBAコードを実行してみてください。

 新規ブックにて、以下のようにしてみてください。

 新規ブックに ユーザーフォーム(UserForm1)を作成してください。
 このUserForm1には、コマンドボタンを一つだけ作成してください(CommandButton1)

 標準モジュール(module1)に

 '=============================================================================
 Option Explicit
 Sub test()
    UserForm1.Show
 End Sub

 別の標準モジュールに

 '=============================================================================
 Option Explicit
 Sub mk_book2()
    With Workbooks.Add
       .Worksheets(1).Range("a1:a10").Value = "aaa"
       .SaveAs ThisWorkbook.Path & "\book2.xls"
       .Close False
    End With
 End Sub

 UserForm1のモジュールに

 '===========================================================================
 Option Explicit
 Private Sub CommandButton1_Click()
    Dim bk2 As Workbook
    On Error Resume Next
    Set bk2 = Workbooks("book2.xls")
    If Err.Number <> 0 Then
       Err.Clear
       Set bk2 = Workbooks.Open(ThisWorkbook.Path & "\book2.xls")
       If Err.Number <> 0 Then
          MsgBox Err.Description
          Stop
       End If
    End If
    On Error GoTo 0
    With bk2
       .Activate
       .Worksheets(1).Activate
    End With
 End Sub

 とここに問題のコードを記述。

 一度適当なフォルダに保存してください。名前は、 Book1.Xls でよいです。

 Book1.Xlsという名前で保存後(必ず保存してから)、
 上記のVBAコード mk_book2 を実行し、Book1.Xlsと同じフォルダ上にBook2.Xlsを作成してください。
 (mk_book2 を実行し、エラーもなく終了すれば、book1.xlsと同一フォルダ上にBook2.xlsが作成される
 はずです)

 次に test を実行してください。

 UserForm1が表示されます。コマンドボタンをクリックしてください。

 book2.xlsが表示されませんか?

 これが正常に作動するようなら、元に戻って、今問題のふたつのブックの関係とどこが違うのか
 比べてみてください。

 ichinose


 こんにちは。佳です。横から失礼します。
 すこしさかのぼりますが、

 > Book1を開きユーザーフォーム内のコマンドボタンを、Book2を開かないで
 > 実行したところ、またエラーが出ました。

 こうすればエラーになると分かっているなら、その「こうすれば」が成立しない方法を考えましょう。
 開かずに実行するとエラーがでるなら、「開いてから実行」すればいいのです。
 特定のファイルを開くマクロは、マクロの記録をすれば手に入ります。

 ichinoseさんのコードも、エラー処理など組み込んで複雑なコードになっていますが、
 基本の部分は「開いていなければ開く」。これだけです。

 > Book2を開いていても閉じていてもBook1のコマンドボタンをクリックした時、
 > 指定の処理ができるマクロが知りたいのです。

 そのようなコードがあらかじめどこかにあって、回答者はそれをどこかから取ってくる
 というイメージが浮かびますが。
 実際は、てもとの材料を組み合わせて、智慧を振り絞って どうにかこうにか
 やりたいことを実現しているのです。

 今回のは、たとえ初心者でも思いつける範囲だと思います。

 >たとえ初心者でも
いえいえ、初心者、素人、理解できない、と自分で自分にレッテルを貼った時点で、
思考能力や努力はほぼ停止します。あとは地面に仰向けになって、手足をばたつかせて
自分が望むものが出てくるまで騒ぎ立てるだけになってしまいます。
 
VBAはエクセルと会話するための言語です。
これが人間同士の会話なら、こちらの思っていることが100パーセント表現できて
いなくても、相手が気を利かしてくれれば(つまり、こちらの言うことを理解して
くれる気持ちがあるなら)、表現力が稚拙でもかなりコミュニケーションが取れます。
 
ですがエクセル(コンピュータ)は気を利かしてくれません。
VBAとして表現したことがすべてです。
人間同士の会話と違って、こちらが思っていることを100パーセント、VBAコーディ
ングで表現してやる必要があります。したがって、あなたが理解している以上のことは
VBAでエクセルにさせることはできません。コンピュータは理性的ですが、融通がききません。
「おぼろげ」な知識や「つもり」ではそれなりに、どころか、むしろ害のある働き方をします。
 
>オブジェクト変数という言葉さえ理解できてない
ということがわかっているのなら、それについて調べればよいのです。
エクセルVBAの変数について開設しているサイトをどれくらい目を通しましたか?
あるいは、VBAのヘルプをチェックしましたか?
もしくは、それについて解説してある本を購入してみましたか?
キョッチャンさんが理解した分だけエクセルは働きます。
(みやほりん)(-_∂)b

 iicinoseさん有難うございます。
 早速ichinoseさんにいただいたマクロでサンプルを作成し、テストしたところ
正常に作動いたしました。私の作成しているマクロ(以前書き込みをしています。)
と違いはないと思いますが、エラーが、
発生します。発生内容も以前に書き込んだ内容と同じです。
 今回相談の内容は、以前相談した内容と同様2種のブックの関係でエラーが発生しております。
ブックの設定に問題があるのでしょうか?HANAさんに教えていただいたことですが、今回は
ショートカットではないので、ブックのアイコンのプロバディを開いても、「リンク先」が
表示されないのでそれも確認できません。解りません。ギブアップ!(キョッチャン)

 みやほりんさん、佳さん
 再度申し上げます。私はマクロに関して初心者です。しかし、参考書も5〜6冊買いました(その中に
永井善王さん著の「Excel VBAマクロ組み方講座」もあります。)。ネットで検索もしております
(その中に永井善王さんが開かれている「すぐに役立つ・・・」。がよく出てきます。)。
 私の質問していることは、初歩的な質問でちょっと勉強すればすぐに解決できる、問題だと
とらえられているようですが、参考書を読んだり、ネットで検索しても解決できなかったから、
相談しているのです。失礼な言い方になりますが、「初心者はこのコーナーに入ってくるな。」と
おっしゃっているようにも、とらえました。しつこいようですが、再度申し上げます。私はマクロに
関して初心者です。(キョッチャン)


 こんにちは。佳です。

 > 私の質問していることは、初歩的な質問でちょっと勉強すればすぐに解決できる、問題だと
 > とらえられているようですが

 ああ、そのように感じられましたか。それは失礼しました。
 わたしの言いたいことは少し違っていて、ご質問の内容が初歩的かどうかは考えていません。
 勉強すればできることとも思っていません。あなたが勉強していないとも思っていません。

 勉強ではなく、、、大切なのは「考えることだ」と言いたいのです。
 自分でコードを書けるようになるには、「考えること」が絶対に必要です。
 考えずにコードは書けません。

 初心者だからってなにも考えられないということはありませんよね? 結果が出るかどうかは別として。
 同じ質問するにしても「○○のときエラーが出ます。どうしたらいいですか」というのと
 「○○のときエラーが出ます。○○にならない方法を考えてこんなことを試しましたが
 このようにうまくいきません。どうしたらいいですか」というのと、
 どちらのひとが考えていると思いますか?

 そして、今回のご質問は「考える」練習材料として ちょうど具合がよいのです。
 不慣れなひとでも、がんばって考えれば道が開けます。
 ご理解いただけますか?

 ご理解いただけたとしてはなしを進めます。
 「ファイルが開いていないときにコードを実行するとエラーが出る」ばあいにエラーを回避するには
 最初からファイルを開いてしまうのも一法ですが、じつは、方法はもうひとつあります。
 考えてみませんか?
 ヒント(になるか?) 答えを聞いたらひとによっては「ずるい」と感じるかもしれません。

 佳さん早速ご返事有難うございます。おっしゃっている内容はよく理解できます。そうです。
私は、もろに答えがほしかったわけではありません。解決のヒントがほしかったのです、後は考えます。
(まだヒントに対して実行していませんが、先にお礼を申し上げたくて返事を書いてしまいました。)
 このコーナーはこのようなことをやりとりする場ではないと注意を受けていましたが、
ichinoseさんや、HANAさんと同じ考えの方がいらっしゃるのに感動して書いてしまいました。
ほろ酔い気分で書いていますが、私の本当の気持ちです。有難うございます。(キョッチャン)

 >早速ichinoseさんにいただいたマクロでサンプルを作成し、テストしたところ
 >正常に作動いたしました。私の作成しているマクロ(以前書き込みをしています。)
 >と違いはないと思いますが、エラーが、
 違いない とは、
 >Book1.Xls(VBAコードやユーザーフォームがあるブック)とbook2.xlsは、同じフォルダ上に
 >存在することは確か

 ということで良いですか? それなのにエラーが発生する。

 それでは、もう一つ

 新規ブックの標準モジュ−ルに

 '==========================================================================
 Option Explicit
 Sub test()
    Dim bk2 As Workbook
    On Error Resume Next
    Set bk2 = Workbooks("book2.xls")
    If Err.Number <> 0 Then
       Err.Clear
       Set bk2 = Workbooks.Open(ThisWorkbook.Path & "\book2.xls")
       If Err.Number <> 0 Then
          MsgBox Err.Description
          Stop
       End If
    End If
    On Error GoTo 0
    With bk2
       .Activate
       .Worksheets(1).Activate
    End With
 End Sub

 として、実際に問題になっているBook2.Xls(私がコードで作成したBook2.Xlsではなく、
 キョッチャンさんが開くことができないBook2.Xlsです)と同じフォルダに保存してください。

 保存後()、上記のtestを実行してみてください。

 正常に開きますか?それとも何らかのエラーが発生しますか?

 まずは、これを試してみてください。

 それから、エラーになった問題のBook2.Xls と 正常に作動した私がコードで作成したBokk2.Xls

 違いをよくよく見比べてください。

 データ内容は 勿論違うでしょうねえ・・・。
 他には・・・・、VBAコードが登録されてるか否か とかetc
 引き続きこれも考えてみてください。

 ichinose@雪かきで腰が痛い


 ichinoseさん有難うございます。
 サンプルのBook1.xls、Book2.xlsと私の作成している、台帳.xls(Book1に相当)、データ.xls(Book2に
相当)は同じフォルダに保存しています。台帳.xlsのユーザーフォームのコマンドボタンに登録して
いるコードは以前にも書きましたが、以下のとうりです。ユーザーフォームのデータを最下行に追加
する、
 Private Sub CommandButton2_Click()
     Dim insertrow As Long
     Dim rend As Integer
     Dim bk2 As Workbook
    On Error Resume Next
    Set bk2 = Workbooks("book2.xls")
    If Err.Number <> 0 Then
       Err.Clear
       Set bk2 = Workbooks.Open(ThisWorkbook.Path & "\book2.xls")
       If Err.Number <> 0 Then
          MsgBox Err.Description
          Stop
       End If
    End If
    On Error GoTo 0
    With bk2
       .Activate
       .Worksheets("sheet1").Activate
    End With

     Cells(rend + 1, 8) = テキストボックス8.Text

     With Range("データ一覧")
        insertrow = .Rows.Count
        .Rows(insertrow).Insert shift:=xlDown

        .Cells(insertrow, 2) = Textbox2.Text
        .Cells(insertrow, 3) = Textbox3.Text
        .Cells(insertrow, 4) = Textbox4.Text
        .Cells(insertrow, 5) = Textbox5.Text
        ・
        ・
        ・
 End With
End Sub

です。

やはり、同様のエr−が発生いたします。(キョッチャン)


    Set bk2 = Workbooks("book2.xls")
    Set bk2 = Workbooks.Open(ThisWorkbook.Path & "\book2.xls")
 
これらのコードのブック名については実際のブック名に変更して
実行していらっしゃる、と考えればよろしいのですね?
 
その上で、Set bk2 = Workbooks.Open(ThisWorkbook.Path & "\book2.xls") にて
>同様のエr−が発生いたします。
「移動または削除されていないことを確認してください」が出るのだとすると、
ThisWorkBookと同じフォルダに、開こうとしている名前のブックがない、という結論になります。
 
もしかして、ネットワークパスの問題?かも知れませんが。
[[20070903145442]] 『2000,2003,2007環境下でのマクロ保存コマンドにつ』(まき)より抜粋
>自機のフォルダからファイルを開いた場合、ネットワークパスが 
>"\\ユーザー名\出荷依頼書原簿" だとしても、ファイルプロパティのパスは
>"C:\Documents and Settings\ユーザー名\My Documents\出荷依頼書原簿"
>が通ります。他機で開いた場合は "\\ユーザー名\出荷依頼書原簿" が(当然ですが)
>通ります。直接パスを書く場合、自機の場合は
>"C:\Documents and Settings\ユーザー名\My Documents\出荷依頼書原簿"
>他機の場合は
>"\\ユーザー名\出荷依頼書原簿"
>と使い分ける必要がある、と考える方法もありますが、ThisWorkbook.Pathなら自他の
>状況に応じたパスが取得される「はず」です。
いや、たぶんこれはないでしょう。
 
とにかく、開こうとしているブックの実際のフルパス名と、
コードで生成されるフルパス名を比べて検証する、という本当に「基礎」の
確認の部分をご自身でやっていただくべきです。
プログラミングの基礎はコーディングではなくて、デバッグ(検証と確認)です。
なお、
ショートカットじゃなくても、ファイルのプロパティでファイル名とフォルダ名は
確認できます。
(みやほりん)(-_∂)b

 私の名前が出ているので少しだけ。。。

 現在の問題に関しては、私ならまず マクロの記録をとってみます。
 開きたいブックを開くときに、エクセル自身はどの様に指定して開いてるのか
 (どこにあるどのブック と書いてそのブックを特定するのか)を知ることが出来ます。

 次に、現在「ThisWorkbook.Path & "\book2.xls"」で開こうとしていますが
 それが、同じ指定に成っているか確認します。
  簡単にメッセージボックスを表示させても良いと思いますし
  どこかのセルに書き出すようにしても良いと思います。
 もしも二つが違っていれば、エクセルに「そんなファイル無いから開けないよ」と言われるのは
 当然ですね。
 二つが同じなら。。。それは又次の検証の必要が有るでしょう。

 と、こちらはみなさんが居られるのでこの辺にして
 誤解が有る様な気がするのでコラム程度に。
  例えば、これから難しい試験が有るとします。
  試験前に
   1.不安だが「絶対出来る」「100点取るぞ」と思い受験する
   2.不安だから「全然駄目かもしれない」「0点かもしれない」と思い受験する
   3.不安に思いながら 2の思いを紙に書き出してそれをしっかり眺めた後受験する
  さて、どのパターンが一番良い点を取れると思いますか?
  実際は、全く同じ環境でパターンを変えて試すことは出来ませんが
  おそらく、1番が一番点数が良く、2番より3番の方が点数が悪いでしょう。

  みやほりんさんが「初心者ですって書いちゃ駄目だ」って言うのと同じです。
  それはやはり、キョッチャンさんに
  「問題に当たった時に、自分で解決出来るようになって欲しい」
  と言う思いの現れだと思いますよ。
  疲れたら[@絶対わかる!!@]を見て、自己暗示にかけてしまいましょう。

 (HANA)

 新規ブックの標準モジュ−ルに

 '==========================================================================
 Option Explicit
 Sub test()
    Dim bk2 As Workbook
    On Error Resume Next
    Set bk2 = Workbooks("book2.xls")
    If Err.Number <> 0 Then
       Err.Clear
       Set bk2 = Workbooks.Open(ThisWorkbook.Path & "\book2.xls")
       If Err.Number <> 0 Then
          MsgBox Err.Description
          Stop
       End If
    End If
    On Error GoTo 0
    With bk2
       .Activate
       .Worksheets(1).Activate
    End With
 End Sub

 として、実際に問題になっているBook2.Xls(私がコードで作成したBook2.Xlsではなく、
 キョッチャンさんが開くことができないBook2.Xlsです)と同じフォルダに保存してください。

 保存後()、上記のtestを実行してみてください。

 正常に開きますか?それとも何らかのエラーが発生しますか?

 まずは、これを試してみてください。

 前回投稿のこの結果は、どうなりますか?
 (ユーザーフォームが表示された状態と表示されていない状態で違います)

 ここを確実に答えてください。

 それから、確認ですが、手動操作では、開きますよねBOOK2.XLS

 ichinose@仕事中


 ichinoseさんのマクロで作成したものなので大丈夫とは思いますが、
 Book2.Xls.xls なんてことはないですよね。
 (semm)

 ichinose さんに教えていただいた、テストサンプルは正常に作動いたします。Book2.xlsを
閉じていても、私の希望どうり作動します。ichinoseさんのサンプルをBook1.xls、Book2.xlsと
し私のエラーの出るブック名をBook1xlsに相当するものを 「台帳.xls」 Book2.xlsを
「データ.xls」とします。(混乱と誤解を避けるため)データ.xlsは手動で開きます。
 (キョッチャン)昼休み時間中

 では、Book1.Xlsの
 標準モジュールに

 '=====================================================================
 Option Explicit
 Sub test2()
    Dim bk2 As Workbook
    On Error Resume Next
    Set bk2 = Workbooks("データ.xls")
    If Err.Number <> 0 Then
       Err.Clear
       Set bk2 = Workbooks.Open(ThisWorkbook.Path & "\データ.xls")
       If Err.Number <> 0 Then
          MsgBox err.number & "===>" & Err.Description
          Stop

       End If
    End If
    On Error GoTo 0
    With bk2
       .Activate
       .Worksheets(1).Activate
    End With
 End Sub

 これを実行しても同じですか?

 更に疑う訳ではないですが
 上記のBook1.Xlsの標準モジュールに

 sub test2()
    msgbox thisworkbook.path
 End sub

 で表示されるパスと

 データ.xlsの標準モジュールに

 sub test()
    msgbox thisworkbook.path
 End sub

 表示されるパスは、同じですか?

 二つ試してみてください。

 ichinose@名前忘れた


 Book1.xlsの標準モジュールに
 Option Explicit
 Sub test2()
    Dim bk2 As Workbook
    On Error Resume Next
    Set bk2 = Workbooks("データ.xls")
    If Err.Number <> 0 Then
       Err.Clear
       Set bk2 = Workbooks.Open(ThisWorkbook.Path & "\データ.xls")
       If Err.Number <> 0 Then
          MsgBox err.number & "===>" & Err.Description
          Stop

       End If
    End If
    On Error GoTo 0
    With bk2
       .Activate
       .Worksheets(1).Activate
    End With
 End Sub
 を貼り付けマクロを実行したところ、データ.xlsが開きました。

 標準モジュールに貼り付けてデータ.xlsが開いたので、台帳.xlsの標準モジュールに貼り付け
マクロを実行したところ、データ.xlsが開きました。そこでデータ.xlsを上書き保存して閉じ
今度は、ユーザーフォームのコマンドボタン2をクリックしたところデータ.xlsが開くでは
ありませんか。
 今度は台帳.xlsを上書き保存せず閉じて再度ユーザーフォームのコマンドボタン2をクリックした
ところ正常に作動いたします。
 行ったことは台帳の標準モジュールに
  Option Explicit
 Sub test2()
    Dim bk2 As Workbook
    On Error Resume Next
    Set bk2 = Workbooks("データ.xls")
    If Err.Number <> 0 Then
       Err.Clear
       Set bk2 = Workbooks.Open(ThisWorkbook.Path & "\データ.xls")
       If Err.Number <> 0 Then
          MsgBox err.number & "===>" & Err.Description
          Stop

       End If
    End If
    On Error GoTo 0
    With bk2
       .Activate
       .Worksheets(1).Activate
    End With
 End Sub
 を貼り付け、マクロを実行しデータ.xlsを実行しデータ.xlsを上書き保存して
閉じただけでほかのマクロコードは変更しておりません。私にはなぜ正常になったのか
想像もつきません。(キョッチャン)


 正常に動作しているということですか?

 >私にはなぜ正常になったのか
 ↑これは、私にもわかりません。
 投稿されていない箇所に 原因が含まれているかもしれませんしね。

 長いコードを記述していると、エラーになるわけないのに 何で ここで止まるの?
 と思うことは 私にも何回かありました。
 コードに空白行を1行入れただけで正常作動するようになったとかね!!
 また、何でループしているの そんなはずないのに・・・。
 と変数名を aaa から aaaaに変えただけで正常に作動したとか・・・。

 これは、VBAインタープリタに何かバグが潜んでいるなあ と思っていますけど・・。
 もっとも再現手順書が作成できないので この手の掲示板で投稿ができませんが・・・。

 これで大丈夫というわけではありませんが、私は、コード記述し、ブックを保存する前には、
 VBEにて、デバッグ-----VBAProjectのコンパイル をすることを習慣づけています。

 台帳の標準モジュールにコードを追加しただけで正常作動するようになった ということが
 本当であれば、前述した事と関わりがあるのかもしれません。

 とにかくVBAってバグは多いから・・・。

 ichinose@本日、多忙の予感


 ichinoseさんありがとうございます。
 原因がわかりました。私の単純ミスでした。
 会社にはまだマクロを書き換えてないBook「台帳」とBook「データ」があるので原因は何か確認
することにしました。
 まず皆さんパスの間違いの指摘が多かったのでそれぞれのブックのプロバディで確認しました。
 異常は見当たりませんでした。そこでそこで以前教えていただいた、もうひとつのパスの確認方法
ショートカットのプロバディではリンク先が表示されることを思い出し、Book「データ」の
ショートカットを作成し、そのプロバディでリンク先を確認したところ、¥マイドキュメント
¥データ.xls.xls”と表示されているではありませんか。
 私は以前拡張子.xlsはできるだけつけたほうがマクロのエラーは発生しづらくなると
教わり、参考書にも、Book名が「データ.xls」となっているのを多く見受けていたので、これを実行していましたが、
今回はこれが間違いでした。拡張子.xlsをつけるのはあくまでマクロ処理の中でのことで、
ブック名に.xlsをつけるとこれは拡張子でなくマクロではブックの名前と判断し、マクロ内での
処理はさらに.xlsが必要だったのです。ブックのプロバディ全般の最上段に表示される名前も
「データ。xls」だったので全く異常と私は認識しませんでした。このブック名の.xlsを削除し
ichinoseさんのマクロをユーザーフォームのコマンドボタンのマクロに貼り付けコマンドボタンを
クリックしたところ、思ったとおりの作動をもとの台帳でもしました。
 今回の質問に答えてくださった皆さん、失礼な言葉も述べましたが、どうかお許しください。
エクセル、マクロは難しいですね。これにもめげず勉強を続けたいと思います。今後ともよろしく
お願いいたします。
 (キョッチャン)仕事中に

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.