Excel VBA質問箱 IV

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

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


255 / 3841 ページ ←次へ | 前へ→

【77338】Re:comboboxのDropButtonClicを自動で開く
発言  β  - 15/7/24(金) 2:50 -

引用なし
パスワード
   実際に、実装レベルで、InitializeとActivateで、どうなっているかはうかがい知れませんが
ユーザーフォームが表示されて機能する部分と表示前に機能する部分は、なんとなく勘(?)。
勘がはずれても、やってみれば、あぁ、こうなんだと。

SendKeysに関しては、ichinoseさんから回答があるように、
実行はキュー(っていうんでしょうか?)に入っていて、表示されたときに、
キーストロークがそのフォームにぶつけられるんでしょうね。

たとえば、StartupPositionが1のユーザーフォームで

Private Sub UserForm_Initialize()
  MsgBox "Init:" & Me.Left
End Sub

Private Sub UserForm_Activate()
  MsgBox "Act:" & Me.Left
End Sub

Initializeは、メモリーに呼びこまれただけでひょうじされていませんので 0 ですね。
表示されて初めて実際の値が取得できます。

また、

Private Sub UserForm_Initialize()
  MsgBox "Init"
  Unload Me
End Sub

これだと エラーになりますね。

Private Sub UserForm_Activate()
  MsgBox "Act"
  Unload Me
End Sub

Initializeが完了して初めて Unload が可能になるようです。

また、

Private Sub UserForm_Initialize()
  MsgBox "Init"
  Me.Hide
End Sub

Private Sub UserForm_Activate()
  MsgBox "Act"
  Me.Hide
End Sub

Initialize では表示されていないので、Hideもなにも、あったものではないんですが
実際にInitializeでは機能していないことが、Activateで表示されたときにわかりますね。
・ツリー全体表示

【77337】Re:comboboxのDropButtonClicを自動で開く
発言  ichinose  - 15/7/23(木) 23:57 -

引用なし
パスワード
   ▼マナ さん:
>▼β さん:
>
>解決したようなので、よろしければ、関連で教えてください。
>Activateでなく、Initailizeだとできないのですが
>そういうものでしょうか。
Excel2010では、コンボボックスの位置と結構離れた位置でリストが表示されます。
Initailizeは、ユーザーフォームが表示される前に発生するイベントなので
このような不具合になるのでしょうねえ!!

Sendkeysでも プロシジャー内で "%{Down}"が実行されるように


SendKeys "%{Down}", True とすると、
ComboBox1.DropDownと同じ結果になります。

SendKeys "%{Down}" だと、ユーザーフォームが表示後に"%{Down}"が実行されますから・・・。


Activateイベントでは、可能でも Initializeでは不可なことって
他にもいくつかあったはずですよ、今は 思い出せませんが・・・。
・ツリー全体表示

【77336】Re:comboboxのDropButtonClicを自動で開く
質問  マナ  - 15/7/23(木) 20:19 -

引用なし
パスワード
   ▼β さん:

解決したようなので、よろしければ、関連で教えてください。
Activateでなく、Initailizeだとできないのですが
そういうものでしょうか。

SendKeysでは、できるのですが、
私が勘違いしているだけで、当たり前のこと?

Private Sub UserForm_Initialize()

  ComboBox1.List = Array("a", "b")
'  ComboBox1.SetFocus
  ComboBox1.DropDown
'  SendKeys "%{Down}"
'  Application.OnTime Now + TimeValue("00:00:1"), "drop"
  
End Sub
・ツリー全体表示

【77335】application file serch
発言  もぐら E-MAIL  - 15/7/23(木) 16:39 -

引用なし
パスワード
   超初心者ですが、宜しくお願いします。
FileSearch()
  Dim FSO As Object, Folder As Variant
  Set FSO = CreateObject("Scripting.FileSystemObject")
  For Each Folder In FSO.GetFolder("G:\").SubFolders
    Debug.Print Folder.Path
  Next Folder
ふるいバージョンのマクロが動作しないので、これを使って、読みにいきたいのですが、記述がわかりません>< 
もともとは
Set fs = Application.FileSearch 'ファイルの有無
With fs
  .LookIn = "G:\"
  .Filename = "*." & n
  If .Execute(SortBy:=msoSortByFileName, _
      SortOrder:=msoSortOrderAscending) > 0 Then
    For j = 1 To .FoundFiles.Count
      m = m + 1
    Next j
こんなふうになっていました。
御教授お願いいたします。。
・ツリー全体表示

【77334】Re:comboboxのDropButtonClicを自動で開く
お礼  tomi  - 15/7/23(木) 4:06 -

引用なし
パスワード
   ▼β さん:
>▼tomi さん:
>
>こんなことでしょうか?
>
>Private Sub UserForm_Activate()
>  ComboBox1.DropDown
>End Sub
ありがとうございました。解決しました。
・ツリー全体表示

【77333】Re:int関数の戻り値が小さくなってしまい...
発言  γ  - 15/7/22(水) 21:41 -

引用なし
パスワード
   いわゆる演算誤差の話ですね。
ht tp://pc.nikkeibp.co.jp/pc21/special/gosa/
↑に対応策も含めて書かれていますので、参照して下さい。
・ツリー全体表示

【77332】Re:comboboxのDropButtonClicを自動で開く
発言  β  - 15/7/22(水) 19:43 -

引用なし
パスワード
   ▼tomi さん:

こんなことでしょうか?

Private Sub UserForm_Activate()
  ComboBox1.DropDown
End Sub
・ツリー全体表示

【77331】comboboxのDropButtonClicを自動で開く
質問  tomi  - 15/7/22(水) 19:09 -

引用なし
パスワード
   よろしくお願いします。
 ユーザーフォームにComboboxがあります。
 ユーザーフォームをが表示された時にDropButtonClickが自動で開く様ににするにはどのように記述すればよいか教えて頂きたいと思います。
 エクセル2007です。
・ツリー全体表示

【77330】int関数の戻り値が小さくなってしまいます
質問  OMG2015  - 15/7/22(水) 11:44 -

引用なし
パスワード
   WindowsXP,7, Excel2010,2013です。
Excelシート上のセルの値(小数点以下1ケタ)の整数値を取得しようと
int関数を利用しましたが、
69.0→int(セルのvalue)→68 となってしまう現象が発生して、原因が
わからず困っています。

セルの値は別の3列の合計値です。データが多いので、シートをいったん
メモリ上に展開して、variantの配列をコード上で地味に足し算して
合計列用の配列(1列分)variantに格納し、合計列を張り付けています。
3列のセル値は、 26.4 40.8 1.8 です。合計列には69.0となります。
その後、int関数でセル値を処理すると68となってしまいます。
ちなみに、5.3 17.3 7.4 を足して合計30.0になった箇所はintしても30と
返ります。
問題の個所は、int以外にfixでも68となります。
転記前の型をdoubleの配列にしても同じです。
セルに直接69と入力して、int(セルのvalue)とすると、69となります。
原因と解決策を探しています。
Valueは同じだけれど、何か違う値が入っているのだと思いますが、
それを調べる手段もわかればいいのですが・・・

どうぞよろしくお願いします。。
・ツリー全体表示

【77329】Re:パスワードでロック
お礼  翔子  - 15/7/7(火) 10:29 -

引用なし
パスワード
   β様

思うようにできました
本当にありがとうございます。
・ツリー全体表示

【77328】Re:パスワードでロック
質問  翔子  - 15/7/7(火) 9:55 -

引用なし
パスワード
   ▼β様

>マクロ処理をしなくても、手作業で、注文書シートの該当セルの書式を変更して>おけばいいのでは?

手作業でロックしたら、注文書Sheetに

'1 Sheet注文書(E2)コードを入力enterで
'2 Sheet詳細(E列コード),(F列品名)から
' Sheet注文書(E3)に品名を持ってくる
'Sheet注文書での処理
'3 D6に値が入ったら、C6にE3の品名が入るように。
'4 D7に値が入ったら、C7にE3の品名が入るように。
'5 D8に値が入ったら、C8にE3の品名が入るように。
'6 D9に値が入ったら、C9にE3の品名が入るように。
'7 D10に値が入ったら、C10にE3の品名が入るように。

'入力のあったセルが [E2]のときは (1) を実行し、
'[D6:D10]のときは (2)を実行するように If〜 Else〜 End If構文で分岐処理

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Rg As Range
Dim c As Range
'(1) -----------------------------------------------------------
If Target.Address(0, 0) = "E2" Then
  Dim m As Variant
  With Worksheets("詳細") '別シートのコード照合セル範囲
     Set Rg = .Range("E2", .Cells(.Rows.Count, "E").End(xlUp))
  End With
  Application.EnableEvents = False
  If IsEmpty(Target) Then
    Target.Offset(1).ClearContents
  Else
    m = Application.Match(Target, Rg, 0) 'Match関数で検索
     If IsNumeric(m) Then
      Target.Offset(1).Value = Rg.Item(m, 2).Value
    Else
      Target.Offset(1).ClearContents
      MsgBox "入力されたコードはありません"
    End If
  End If
  Application.EnableEvents = True
 
'(2) -----------------------------------------------------------
Else
  Set Rg = Intersect(Target, Range("D6:D10"))
  If Rg Is Nothing Then Exit Sub

   Application.EnableEvents = False
  For Each c In Rg
    If Not IsEmpty(c.Value) Then
      c.Offset(, -1).Value = Range("E3").Value
    End If
  Next
  Application.EnableEvents = True
End If
End Sub
が、作動しないのです。

Sheets("注文書")E2,E4,G4以外ロック。

Sheets"詳細")A1:F893にロック。

Private Sub Workbook_Open()
Sheets("注文書").Select
      Range("A1").Value = Date
・ツリー全体表示

【77327】Re:実行時エラー91について
質問  ぴょん  - 15/7/6(月) 20:29 -

引用なし
パスワード
   βさん、ichinoseさん色々ご指導ありがとうございました。

結論としまして、Public変数は使用せず、チェックボックスの作成と削除の各プロシージャでDim Ws As WorksheetとSet Ws = Wb.Worksheets("sheet1")するようにしました。
これだと10回以上チェックボックスの作成と削除を繰り返しても正しく動きました。

お二方とも本当にありがとうございました。
・ツリー全体表示

【77326】Re:実行時エラー91について
発言  β  - 15/7/5(日) 23:26 -

引用なし
パスワード
   ▼ぴょん さん:

あぁ、今、Book.xlsm を自ブック(このマクロブック)にして実行しましたら
一発でエラーになりました。

やはり、ichinoseさんが回答された通りですね。
紹介されたトピの中に、「自ブックに対する」OLEOBJECT の生成は、
プロジェクトのリセットのような状況、つまり、モジュールレベルの変数も
初期化されるという説明がありましたね。

回避方法としては、ichinoseさんが言われるように、Ws1 や Ws2 をファンクションプロシジャにする。
それが、コード修正を見にミニマイズする手立てだと思います。
・ツリー全体表示

【77325】Re:実行時エラー91について
発言  ichinose  - 15/7/5(日) 23:18 -

引用なし
パスワード
   ▼ぴょん さん:
>▼ichinose さん:
>返信ありがとうございます。
>
>下記は、標準モジュールに記述して、保存しようとすると”名前が適切ではありません WB”とコンパイルエラーになってしまいます。
>未熟なものですいませんが、よろしくお願いします。
>
>>Function Wb() as workbook
>>  set wb=Workbooks("Book.xlsm")
>> end function
Public変数は、消すんですよ そうしないと名前が重複してしまいます。
・ツリー全体表示

【77324】Re:実行時エラー91について
発言  β  - 15/7/5(日) 23:18 -

引用なし
パスワード
   ▼ぴょん さん:

>下記βさんのコーディングと私のやつと違いがありますか?
>ちなみに、EXCELは私も2010です。

同じです。

おそらく ichinoseさんが指摘される状況になっているんだと思うのですが
一方、同じ xl2010の、こちらでは少々のことなら(?)耐えられている???

ichinoseさんが紹介された議論は、かなり古いバージョンのエクセルのもとでの現象なので
今は、そういうこともないのかもしれません。

なので、もしかしたらアップされたコード以外のところの別の原因かもしれないということで
ウォッチ式の設定でのチェックを提案しました。

ところで、"Book.xlsm" は別ブックですか?
それとも、このマクロが書かれたブックですか?

私のテストは、別ブックとして実行しています。
・ツリー全体表示

【77323】Re:実行時エラー91について
発言  ぴょん  - 15/7/5(日) 22:34 -

引用なし
パスワード
   ▼β さん:

毎度、コメントありがとうございます。
下記βさんのコーディングと私のやつと違いがありますか?
ちなみに、EXCELは私も2010です。
試行錯誤してるんですが、なかなか難しくて(^^;
・ツリー全体表示

【77322】Re:実行時エラー91について
発言  ichinose  - 15/7/5(日) 22:31 -

引用なし
パスワード
   >でも、使った方が楽ということもありますので、ケースバイケース。
モジュールレベルの変数を否定している訳ではありません。
そんなこと言ったらクラスを否定しなければなりません。

標準モジュールのPublic変数を作らないほうが良い と言っています。


>
>こちらの xl2010,xl2013 で、ボタンクリックを、5回ずつ実行。
>1回あたり100個のチェックボックスを生成していて、だんだん遅くはなるんですが
>エラーにはならず、それぞれ、500個のチェックボックスが作られました。
>
これに関しては、私の認識不足がありました。作成するActiveXControlが
アクティブシートでなければ、変数が初期化されませんでした。


こんな手順で初期化が再現されました。


新規ブック(Sheet1 Sheet2 というシートが存在する)にて、
Sheet1にActiveXControlのコマンドボタンを二つ配置してください。
(CommandButton1 CommandButton2)。

標準モジュールに 私が否定しているPublic変数の宣言

Option Explicit
Public Wb As Workbook        'ワークブック
Public Ws1 As Worksheet       'ワークシート
Public Ws2 As Worksheet       'ワークシート


ThisworkBookのモジュールに

Option Explicit
Private Sub Workbook_Open()
  Set Wb = Me
  Set Ws1 = Wb.Worksheets("Sheet1")
  Set Ws2 = Wb.Worksheets("Sheet2")
End Sub


Sheet1のモジュールに


Option Explicit
Private Sub CommandButton1_Click()
  Dim x As Long
  Dim xx As Long
  xx = 5
  For x = 1 To xx
     'チェックボックスを作成する
    With Ws2.OLEObjects.Add(ClassType:="Forms.CheckBox.1", Link:=False, DisplayAsIcon:=False)
     End With
   Next x
End Sub
Private Sub CommandButton2_Click()
  Dim tctrl As Object
  For Each tctrl In Ws2.Shapes
    If Left(tctrl.Name, 8) = "CheckBox" Then
      Ws2.Shapes(tctrl.Name).Delete
    End If
  Next
End Sub

と殆ど ぴょんさんが提示されたコードと同じですが、同期がとれるように
再度、記述しておきます。

Sheet2のシートをアクティブにして セルA1を選択してください。
Sheet1のシートをアクティブにしてください。

これを 適当な場所に 変数初期化1.xlsm という名前で保存してください。


一度、このブックを閉じたのち、再度開いてください。


1 Commandbutton2をクリックしてください。
2 Commandbutton1をクリックしてください。
  Sheet2にチェックボックスが作成されます。

3 Sheet2をアクティブにしてください。
4 チェックボックスが作成されている事を確認し、この状態で上書き保存を行ってください。

5 保存後に Sheet1をアクティブにしてください。

この1〜5を繰り返してください。何度目かの2で
実行時エラー:91 オブジェクト変数またはWithブロック変数が設定されていません

が発生しました(殆ど2回目の2で発生します)。
・ツリー全体表示

【77321】Re:実行時エラー91について
発言  ぴょん  - 15/7/5(日) 22:29 -

引用なし
パスワード
   ▼ichinose さん:
返信ありがとうございます。

下記は、標準モジュールに記述して、保存しようとすると”名前が適切ではありません WB”とコンパイルエラーになってしまいます。
未熟なものですいませんが、よろしくお願いします。

>Function Wb() as workbook
>  set wb=Workbooks("Book.xlsm")
> end function
・ツリー全体表示

【77320】Re:実行時エラー91について
発言  β  - 15/7/5(日) 20:56 -

引用なし
パスワード
   ▼ぴょん さん:

報告だけです。

ichinoseさんのご指摘通り、私もモジュールレベル変数については、いつも、おっかなびっくりで
どきどきしながら使っています。
プロジェクトリセット時の値の消滅というより、プログラム構成としての堅牢性も気になりますので。

でも、使った方が楽ということもありますので、ケースバイケース。

こちらの xl2010,xl2013 で、ボタンクリックを、5回ずつ実行。
1回あたり100個のチェックボックスを生成していて、だんだん遅くはなるんですが
エラーにはならず、それぞれ、500個のチェックボックスが作られました。


Private Sub Workbook_Open()
  Set Wb = Workbooks("Book.xlsm")
  Set Ws1 = Wb.Worksheets("Sheet1")
  Set Ws2 = Wb.Worksheets("Sheet2")
End Sub

Private Sub CommandButton1_Click()
  Dim x As Long
  Dim xx As Long
  
  xx = 100
  
  For x = 1 To xx
  
     'チェックボックスを作成する
    With Ws2.OLEObjects.Add(ClassType:="Forms.CheckBox.1", Link:=False, DisplayAsIcon:=False)
     End With
  
   Next x

End Sub

■標準モジュール
Public Wb As Workbook       'ワークブック
Public Ws1 As Worksheet       'ワークシート
Public Ws2 As Worksheet       'ワークシート
・ツリー全体表示

【77319】Re:実行時エラー91について
発言  ichinose  - 15/7/5(日) 19:51 -

引用なし
パスワード
   ▼ぴょん さん:
>”実行時エラー:91 オブジェクト変数またはWithブロック変数が設定されていません”が出る時があります。
>
>・オブジェクト型変数はプロジェクト内で共通参照できるように、Publicで宣言。
>ブックオープン時に1回だけSetを実施。
変数が初期化される現象

www.vbalab.sakura.ne.jp/vbaqa/c-board.cgi?cmd=one;no=7011;id=excel

私も以前、経験しました。

原因はこれと同じだと思います。

モジュールレベルの変数は、十分注意が必要です。

今回の場合なら、

Function Wb() as workbook
  set wb=Workbooks("Book.xlsm")
end function

辺りで回避はできますが、Workbooks("Book.xlsm")でもいいのでは と思います。


それから、問題とは直接関係ないですが、Public変数を標準モジュールにおくのは、
なるべく止めた方がよいです。
というか そうしない習慣を付けた方がよいですよ
・ツリー全体表示

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