Excel VBA質問箱 IV

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

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


2816 / 13646 ツリー ←次へ | 前へ→

【65609】組込みダイアログにチェックBoxを追加したい みーちゃんキャット 10/6/14(月) 5:25 質問[未読]
【65612】Re:組込みダイアログにチェックBoxを追加し... neptune 10/6/14(月) 13:46 回答[未読]
【65615】Re:組込みダイアログにチェックBoxを追加し... みーちゃんキャット 10/6/14(月) 17:13 質問[未読]
【65616】Re:組込みダイアログにチェックBoxを追加し... neptune 10/6/14(月) 18:18 発言[未読]
【65617】Re:組込みダイアログにチェックBoxを追加し... みーちゃんキャット 10/6/15(火) 4:52 質問[未読]
【65618】Re:組込みダイアログにチェックBoxを追加し... neptune 10/6/15(火) 13:47 回答[未読]
【65619】Re:組込みダイアログにチェックBoxを追加し... Jaka 10/6/15(火) 16:11 発言[未読]
【65620】追加 Jaka 10/6/15(火) 16:19 発言[未読]
【65628】修正 Jaka 10/6/16(水) 9:51 発言[未読]
【65711】Re:組込みダイアログにチェックBoxを追加し... みーちゃんキャット 10/6/23(水) 13:35 質問[未読]
【65714】Re:組込みダイアログにチェックBoxを追加し... Jaka 10/6/23(水) 14:33 発言[未読]
【65723】Re:組込みダイアログにチェックBoxを追加し... みーちゃんキャット 10/6/24(木) 2:39 質問[未読]
【65726】Re:組込みダイアログにチェックBoxを追加し... Jaka 10/6/24(木) 9:22 発言[未読]
【65734】Re:組込みダイアログにチェックBoxを追加し... みーちゃんキャット 10/6/24(木) 11:34 お礼[未読]
【65823】ひたすら忘れていたこと。 Jaka 10/6/29(火) 16:30 発言[未読]

【65609】組込みダイアログにチェックBoxを追加し...
質問  みーちゃんキャット  - 10/6/14(月) 5:25 -

引用なし
パスワード
   改ページプレビューしたときのように、□今後このダイアログを表示しない
として、チェックしたらそのダイアログは今後表示させなくできますか?

Msgbox関数には、そのようなものはないですよね?
'vbOkOnly'にチェックのついた形にしたいです。
ユーザーフォームで書かなければ出来ないでしょうか?
初心者なので、比較的簡単な方法で教えていただけたら幸いです。

【65612】Re:組込みダイアログにチェックBoxを追加...
回答  neptune  - 10/6/14(月) 13:46 -

引用なし
パスワード
   ▼みーちゃんキャット さん:

>Msgbox関数には、そのようなものはないですよね?
ありません。
>'vbOkOnly'にチェックのついた形にしたいです。
>ユーザーフォームで書かなければ出来ないでしょうか?
それが一番簡単で、VBAでは現実的解決方法と思います。

#他言語(実行ファイル化出来る奴)で自前のMessageboxを作る方法もある。
 と一応手法の紹介だけはしておきます。

【65615】Re:組込みダイアログにチェックBoxを追加...
質問  みーちゃんキャット  - 10/6/14(月) 17:13 -

引用なし
パスワード
   ご回答ありがとうございます。
チェックBoxをユーザーフォームに追加し、その戻り値を評価して、
チェックがついていたら以降ダイアログを表示させないように
するにはどうしたらいいでしょうか?

▼neptune さん:
>▼みーちゃんキャット さん:
>
>>Msgbox関数には、そのようなものはないですよね?
>ありません。
>>'vbOkOnly'にチェックのついた形にしたいです。
>>ユーザーフォームで書かなければ出来ないでしょうか?
>それが一番簡単で、VBAでは現実的解決方法と思います。
>
>#他言語(実行ファイル化出来る奴)で自前のMessageboxを作る方法もある。
> と一応手法の紹介だけはしておきます。

【65616】Re:組込みダイアログにチェックBoxを追加...
発言  neptune  - 10/6/14(月) 18:18 -

引用なし
パスワード
   ▼みーちゃんキャット さん:
>ご回答ありがとうございます。
>チェックBoxをユーザーフォームに追加し、その戻り値を評価して、
>チェックがついていたら以降ダイアログを表示させないように
>するにはどうしたらいいでしょうか?
これに関して、どこまで自分でやって、何がわからないのかが、
わかるように説明して下さい。

もし、全くわからないなら、
VBAで処理しようとすべきでないです。
VBAは開発言語の一種ですので、当然最低限の勉強と知識は必要です。

「VBA質問箱基本ポリシー」より
何をやったか書いてください
おそらくあなたは、色々なことを試してできなかった末にここに質問を
書くのでしょう。しかし回答者は、あなたが今まで何をやってきたか、
何を知っていて何を知らないかわかりません。今まで試したこと、
やろうと思ったけどやり方がわからなかったことなどをできるだけ詳しく
書いてください。

してはいけない質問について
困ったことは基本的にどんな質問をされてもかまわないのですが、
その中でも不適切な質問、というのがあります。
以下のような質問は原則としてしないでください。お願いします。

 ・丸投げ
   「○○するにはどうすればいいか教えてください」といったような、
   コードを最初から最後まで教えてもらうことを期待するような質問

【65617】Re:組込みダイアログにチェックBoxを追加...
質問  みーちゃんキャット  - 10/6/15(火) 4:52 -

引用なし
パスワード
   ▼neptune さん:
>これに関して、どこまで自分でやって、何がわからないのかが、
>わかるように説明して下さい。

すみません。途中行き詰って、そこからようやく質問が見えてきました。
以下のコードを記述しても、Bookを閉じると、チェックBoxに付けたチェックマークが保持できません。
再度Bookを開いても、チェックを付けた以降は、そのダイアログを開かないようにするには、どうしたら
宜しいでしょうか?
Public chk1 As Variant

Sub Macro1()
If chk1 = False Then   
  UserForm1.Show
  Exit Sub
End If
Macro2
End Sub

Sub Macro2()
  ActiveSheet.Protect DrawingObjects:=True, Contents:=True, _
    Scenarios:=True
End Sub

Private Sub CheckBox1_Click()
  chk1 = CheckBox1.Value
End Sub
  
Private Sub commandbutton1_click()
  Macro2
  Unload UserForm1
End Sub

【65618】Re:組込みダイアログにチェックBoxを追加...
回答  neptune  - 10/6/15(火) 13:47 -

引用なし
パスワード
   ▼みーちゃんキャット さん:

>すみません。途中行き詰って、そこからようやく質問が見えてきました。
これからは質問が見えてから質問して下さいね。
そうじゃないとそのつもりがあろうとなかろうと事実上丸投げですから。

で、本題ですが、
ちょっとその前に、本当にこのまんま書いているんでしょうか?
userformモジュールに。。。
もしそうだとしたら、間違いではないが、お行儀の悪い書き方です。
・・・後でスキルが上がった自分が見た時分かりにくい。
標準モジュールに広域スコープを持つプロシージャ、変数の宣言をした方が
わかり易い書き方です。


>Bookを閉じると、チェックBoxに付けたチェックマークが保持できません。
>再度Bookを開いても、チェックを付けた以降は、そのダイアログを開かないようにするには、どうしたら
>宜しいでしょうか?
ですが、方法としては、どこかにチェックのデータを物理的に保持しておくより
他ないです。具体的にはハードディスク上のexcelbookなり、ファイルなりに。

私の好みの方法を書くと、古い方法ですが、設定ファイルというものを使用します。

※取り敢えず動くみたいですが、
 ササッと書いたので少ししか確認してません。その点、悪しからず。
動かんかったら言って下さい。

'//////////標準モジュール///////////
Option Explicit

Public Declare Function GetPrivateProfileString Lib "Kernel32.dll" _
    Alias "GetPrivateProfileStringA" _
    (ByVal lpAppName As String, ByVal lpKeyName As String, _
    ByVal lpDefault As String, ByVal lpReturnedString As String, _
    ByVal nSize As Long, ByVal lpFileName As String) As Long

Public Declare Function WritePrivateProfileString Lib "Kernel32.dll" _
    Alias "WritePrivateProfileStringA" _
    (ByVal lpAppName As String, ByVal lpKeyName As String, _
    ByVal lpString As String, ByVal lpFileName As String) As Long

  Const Key1 As String = "Status"
  Const fName As String = "Data.ini"


Public Sub Macro1()
If GetProtectSuatus1 = False Then
  UserForm1.Show
  Exit Sub
End If
Macro2
End Sub

Public Sub Macro2()
  ActiveSheet.Protect DrawingObjects:=True, Contents:=True, _
    Scenarios:=True
End Sub

Public Function GetProtectSuatus1() As Boolean
  Dim sBuf As String * 255
  Dim sData As String
  Dim sAppName As String
  Dim sPath As String
  Dim ret As Long
  
  sAppName = ThisWorkbook.Name
  sPath = ThisWorkbook.Path & "\" & fName
  
  ret = GetPrivateProfileString(sAppName, Key1, "", sBuf, Len(sBuf), sPath)
  sData = Mid(sBuf, 1, InStr(1, sBuf, Chr(0)) - 1)
  
  If sData = Chr(0) Or sData = "False" Then
    GetProtectSuatus1 = False
  Else
    GetProtectSuatus1 = True
  End If
    
End Function

Public Function WriteStatus(pStatus As String) As Boolean
  Dim ret As Long
  Dim sAppName As String
  Dim sPath As String
  
  sAppName = ThisWorkbook.Name
  sPath = ThisWorkbook.Path & "\" & fName
  
  ret = WritePrivateProfileString(sAppName, Key1, pStatus, sPath)
  If ret = 0 Then
    WriteStatus = False
  Else
    WriteStatus = True
  End If
End Function

'///////////////フォームモジュール/////////////////////
Option Explicit

Private Sub CheckBox1_Click()
Dim ret As Boolean

  If CheckBox1.Value = True Then
    ret = WriteStatus("True")
  Else
    ret = WriteStatus("False")
  End If
  If ret = False Then
    MsgBox "データの保存に失敗しました。"
  End If
    
End Sub
 
Private Sub commandbutton1_click()
  Macro2
  Unload UserForm1
End Sub

'///////////設定ファイルの例。ここまで///////////

上記が難しいなら、データ保存用のシートを作成し、そのシート上にチェック
のデータを保存するのが一番簡単です。
これは簡単ですから、サンプルはパスします。

書き忘れ:上記サンプルはBookを保存しているのと同じフォルダに
Data.iniという名前のファイルが作成されます。

【65619】Re:組込みダイアログにチェックBoxを追加...
発言  Jaka  - 10/6/15(火) 16:11 -

引用なし
パスワード
   別解おまけ。

▼みーちゃんキャット さん:
>チェックBoxをユーザーフォームに追加し、その戻り値を評価して、
>チェックがついていたら以降ダイアログを表示させないように
>するにはどうしたらいいでしょうか?
これは、ユーザーフォームのプロパティに手を加えないとだめですね。
VBプロジェクトに手を加えるので、あまり薦めません。
EXCEL2000とかだと駄目かもしれません。
by2003SP3

チェックボックスの状態をフォームを閉じる時にチェックボックスのプロパティに手を加える。
チェックボックスが3個あるとして、フォーム起動後にチェックボックスにチェックを入れたり外して、フォームを閉じるとその時の状態を保存と言うか、プロパティを書き換えます。
フォームを閉じた後にVBE画面でも確認できます。

フォームモジュール

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
 Dim 引数 As String
 If CloseMode = vbFormCode Then '閉じるボタンの時は状態未保存。
   Exit Sub
 End If
 For i = 1 To 3
   If Me.Controls("CheckBox" & i).Value = True Then
     引数 = 引数 & "CheckBox" & i & " "
   End If
 Next
 MsgBox 引数
 If Len(引数) = 0 Then Exit Sub
 引数 = Mid(引数, 1, Len(引数) - 1)
 Application.OnTime Now(), "'マクロ名 " & """" & 引数 & """" & "'"
End Sub


標準モジュール

Sub マクロ名(ContlSt As String)
   Dim myCtl As Control
   For Each myCtl In ThisWorkbook.VBProject.VBComponents.Item("UserForm1").Designer.Controls
     i = i + 1
     If TypeName(myCtl) = "CheckBox" Then
      Cells(i, 3).Value = myCtl.Value
      If InStr(1, ContlSt, myCtl.Name) > 0 Then
        myCtl.Value = True
      Else
        myCtl.Value = False
      End If
     End If
   Next
End Sub。

【65620】追加
発言  Jaka  - 10/6/15(火) 16:19 -

引用なし
パスワード
   初心者なら、上のコードは止めた方がいいです。
素直に非表示したシートにでも、状態用のフラグを書き込んで、それで判定した方がいい。

【65628】修正
発言  Jaka  - 10/6/16(水) 9:51 -

引用なし
パスワード
   すみません。
>チェックボックスの状態をフォームを閉じる時にチェックボックスのプロパティに手を加える。


> If CloseMode = vbFormCode Then '閉じるボタンの時は状態未保存。
   ↓
 If CloseMode <> vbFormCode Then

>Sub マクロ名(ContlSt As String)
>   Dim myCtl As Control
>   For Each myCtl In ThisWorkbook.VBProject.VBComponents.Item("UserForm1").Designer.Controls
>     i = i + 1
>     If TypeName(myCtl) = "CheckBox" Then
>      Cells(i, 3).Value = myCtl.Value ←いらない。

【65711】Re:組込みダイアログにチェックBoxを追加...
質問  みーちゃんキャット  - 10/6/23(水) 13:35 -

引用なし
パスワード
   Jakaさん、neptuneさん

お返事大変遅くなり申し訳ありません。ご回答ありがとうございました。
色々四苦八苦しながら、読み解いていました。おかけで少しは理解できた気がします。

Jakaさん
追加で質問です。

>     引数 = 引数 & "CheckBox" & i & " "
           最初からブランクなしでは駄目ですか?
           後から-1してありますが、どういう理由からでしょうか?

> Application.OnTime Now(), "'マクロ名 " & """" & 引数 & """" & "'"
           このOnTimeメソッドがないと次にファイルを立ち上げたとき、Checkが消えて
           しまうのは分かりました。
           ですが、このコードでどうしてファイルを再立ち上げした時に、CheckBox1.Value値を
           どう記憶して、どう評価しているのかが理解できませんでした。
           QueryCloseとOnTimeの使い方に関して、もう少し詳しくご教授いただけないでしょうか?
           調べても理解できるものがなかったので、分かりやすい
           リンクなどもご紹介頂けますでしょうか?

Excel Ver.2003Sp3 です。
それとCheckboxの数は1個にしてます。よろしくお願いします。  

>▼Jaka さん:
>
>フォームモジュール
>
>Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
> Dim 引数 As String
  Dim i As Integer

> If CloseMode = vbFormCode Then '閉じるボタンの時は状態未保存。
>   Exit Sub
> End If
> For i = 1 To 1
>   If Me.Controls("CheckBox" & i).Value = True Then
>     引数 = 引数 & "CheckBox" & i & " "
>   End If
> Next
>
> If Len(引数) = 0 Then Exit Sub
> 引数 = Mid(引数, 1, Len(引数) - 1)
> Application.OnTime Now(), "'マクロ名 " & """" & 引数 & """" & "'"
>End Sub

Private Sub commandbutton1_click()
  
  Unload UserForm1
  macro2
    
End Sub
>
>
>標準モジュール
>
>Sub マクロ名(ContlSt As String)
>   Dim myCtl As Control
>   For Each myCtl In ThisWorkbook.VBProject.VBComponents.Item("UserForm1").Designer.Controls
> 
>     If TypeName(myCtl) = "CheckBox" Then
>      
>      If InStr(1, ContlSt, myCtl.Name) > 0 Then
>        myCtl.Value = True
>      Else
>        myCtl.Value = False
>      End If
>     End If
>   Next
>End Sub

Sub Macro1()

Dim mymsg As String
   
       If ActiveSheet.ProtectContents = False Then GoTo 1000:
        mymsg = MsgBox("シートは保護されています。" _
      , vbOKOnly )  
    Exit Sub

1000:
    If UserForm1.Controls("CheckBox1").Value = True Then GoTo 2000:
      UserForm1.Show
    Exit Sub
2000:
   macro2

End Sub

Sub macro2()
  ActiveSheet.Protect DrawingObjects:=True, Contents:=True, _
    Scenarios:=True
End Sub

【65714】Re:組込みダイアログにチェックBoxを追加...
発言  Jaka  - 10/6/23(水) 14:33 -

引用なし
パスワード
   >>     引数 = 引数 & "CheckBox" & i & " "
>           最初からブランクなしでは駄目ですか?
>           後から-1してありますが、どういう理由からでしょうか?
単に文字区切りとして使っただけなので、無くても差しさわりが無ければ付けなくても良いです。
ボタン1の名前が 111
ボタン2の名前が 222
と名づけたとして、続けて書くと「111222」になります。
ひょっとして、112とか、122とかの名前があったら、まずいじゃんてな気分で区切り文字を入れました。

なぜスペースにしたというと、「,」だと、
>Application.OnTime Now(), "'マクロ名 " & """" & 引数 & """" & "'"
↑の引数文字ないで、「,」を使うと、別の区切りとして認識されるかな?
と、少し疑問が生じたので...。

結局は、半角スペースも意図したものとは、違う認識をされたので、
>後から-1してありますが
と、して最後のスペースを削りました。

「@」を使おうかとも思いましたが、別の意味で誤認識されそうな気がしたので止めました。
この辺は、私の偏見でそんな感じにしましたが、ある程度理解できれば、自由に変更してもかまいません。

>QueryCloseとOnTimeの使い方に関して
元のフォームのプロパティを書き換える際、フォームがロードされたままだとエラーになる(検証不足の感がありますが)から、アンロードしてから書き換えることになります。
で、閉じた後にOnTimeでプロパティを書き換えるマクロを起動させたわけです。

実際、独断と偏見と思いつきと発想でこうした方が良いんじゃないか、というのが多々混じってます。

【65723】Re:組込みダイアログにチェックBoxを追加...
質問  みーちゃんキャット  - 10/6/24(木) 2:39 -

引用なし
パスワード
   Jaka さん
度々ありがとうございます。
最初お返事頂いたとき、
「VBプロジェクトに手を加えるので、あまり薦めません。」と
ありましたが、ウィルスなどにおかされる危険などがある
という解釈で良いでしょうか?

【65726】Re:組込みダイアログにチェックBoxを追加...
発言  Jaka  - 10/6/24(木) 9:22 -

引用なし
パスワード
    >ウィルスなどにおかされる危険などがある
>という解釈で良いでしょうか?

え〜と、エクセルが標準状態だとVBプロジェクトを
マクロでいじることが出来ませんが、マクロで
VBプロジェクトといじって良いよと許可しているわけですから、
そういった意味合いもありますね。

人によってはウイルス作成につながるから、嫌う方もいます。
また、ウイルスチェックソフトによっては、ウイルスチェックに引っかかる可能性もあります。
ですから、結構タブーな事とされているんです。

【65734】Re:組込みダイアログにチェックBoxを追加...
お礼  みーちゃんキャット  - 10/6/24(木) 11:34 -

引用なし
パスワード
   Jaka さん
そうですかぁ。
たくさんのご教授ありがとうございました。

【65823】ひたすら忘れていたこと。
発言  Jaka  - 10/6/29(火) 16:30 -

引用なし
パスワード
   >フォームモジュール
>
>Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
> Dim 引数 As String
> If CloseMode = vbFormCode Then '閉じるボタンの時は状態未保存。
>   Exit Sub
> End If
> For i = 1 To 3
>   If Me.Controls("CheckBox" & i).Value = True Then
>     引数 = 引数 & "CheckBox" & i & " "
>   End If
> Next
> MsgBox 引数

> If Len(引数) = 0 Then Exit Sub
        ↑
  なんで、これ入れたのか覚えてなけど、
  これがあると、全チェックボックスがOffの時は、記録されません。
  この行は、外しておいてね。つまりいらない。

> 引数 = Mid(引数, 1, Len(引数) - 1)
> Application.OnTime Now(), "'マクロ名 " & """" & 引数 & """" & "'"
>End Sub

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