Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


10564 / 13644 ツリー ←次へ | 前へ→

【20980】ユーザフォームについてのオートメーションエラー 羅刹 05/1/5(水) 17:35 質問[未読]
【20990】Re:ユーザフォームについてのオートメーシ... IROC 05/1/6(木) 7:12 回答[未読]
【20993】Re:ユーザフォームについてのオートメーシ... 羅刹 05/1/6(木) 9:24 発言[未読]
【21010】Re:ユーザフォームについてのオートメーシ... IROC 05/1/6(木) 17:28 回答[未読]
【21013】Re:ユーザフォームについてのオートメーシ... 羅刹 05/1/6(木) 18:20 回答[未読]
【21018】Re:ユーザフォームについてのオートメー... IROC 05/1/7(金) 10:27 回答[未読]
【21022】Re:ユーザフォームについてのオートメー... 羅刹 05/1/7(金) 18:24 回答[未読]
【21026】Re:ユーザフォームについてのオートメー... IROC 05/1/7(金) 21:08 回答[未読]
【21032】Re:ユーザフォームについてのオートメー... ちゃっぴ 05/1/8(土) 13:02 発言[未読]
【21076】Re:ユーザフォームについてのオートメー... 羅刹 05/1/11(火) 9:12 回答[未読]
【21077】Re:ユーザフォームについてのオートメー... IROC 05/1/11(火) 10:33 回答[未読]
【21080】Re:ユーザフォームについてのオートメー... 羅刹 05/1/11(火) 12:04 回答[未読]

【20980】ユーザフォームについてのオートメーショ...
質問  羅刹  - 05/1/5(水) 17:35 -

引用なし
パスワード
   こんばんわ。ユーザフォームを起動し、処理をして、その後続けて処理をすると
オートメーションエラーが発生します。
発生する場所はシートを切り替える時です。
OS2000では発生しない問題ですが、XPでは発生します。
回避しその後続けてユーザフォームをつかえる方法はないものでしょうか。
色々見てフォーム連続して表示する方法でやりましたがだめでした。
do
userform.show
loop
unload me

【20990】Re:ユーザフォームについてのオートメー...
回答  IROC  - 05/1/6(木) 7:12 -

引用なし
パスワード
   >ユーザフォームを起動し、処理をして、その後続けて処理をすると
>オートメーションエラーが発生します。
>発生する場所はシートを切り替える時です。

これについて、もう少し詳しく教えて頂けませんか?
こちらで試す方法があれば教えて下さい。

「シートを切り替える時」というのは、Activate、Selectなどでしょうか?
対象のシートは非表示になっていたりしませんか?
マクロを部分的にコメント化して、不具合部分の切り出しは出来ないでしょうか?

【20993】Re:ユーザフォームについてのオートメー...
発言  羅刹  - 05/1/6(木) 9:24 -

引用なし
パスワード
   IROC さんありがとうございます。詳しく言いますと、
今まで手動で切り換えたり、activateをつかってシートを切り換えていたのですが、
その切り換え時にXP(OS)ではエラーが発生します。

それは一度ユーザフォームを何度も繰返し使っているからという判断は少しついたのですが(もしかしたらそれが原因ではないかもしれませんが)、XPだけで出る現象なのでわかりません。
よろしければご教授願います。

>対象のシートは非表示になっていたりしませんか?
シートは非表示にはなっていません。

(以下抜粋し載せます)
1.ボタンを押してユーザフォームを表示させます。シート1に記述。

Private Sub CommandButton1_Click()

Do
 CDNtule_form.Show
Loop
Unload me
end sub

2.シートを対象のシートになるまで切り換える。
Set Mysheet = ActiveWorkbook.Sheets
sheet_count = Mysheet.Count '全シート数

jj = 1

For jj = 1 To sheet_count
 description_sheet_nm(jj) = Worksheets(jj).Name
 Worksheets(description_sheet_nm(jj)).Activate
 ↑この部分でオートメーションエラーが発生します。

 yesno = MsgBox("選択されたシートは" & description_sheet_nm(jj) & "です。これでよろしいですか?", vbYesNo)
 
 If yesno = 6 Then
  Exit For
 End If
Next

長くなってしまいましたが、以上宜しくお願いいたします。

【21010】Re:ユーザフォームについてのオートメー...
回答  IROC  - 05/1/6(木) 17:28 -

引用なし
パスワード
   >Private Sub CommandButton1_Click()
> Do
> CDNtule_form.Show
> Loop
> Unload me
>end sub

↑ここでは何のためにループしているのでしょうか?


>2.シートを対象のシートになるまで切り換える。
>Set Mysheet = ActiveWorkbook.Sheets
>sheet_count = Mysheet.Count '全シート数
>
>jj = 1
>
>For jj = 1 To sheet_count
> description_sheet_nm(jj) = Worksheets(jj).Name
> Worksheets(description_sheet_nm(jj)).Activate
> ↑この部分でオートメーションエラーが発生します。
>
> yesno = MsgBox("選択されたシートは" & description_sheet_nm(jj) & "です。これでよろしいですか?", vbYesNo)
> 
> If yesno = 6 Then
>  Exit For
> End If
>Next

上記のコードは、どこに記述して使用しているのでしょうか?
この処理は解りづらいのですが、どのようなことをしたいのか
目的を教えて頂けませんでしょうか?

【21013】Re:ユーザフォームについてのオートメー...
回答  羅刹  - 05/1/6(木) 18:20 -

引用なし
パスワード
   ▼IROC さんわかりづらくてすみません。
>>Private Sub CommandButton1_Click()
>> Do
>> CDNtule_form.Show
>> Loop
>> Unload me
>>end sub
>
>↑ここでは何のためにループしているのでしょうか?
フォームをループしたのは連続的に表示させたかったからです。ただ
フォーム名.showとだけ書いてもいいでしょうが。。。

>上記のコードは、どこに記述して使用しているのでしょうか?
>この処理は解りづらいのですが、どのようなことをしたいのか
>目的を教えて頂けませんでしょうか?

その後書いたのは、フォームの中で記述しているソースです。
処理はフォームを開き、ファイルを開くボタンを押下し、データファイルを開き、
対象のシートを選択します。
シートがどこにあるか判断つかないので、msgboxを使用して1シートずつアクティブにしてユーザに判断してもらいます。そして対象のシートになるまでfor nextでまわしています。
2000では worksheets(シート名(jj)).activateで問題なく選択できたのですが。。
XPのバグなのかなんなのかわかりません。
申し訳ありませんがご教授願います。
もしかすると前文の シート名(jj) = Worksheets(インデックスNO).Name
これが悪さしてるのでしょうか。

乱筆、乱文失礼致しました。宜しくお願いいたします。

【21018】Re:ユーザフォームについてのオートメー...
回答  IROC  - 05/1/7(金) 10:27 -

引用なし
パスワード
   >フォーム名.showとだけ書いてもいいでしょうが。。。
ループ内でShowで繰り返す意味はありませんので、その方が良いと思います。


>その後書いたのは、フォームの中で記述しているソースです。
>処理はフォームを開き、ファイルを開くボタンを押下し、データファイルを開き、
>対象のシートを選択します。
>シートがどこにあるか判断つかないので、msgboxを使用して1シートずつアクティブに
>してユーザに判断してもらいます。そして対象のシートになるまでfor nextでまわして
>います。


修正してみましたので試してみて下さい。
なお、対象のブックを ActiveWorkbook にしてありますが、
Active〜というのはあまり良くありませんので、
「ファイルを開くボタンを押下し、データファイルを開き」とのことなので、
この時点で、オブジェクト変数に代入して参照した方が良いと思います。
(GetOpenFilenameメソッドとOpenメソッドをお使いでしょう?)


Dim i As Long

With ActiveWorkbook

  For i = 1 To .Sheets.Count
    .Worksheets(i).Activate
    
    If vbYes = MsgBox("選択されたシートは、 " & _
          .Worksheets(i).Name & " です。" & Chr(13) & Chr(13) & _
          "これでよろしいですか?" _
          , vbYesNo + vbQuestion, _
          "シート選択 : " & i & "/" & .Sheets.Count) Then
      Exit For
    End If
   
  Next i
End With

【21022】Re:ユーザフォームについてのオートメー...
回答  羅刹  - 05/1/7(金) 18:24 -

引用なし
パスワード
   ▼IROC さんありがとうございます。
この方法でtryしてみます。

>修正してみましたので試してみて下さい。
>なお、対象のブックを ActiveWorkbook にしてありますが、
>Active〜というのはあまり良くありませんので、
>「ファイルを開くボタンを押下し、データファイルを開き」とのことなので、
>この時点で、オブジェクト変数に代入して参照した方が良いと思います。
>(GetOpenFilenameメソッドとOpenメソッドをお使いでしょう?)

オブジェクト変数に代入っていうのがよくわからないのですが。。(すみません素人で)

getopenfilenameを使って以下のようにしました。
file_open = Application.GetOpenFilename("えくせる (*.xls; *.csv), *.xls; *.csv", , "最新の収容管理表選択")

してその後にopenしてます。ファイル名は変数に代入してます。

【21026】Re:ユーザフォームについてのオートメー...
回答  IROC  - 05/1/7(金) 21:08 -

引用なし
パスワード
   >オブジェクト変数に代入っていうのがよくわからないのですが

OPENメソッドのときに、ワークブックオブジェクトに代入することによって、
以降の記述が変数wbにより指定できます。


Dim file_open As String
Dim wb As Workbook

file_open = Application. _
      GetOpenFilename("えくせる (*.xls; *.csv), *.xls; *.csv", _
      , "最新の収容管理表選択")

  If file_open = "False" Then
    MsgBox "キャンセル"
    Exit Sub
  End If

  Set wb = Workbooks.Open(file_open)
  
  MsgBox "開かれたブックのアクティブシートは、 " & wb.ActiveSheet.Name
  MsgBox "開かれたブックは、 " & wb.Name & " を閉じます。"
  
  wb.Close False

【21032】Re:ユーザフォームについてのオートメー...
発言  ちゃっぴ  - 05/1/8(土) 13:02 -

引用なし
パスワード
   >OPENメソッドのときに、ワークブックオブジェクトに代入することによって、
>以降の記述が変数wbにより指定できます。

前から思っていたのですが、VBAのHelpって結構雑ですよね。
なんで、Methodの戻り値について書いてないのかな?

SDKのReferenceなんかだと、ちゃんとReturn Valuesって項目あるのに・・・

まあそういうわけで、

「Methodの戻り値があるかどうか調べる方法」

{F2}Keyを押し、Object Browserを起動し、対象のMethodを検索
 
今回の場合、WorkbooksのOpen Method を調べると、

> Function Open(Filename As String, [UpdateLinks], [ReadOnly],
> [Format], [Password], [WriteResPassword], [IgnoreReadOnlyRecommended],
> [Origin], [Delimiter], [Editable], [Notify], [Converter], [AddToMru],
> [Local], [CorruptLoad]) As Workbook
             ~~~~~~~~~~~
のように表示されるので、Open MethodがFunctionでExcel.Workbook型の
戻り値を返すことがわかります。

もっとも、Code Mojuleに「Workbooks.Open(」とTypeした辞典で、
同様のMessageがPopup表示されますが・・・

【21076】Re:ユーザフォームについてのオートメー...
回答  羅刹  - 05/1/11(火) 9:12 -

引用なし
パスワード
   お返事遅くなってすみません。IROC さん,ちゃっぴさんありがとうございました^0^
まだまだ知らない事は無限にありますね。日々精進ですね。
最後にwb.close falseとしていますが、ファイルは閉じたくないので
set wb = nothing だけでも平気なのでしょうか。

【21077】Re:ユーザフォームについてのオートメー...
回答  IROC  - 05/1/11(火) 10:33 -

引用なし
パスワード
   >set wb = nothing だけでも平気なのでしょうか。

平気ですよ。
なお、プロシージャレベルの変数は、プロシージャが終了すれば破棄されるので、
わざわざ nothing しなくても大丈夫だと思います。

【21080】Re:ユーザフォームについてのオートメー...
回答  羅刹  - 05/1/11(火) 12:04 -

引用なし
パスワード
   早急な回答ありがとうございます。^_^
勘違いでプロシージャレベルでもしなければよくないのかなと思ってました。
ここ反映されるの遅いですね。

結果が出ましたらここでお知らせいたします。
▼IROC さん:
>>set wb = nothing だけでも平気なのでしょうか。
>
>平気ですよ。
>なお、プロシージャレベルの変数は、プロシージャが終了すれば破棄されるので、
>わざわざ nothing しなくても大丈夫だと思います。

10564 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free