Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10全般 : Excel 2016)
マクロとVBAの違い
投稿日時: 19/06/05 15:48:15
投稿者: vaioyuki

どうやって検索していいかもわからずに質問させていただきます。
 
前任者が作ったExcelファイルを解析してて疑問に思っています。
まず@つめが、
シートにボタンを作成してクリックするとVBAが動き出すのですが、
このボタンの名前を確認するためにはどうしたらいいのでしょうか?
VBAの記述には
 
Private Sub main()
 
とあるのですが、このボタンの名前は「ボタン1」のままで、どうしてこのボタンをクリックするとPrivate Sub main()が動くのが理解できません。
 
 
Aつめは、
@と続くような話なのですがマクロの登録以外からボタンをクリックしてVBAが動くやり方がわかりません。
私はAccessで簡単なVBAを触っていただけなのでExcelの仕組みがわかってないんだと思いますが、
それをどんな言葉で検索して調べるのかもわからず、ここ2〜3日頭を悩ませています。
ほとんどがマクロの登録から記述するやり方ばかりです。
それはそれでいいのですが、前任者のものを改定するときなどにどこかエラーが起きてしまうんじゃないかと思ってしまいます。
 
初歩的な質問でここに書くべき内容ではないかもしれませんが、よろしくお願いします。

回答
投稿日時: 19/06/05 17:14:21
投稿者: sk

引用:
シートにボタンを作成してクリックするとVBAが動き出すのですが、
このボタンの名前を確認するためにはどうしたらいいのでしょうか?

Debug.Print ActiveSheet.Buttons(1).Name
 
引用:
このボタンの名前は「ボタン1」のままで、
どうしてこのボタンをクリックすると
Private Sub main()が動くのが理解できません。

Excel.Button オブジェクトの OnAction プロパティの設定により、
クリック時のマクロとして任意のプロシージャを関連付けしているため。
 
引用:
マクロの登録以外からボタンをクリックしてVBAが動くやり方がわかりません。

具体的にどのような目的から、それをお知りになりたいのでしょうか。

投稿日時: 19/06/05 17:50:59
投稿者: vaioyuki

言葉がわからず申し訳ありません。
 

引用:
Excel.Button オブジェクトの OnAction プロパティの設定により、
クリック時のマクロとして任意のプロシージャを関連付けしているため。

 
このプロパティ設定がどこにあるかがわかりません。
ボタンを指定してプロパティを見てもアクティブシートのプロパティしかできません。
 
 
マクロの登録以外からやりたいというか、
前任者のを参考に新しく作り替えたい時などにどうしたら出来るんだろうという疑問です。
まずは私がマクロを勉強するのは大前提だと思ってはいますが、検索しようにもその答えが見つけられず困っています。

回答
投稿日時: 19/06/05 18:18:14
投稿者: sk

引用:
このプロパティ設定がどこにあるかがわかりません。

そのボタンを右クリックして[マクロの登録]ウィンドウを表示して下さい。
[マクロ名]に設定されているのが、そのボタンと関連付けされているマクロです。
( OnAction はあくまで VBA 上におけるプロパティ名です)
 
引用:
ボタンを指定してプロパティを見てもアクティブシートのプロパティしかできません。

[開発]タブ -> [コントロール]グループ -> [プロパティ]をクリックして
プロパティウィンドウを表示した、という意味でおっしゃっているのであれば、
ワークシート上に挿入されたフォームコントロールのプロパティは
プロパティウィンドウには表示されません。
 
引用:
マクロの登録以外からやりたいというか、
前任者のを参考に新しく作り替えたい時などにどうしたら出来るんだろうという疑問です。

main 自体のコードを修正すればその通りに動作するでしょうし、
main とは別のマクロを実行するようになさりたいのであれば、
先にそのマクロ(引数が定義されていない、スコープが Public である
Sub プロシージャ)を標準モジュール上に作成し、
前述の操作によって[マクロの登録]ウィンドウを開いて
[マクロ名]としてそのマクロを選択なさればよいでしょう。
 
引用:
Private Sub main()

ちなみに、スコープが Private である Sub プロシージャは
[マクロの登録]ウィンドウのリスト上には表示されませんが、
ボタンとの関連付け自体は可能です。

回答
投稿日時: 19/06/05 18:41:15
投稿者: Suzu

引用:
シートにボタンを作成してクリックするとVBAが動き出すのですが、
このボタンの名前を確認するためにはどうしたらいいのでしょうか?

このボタンは、フォームコントロールですよね。
結構厄介ね。。
・マクロ登録 等で 使う名
・オブジェクトとしての名
違いますね。。
 
プロパティーウィンドが開けないので。。
 
一般機能の中では、マクロの登録でしか確認できなそう・・
 (「デザインモード」を有効にした状態で、当該ボタンを右クリックし、
   数式バー 左側の 名前ボックス で似た名前が表示されますが、、【ボタン 1】の様に、
   間に半角スペースが入っています。)
 
ただ、マクロの登録の名称は、オブジェクト名ではないみたい。。
VBAでシート上のシェイプコレクションをForEachにて オブジェクトを参照し名を得る事になりそうです。
 
 
引用:
シートにボタンを作成してクリックするとVBAが動き出すのですが、
このボタンの名前を確認するためにはどうしたらいいのでしょうか?

ボタンを「作成」するのですか? 単にボタンをクリックではなく?
その場合、ボタンを作成する方法はどんな手順になりますか?
 
 
引用:
VBAの記述には Private Sub main() とあるのですが

これは、標準モジュールでの記載でしょうか?シートモジュール?
 
引用:
このボタンの名前は「ボタン1」のままで、どうしてこのボタンをクリックするとPrivate Sub main()が動くのが理解できません。

引用:
マクロの登録以外からボタンをクリックしてVBAが動くやり方がわかりません。

Accessの場合
"OnClick/クリック時" プロパティ
https://support.office.com/ja-jp/article/-onclick-%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%E6%99%82-%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3-9fc822dd-a32c-404e-aa1f-9b83b098948f
で ボタンをクリックした際の動作を 設定できますが Excel には プロパティウィンドがありません。
 
だとすれば、標準モジュールに
Sub ボタン1_Click()
 Call main
End Sub
の様に、同じ標準モジュールの main を呼び出しているのではないのですか?
違うのであれば、VBAを使用し、ボタンを作成しており、その中でOnAction を設定しているのかな?
 
となると、先の 「ボタン作成」をコードで実行し OnAction に "main" を設定しているのでしょう。
 
 
引用:
それはそれでいいのですが、前任者のものを改定するときなどにどこかエラーが起きてしまうんじゃないかと思ってしまいます。

 
手順上のなにを不安視してのご質問なのでしょうか。
「マクロの登録」を使ってはダメと言う事?

回答
投稿日時: 19/06/05 23:01:07
投稿者: WinArrow
投稿者のウェブサイトに移動

Private Sub macro1()
 
は、マクロの登録では表示されないんで、
 
とりあえず
Public Sub macro1()
 
で作成します。
 
ボタンを右クリックして「マクロの登録」で「macro1」を指定します。
(ボタンとプロシジャの紐付け)
 
その後
PublicをPrivteに変更します。
Publicのままでも、動作しますが、
なぜ、Privateに変更するかとうと
「開発」タブの中に「マクロ」というボタンがあり、
このボタンをクリックすると実行できてしまいます。
Privateは、安易に実行されないようにするための措置です。

投稿日時: 19/06/06 10:18:28
投稿者: vaioyuki

みなさま、本当にありがとうございます。
前任者が手順書や仕様書を置いていってくれていない、プラス、とてもクセのある作り方をしているらしくて解析に戸惑っています。
 
説明の仕方は不十分ですが、現時点で作業しているものについては少しの修正を加えながら作業していくつもりですが、
私個人的に知りたいのがマクロの登録ではない動かし方を知りたいです。
 
長くなりますがひとつひとつわかる限り伝えていきます。
 
 
SKさま
 

引用:
そのボタンを右クリックして[マクロの登録]ウィンドウを表示して下さい。
[マクロ名]に設定されているのが、そのボタンと関連付けされているマクロです。
( OnAction はあくまで VBA 上におけるプロパティ名です)

 
マクロの登録ウィンドウには何も表示されず、マクロ名には['(S)【●●】料金レポート作成_20190521.xlsm'!Sht_macro.main]と表示されていて、編集をクリックするとVBA画面が表示されます。
 
 
Suzuさま
 
引用:
ボタンを「作成」するのですか? 単にボタンをクリックではなく?
その場合、ボタンを作成する方法はどんな手順になりますか?

 
私が作る場合はマクロの登録から作るのですが、
前任者がどのようにしてこのボタンにマクロ(VBA)を登録しているのかを単純に知りたいのです。
 
 
引用:
これは、標準モジュールでの記載でしょうか?シートモジュール?

 
シートに書かれています。
 
 
引用:
だとすれば、標準モジュールに
Sub ボタン1_Click()
 Call main
End Sub
の様に、同じ標準モジュールの main を呼び出しているのではないのですか?
違うのであれば、VBAを使用し、ボタンを作成しており、その中でOnAction を設定しているのかな?
  
となると、先の 「ボタン作成」をコードで実行し OnAction に "main" を設定しているのでしょう。

 
標準モジュールにはmainを呼び出しているようなものはありませんでした。
OnActionも検索しましたがどこにも使われていませんでした。。。
 
引用:
手順上のなにを不安視してのご質問なのでしょうか。
「マクロの登録」を使ってはダメと言う事?

 
すいません。
ただ単純に知りたいのです。(^^;)
私はマクロの登録からするつもりなのですが今後の勉強?のためにもどうやってうごいているのかが知りたいです。
 
 
WinArrowさま
 
引用:
Private Sub macro1()
  
は、マクロの登録では表示されないんで、
  
とりあえず
Public Sub macro1()
  
で作成します。
  
ボタンを右クリックして「マクロの登録」で「macro1」を指定します。
(ボタンとプロシジャの紐付け)
  
その後
PublicをPrivteに変更します。
Publicのままでも、動作しますが、
なぜ、Privateに変更するかとうと
「開発」タブの中に「マクロ」というボタンがあり、
このボタンをクリックすると実行できてしまいます。
Privateは、安易に実行されないようにするための措置です。

 
これは今の作業をマクロに変換すると。。。という話でしょうか?
これをマクロに変換したいというわけではなく、どうしたらマクロの登録ではない形で動くのかを知りたいです。
 
 
 
私の勝手な思いで皆さま色々ありがとうございます。
下に現時点で動いているメイン部分を一部伏せていますが置いておきます。
ほとんどのツールがこれから始まっています。
指定されたフォルダに結果をはき出すという形をとっています。
なので今後も新しく作るときはこの形を取ったほうが作業している人からすると慣れてて使いやすいかなと思っています。
 
 
Option Explicit
 
Public Str_savepath As String '保存先パス
 
Private Sub main()
 
MsgBox "保存先フォルダー(●●●\△△△配下)を選択してください"
With Application.FileDialog(msoFileDialogFolderPicker) 'FileDialogオブジェクト
  If .Show Then '選択されていれば
    Str_savepath = CStr(.SelectedItems(1)) 'フォルダーパスを取得
  End If
End With
If Str_savepath Like "?:\*\●●●\△△△*" Then '保存先パスがローカルディスクの●●●配下の△△△フォルダーなら
  MsgBox Str_savepath & vbLf & vbLf _
    & "配下に〇〇〇情報を含んだファイルを出力します" & vbLf & vbLf _
    & "使用後はすみやかにファイルを削除し" & vbLf _
    & "翌日以降も使用する場合は業務終了前に" & vbLf _
    & "■■■へ保存してファイルを削除してください", vbExclamation
  CreateObject("WScript.Shell").CurrentDirectory = Str_savepath 'カレントディレクトリ変更
  Frm_macro.Show 'ユーザーファームを表示
  With ThisWorkbook 'このブック
    If Not .ReadOnly Then '読み取り専用でなければ
      Application.DisplayAlerts = False 'アラートオフ
      .ChangeFileAccess xlReadOnly '読み取り専用
      Application.DisplayAlerts = True 'アラートオン
    End If
  End With
Else
  main '再帰
End If
End Sub
 
 
よろしくお願いします。

回答
投稿日時: 19/06/06 10:41:04
投稿者: sk

引用:
マクロの登録ウィンドウには何も表示されず、マクロ名には
['(S)【●●】料金レポート作成_20190521.xlsm'!Sht_macro.main]と表示されていて、
編集をクリックするとVBA画面が表示されます。

引用:
シートに書かれています。

ならば、そのブックには[Sht_macro]という名前のワークシートがあり、
そのシートモジュールに記述されている main プロシージャが
ボタンのクリック時に実行するマクロとして設定されている、ということになります。
 
引用:
OnActionも検索しましたがどこにも使われていませんでした。。。

フォームコントロールの OnAction プロパティは
VBE のプロパティウィンドウから設定するものではありませんので。
ActiveX コントロールとは全く別のオブジェクト)
 
引用:
私はマクロの登録からするつもりなのですが
今後の勉強?のためにもどうやってうごいているのかが知りたいです。

まずはフォームコントロール(のボタン)と
ActiveX コントロール(のコマンドボタン)の違いを
正しく理解される方が先だと思います。
 
Office サポート(自動翻訳記事) より:
https://support.office.com/ja-jp/article/%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%80%81%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0-%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%AB%E3%80%81%E3%81%8A%E3%82%88%E3%81%B3%E3%83%AF%E3%83%BC%E3%82%AF%E3%82%B7%E3%83%BC%E3%83%88%E4%B8%8A%E3%81%AE-activex-%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%AB%E3%81%AE%E6%A6%82%E8%A6%81-15ba7e28-8d7f-42ab-9470-ffb9ab94e7c2
https://support.office.com/ja-jp/article/%e3%83%95%e3%82%a9%e3%83%bc%e3%83%a0%e3%81%be%e3%81%9f%e3%81%af%e3%82%b3%e3%83%b3%e3%83%88%e3%83%ad%e3%83%bc%e3%83%ab%e3%83%9c%e3%82%bf%e3%83%b3%e3%81%ab%e3%83%9e%e3%82%af%e3%83%ad%e3%82%92%e5%89%b2%e3%82%8a%e5%bd%93%e3%81%a6%e3%82%8b-d58edd7d-cb04-4964-bead-9c72c843a283?ui=ja-JP&rs=ja-JP&ad=JP
 
iPentec.com より:
https://www.ipentec.com/document/office-excel-difference-between-form-control-and-activex-control
 
引用:
マクロとVBAの違い

Office TANAKA より:
http://officetanaka.net/excel/vba/beginner/01.htm

回答
投稿日時: 19/06/06 11:47:11
投稿者: WinArrow
投稿者のウェブサイトに移動

>どうしたらマクロの登録ではない形で動くのかを知りたいです。
 
そういう話でしたら
「開発」タブの「マクロ」というボタンをクリックすると
実行可能なプロシジャ名が表示されます。
ただし、前レスにも書きましたが
1Private
で、定義したプロシジャは表示されません。
 
表示させるには、一旦、Publicに変更する必要があります。
 

回答
投稿日時: 19/06/06 11:53:35
投稿者: WinArrow
投稿者のウェブサイトに移動

まず@つめが、

引用:
シートにボタンを作成してクリックするとVBAが動き出すのですが、
このボタンの名前を確認するためにはどうしたらいいのでしょうか

 
[Ctrl]を押しながら、ボタンを右クリックします。
「更新モード」になります。
 
名前ボックスに「ボタンの名前」が表示されます。
 
名前ボックスに新しい名前を入力すると「ボタンの名前」が変更できます。
VBAには影響しないはずです。
 
ボタンのキャプションも変更できます。

回答
投稿日時: 19/06/06 12:47:10
投稿者: Suzu

引用:
引用:
ボタンを「作成」するのですか? 単にボタンをクリックではなく?
その場合、ボタンを作成する方法はどんな手順になりますか?

 
私が作る場合はマクロの登録から作るのですが、
前任者がどのようにしてこのボタンにマクロ(VBA)を登録しているのかを単純に知りたいのです。

 
当方の理解として
「前任者が作成したVBAを実行すると、プロシージャ main が 実行される ボタンが作成される」
という認識でした。
 
 
予測としては
・プロシージャ「main」は標準モジュールにある。
・ボタンを作成するし main を関連付けるVBAコードは以下の様な感じ。
    (ただし、当コードだとボタン名が固定ですのでこのままのコードでは複数回の実行は不可
     こんな感じでボタンの作成とそのボタンから「main」を呼び出しているのかなと)
 
と考えての回答です。
 
標準モジュール
>================================================================================
Private Sub Main()
  MsgBox "AA"
End Sub
 
Sub sumple()
Dim rng As Range
 
Set rng = ActiveCell
With ActiveSheet.Buttons.Add(rng.Left, rng.Top, rng.Width, rng.Height)
  .Name = "ボタン"
  .OnAction = "main"
  .Characters.Text = "ボタン1"
End With
End Sub
>================================================================================
 
 
上記がVBAを使った ボタンが押されたときに 起動するプロシージャの設定方法です。
 
 
ただ、「登録だけ」の為に上記を使う必要はないです。
 
ボタンへのプロシージャの関連付けには「マクロの登録」を使います。
たぶん、前任者の方が採った方法は WinArrow さんが提示くださっている方法。
 
先に Private ではない状態で コードを書いておきます。
そうすれば、「マクロの登録」のリストに表示されます。
登録後に、Private にする事で、リストに表示されなくなるので前任者はそうしていたと思われます。
(リストに表示されないだけで、手打ちで正しい内容を入力すればプロシージャとの関連付けは可能)
 
先のVBAのコードでなら
引用:
.OnAction = "main"
です。
 
「マクロの登録」のリストに表示されない から、
「前任者はそのダイアログを使用していないはず」と推測されたのでしょうが
その推測が間違っていると思います。
 
 
引用:
これは今の作業をマクロに変換すると。。。という話でしょうか?
これをマクロに変換したいというわけではなく、どうしたらマクロの登録ではない形で動くのかを知りたいです。

 
vaioyuki さんが考えるマクロって何ですか?
Access から入ると、Accessには「マクロ」オブジェクトがあるから、
Excelでもマクロオブジェクトがあると誤解するかもしれませんが、Excelにマクロオブジェクトはありません。
なので、変換機能もありまえせん。
 
詳しくは、sk さんが提示くださっている Office TANAKA さんのサイトをどうぞ。

投稿日時: 19/06/06 14:20:36
投稿者: vaioyuki

みなさま、ありがとうございます。
少しだけですが靄が晴れた気がします。
 

引用:
[Ctrl]を押しながら、ボタンを右クリックします。
「更新モード」になります。
  
名前ボックスに「ボタンの名前」が表示されます。

 
ボタン1と表示されました。
私の中ではこの「ボタン1」がどうして「Private Sub main()」のmainになるのかがピンときません。
 
 
引用:
ボタンへのプロシージャの関連付けには「マクロの登録」を使います。
たぶん、前任者の方が採った方法は WinArrow さんが提示くださっている方法。
  
先に Private ではない状態で コードを書いておきます。
そうすれば、「マクロの登録」のリストに表示されます。
登録後に、Private にする事で、リストに表示されなくなるので前任者はそうしていたと思われます。
(リストに表示されないだけで、手打ちで正しい内容を入力すればプロシージャとの関連付けは可能)

 
ここで少しスッキリしました。
なぜこんな書き方を?と疑問は残りますけど。(^^;)
 
 
 
引用:
vaioyuki さんが考えるマクロって何ですか?
Access から入ると、Accessには「マクロ」オブジェクトがあるから、
Excelでもマクロオブジェクトがあると誤解するかもしれませんが、Excelにマクロオブジェクトはありません。
なので、変換機能もありまえせん。

 
私の中のExcelのマクロは、自動登録?です。
開発タブのマクロの記録を押して実際に作業をして記録終了をしたら自動化されているものでした。
Accessのマクロはあまり使ったことがなかったのですが、Excelのマクロは実際に行ったものがレコーディングされていく感じで便利だなと思ってました。
VBAはAccessのVBAと同じような感じで思っていました。
 
 
引用:
まずはフォームコントロール(のボタン)と
ActiveX コントロール(のコマンドボタン)の違いを
正しく理解される方が先だと思います。

 
フォームコントロールよりActiveXコントロールのほうが色々出来ることが増えるという認識でした。
前任者もActiveXコントロールのほうでボタンを作成してこちらのコード表示から入力していると思っていたのですがフォームコントロールで作成しているようだと気づいて悩み始めました。。。
 
 
 
念のため、標準モジュールも記載しておきます。
こちらは実際のmainのところには繋がりがないのかなと勝手に判断してますが。。。
 
 
Option Explicit
 
Public Function openCSV(Sht_target As Worksheet, Var_array As Variant, _
  Optional Str_fullpath As String, Optional Str_title As String, _
  Optional Lng_inrow As Long = 1, Optional Lng_outrow As Long = 1) As Boolean 'CSVを開く
 
If Str_fullpath = "" Then 'ファイルのフルパスがなければ
  MsgBox Str_title & "ファイルを選択してください"
  Str_fullpath = Application.GetOpenFilename(filefilter:="CSVファイル,*.csv", _
    Title:=Str_title & "ファイルの選択") 'SCVのフルパス
  If Str_fullpath = "False" Then 'キャンセルなら
    openCSV = False '開かない
    Exit Function '帰る
  End If
End If
If Dir(Str_fullpath) = "" Then 'ファイルがなければ
  MsgBox "ファイルが見つかりません"
  openCSV = False '開かない
  Exit Function '帰る
End If
With Sht_target
  .Activate '該当シートをアクティブ
  .Range(.Rows(Lng_outrow), .Rows(Rows.Count)).Clear '出力行以降をクリア
  With ActiveSheet.QueryTables.Add(Connection:="TEXT;" & Str_fullpath, _
    Destination:=.Cells(Lng_outrow, 1)) 'クエリテーブルを追加
    .AdjustColumnWidth = False '列幅を自動調整しない
    .TextFileStartRow = Lng_inrow 'CSVの開始行
    .TextFileCommaDelimiter = True 'CSVの区切り文字「,」
    .TextFileColumnDataTypes = Var_array '列の表示形式の配列(標準:1、文字列:2)
    .Refresh BackgroundQuery:=False '更新(バックグラウンドで更新しない)
    .Delete 'クエリ削除
  End With
End With
openCSV = True '開いた
End Function
 
Public Function saveUniqueFile(str_path As String, Str_name As String, Str_extension As String, _
  Optional Lng_cnt As Long) As String
  '一意な名前を付けて保存(同名ファイルが存在する場合は、ファイル名にカウンターを追加)
  '名前を付けて保存したファイルは、左上セルを選択して、表示倍率100%
Dim Str_name2 As String 'カウンター用ファイル名
 
If Right$(str_path, 1) <> "\" Then 'ファイルパスの最後が「\」でなければ
  str_path = str_path & "\" '「\」をつける
End If
If Left$(Str_extension, 1) <> "." Then '拡張子の最初が「.」でなければ
  Str_extension = "." & Str_extension '「.」をつける
End If
If Lng_cnt = 0 Then '引数のカウンターが省略されていれば
  Str_name2 = Str_name & Str_extension 'ファイル名 & 拡張子
Else
  Str_name2 = Str_name & "(" & CStr(Lng_cnt) & ")" & Str_extension 'ファイル名 & カウンター & 拡張子
End If
If Dir(str_path & Str_name2) = "" Then 'カウンター用ファイル名がなければ
  With Application
    ActiveWindow.Zoom = 100 'ウインドウの拡大率100%
    .Goto Reference:=Cells(1, 1), Scroll:=True '左上セルを選択
    .DisplayAlerts = False 'アラートオフ
    Select Case Str_extension '拡張子
    Case ".xlsx"
      ActiveWorkbook.SaveAs Filename:=str_path & Str_name2, _
        FileFormat:=xlOpenXMLWorkbook 'XLSXファイル(マクロなし)
    Case ".xls"
      ActiveWorkbook.SaveAs Filename:=str_path & Str_name2, _
        FileFormat:=xlExcel8 'XLSファイル(旧式)
    Case ".xlsm"
      ActiveWorkbook.SaveAs Filename:=str_path & Str_name2, _
        FileFormat:=xlOpenXMLWorkbookMacroEnabled 'XLSMファイル(マクロあり)
    Case ".csv"
      ActiveWorkbook.SaveAs Filename:=str_path & Str_name2, _
        FileFormat:=xlCSV 'CSVファイル
    Case Else
      .DisplayAlerts = True 'アラートオン
      MsgBox "拡張子が不明です"
      saveUniqueFile = "" '開かない
      Exit Function '帰る
    End Select
    .DisplayAlerts = True 'アラートオン
    If ActiveWorkbook.Name = Str_name2 Then 'アクティブブック名がカウンター用ファイル名なら
      saveUniqueFile = Str_name2 'カウンター用ファイル名
    Else
      saveUniqueFile = "" '開けなかった
    End If
  End With
Else
  saveUniqueFile = saveUniqueFile(str_path, Str_name, Str_extension, Lng_cnt + 1) 'カウンターを加算して再帰
End If
End Function
 

回答
投稿日時: 19/06/06 14:52:49
投稿者: WinArrow
投稿者のウェブサイトに移動

まず、Excelには「マクロ」いう言葉はあるが
Accessでいう「マクロ」と
Excelでいう「マウロ」は、
違います。
 
Suzuさんレスにあるように
Excelには、Accessでいう「マクロ」という機能はありません。
 
Excelでは、VBAコードで書かれたものを総称して「マクロ」と呼ぶことがありますが、
ときに「プロシジャ」をマクロと呼ぶこともあります。
 
「マクロの登録」は、本来ならば、「プロシジャの登録」でしょうね・・・
どこに登録するかというと、そのボタンに登録・・・「つまり、そのボタンをクリックしたとき
登録したプロシジャを実行」してください・・・とExcel君にお願いしているわけです。
 
>どうしてボタンをクリックすると、プロシジャが動くか?
の回答になっていますか?
 
 
 
1つのボタンに1つのプロシジャの場合は、
特に、ボタンの名前を気にする必要がありませんが、
複数のボタンに1つのプロシジャを紐付ける場合
プロシジャの中で、クリックされたボタンを判断するのに、名前を使った方がよいかも。
(でも、べうな方法で判断できれば、名前にこだわることもない)
 
シートにボタンや図形を配置した場合、同じ名前が設定される場合がある(エラーにはなr内)ので、
注意が必要です。(名前をExcel任せにする場合は、同じ名前にならない)
 
なお、プロシジャを実行する方法は、ボタン以外にもたくさんあります。
一番上のメニュー、クイックツールバー、ユーザーフォーム、等々
操作性を考慮して最適な手段を選択すればよいです。
(これから勉強するとよいでしょう)
 
それから
標準モジュールに
Sub Macro()
と書いた場合
Public Sub Macro()
と見做されます。
 
 
 

回答
投稿日時: 19/06/06 17:56:16
投稿者: sk

引用:
私の中ではこの「ボタン1」がどうして
「Private Sub main()」のmainになるのかがピンときません。

それはイベントプロシージャの構文規則のイメージに
囚われているからではないでしょうか。
 
まず、ActiveX コントロールのコマンドボタン
( MSForms.CommandButton オブジェクト)には
Click, DblClick などのいくつかのイベントが
定義されており、それぞれのイベントの発生時に
実行するコードは通常、そのコマンドボタンが挿入された
ワークシートのシートモジュール(もしくは
ユーザーフォームのフォームモジュール)内の
イベントプロシージャとして記述されることになります。
(クラスモジュールの話はここでは割愛します)
 
この時、モジュールに記述されたプロシージャが
「これはオブジェクト ***** の ***** イベントの発生時に
実行するイベントプロシージャである」と解釈されるためには、
基本的には下記のような構文規則に基づいて
それぞれのプロシージャを定義することになります。
 
----------------------------------------------------
 
Private Sub オブジェクト名_イベント名([引数1], [引数2], ...)
 
----------------------------------------------------
(引数の有無、名前、個数等はオブジェクトの種類/イベントごとに決まっている)
 
一方、フォームコントロールのボタン( Excel.Button オブジェクト)には
何のイベントも定義されていません
(いかなるイベントプロシージャも定義することが出来ない)
 
あくまでも「ボタン」というコントロールの機能として、
[マクロの登録]ウィンドウを介して設定された
そのボタンの OnAction プロパティの値と同じマクロ
(任意のブックの任意のモジュールの任意の Sub プロシージャ)を
そのボタンのクリック時に呼び出すことが出来る、
というだけのことです。
 
プロシージャと紐付けされるオブジェクトやイベントが
プロシージャの名前に応じて決定されるとか、
そういったことは全くありません。
 
呼び出し可能なプロシージャでさえあれば、
どの標準モジュール/シートモジュールに書かれていようが、
どんな名前のプロシージャであろうが構わないのです。
 
引用:
なぜこんな書き方を?と疑問は残りますけど。(^^;)

単に「[ボタン1]をクリックしたら main プロシージャが
実行されるようにしたかった
」だけでしょう。
(何故 main という名前のプロシージャにしたのかは、
書いた本人にしか分からないことです)

回答
投稿日時: 19/06/07 07:23:35
投稿者: simple

フォームコントロールと、ActiveXコントロールの差異については、
こちらのサイトの「即効テクニック」の下記記事が参考になるでしょう。
  
https://www.moug.net/tech/exvba/0150071.html
VBA入門者の”どっち?”・・・フォームツールバー or コントロールツールボックス(1)
https://www.moug.net/tech/exvba/0150072.html
VBA入門者の”どっち?”・・・フォームツールバー or コントロールツールボックス(2)
  
失礼な話かも知れないが、以下、感想ないし助言です。
Accessを使いこなされておられたのであれば、
簡単なExcelVBAの基本テキストをさらっと通読される方が
目的を早く果たせそうな気がします。
既存のコードを修正する手法に直接アタックするよりも、
まず基本的なコード作成の仕方(コード内容というより、手続き的な話)を、
手で実行して慣れることが先決では?
それができれば、その延長線で修正手法も見えてくるはずだと思います。

回答
投稿日時: 19/06/07 14:04:32
投稿者: WinArrow
投稿者のウェブサイトに移動

多分、フォームコントロールの「ボタン」を使って知るものと思います。
 
フォームコントロールは、「ActiveX」が開発される前の技術で、
CommandButtonと同類ではないかと思います。
OnActionプロパティはありません。
ActiveXコントロールは、オブジェクト名_イベントでプロシジャを対応しています。

Sub CommandButton1_Click()
ボタンの名前を変更した場合は、対応するプロシジャ名を変更する必要があります。
 
別のプロシジャを実行したいときは
Sub CommandButton1_Click()
    Call main
End Sub
で対応可能です。
 
 
フォームコントロールも
Sub ボタン1_Click()
と同じようなプロシジャになりますが、
onActionプロパティに実行するプロシジャをしてすることができます。
ですから
onActionプロパティに別に作成したプロシジャ名をセット(マクロの登録)すると
動きます。ですからボタンの名前を変更しても動きます。
 
Sub ボタン1_Click()
   Call main
End Sub
としても同じです。
 
 
 
 
 
 

回答
投稿日時: 19/06/07 14:40:57
投稿者: sk

WinArrow さんの引用:
フォームコントロールは、「ActiveX」が開発される前の技術で、
CommandButtonと同類ではないかと思います。
OnActionプロパティはありません

・フォームコントロールのボタン( Excel.Button オブジェクト)は
 Excel のオブジェクトライブラリにおける非表示オブジェクトである。
 
・Excel.Worksheetオブジェクトの Buttons メソッドは
 同オブジェクトにおける非表示メンバーである。
 
・Excel.Button オブジェクトの OnAction プロパティは
 同オブジェクトにおける非表示メンバーである。
 
(同様の説明は simple さんが挙げられた記事の中にもある)
 
Excel.Button オブジェクトの OnAction プロパティの役割は
Excel.Shape オブジェクトの OnAction プロパティのそれと同じです。
 
また、フォームコントロールは Shape オブジェクトとしても
参照することができます。
 
--------------------------------------------------------
 
? ActiveSheet.Buttons("Button 1").OnAction
 
--------------------------------------------------------
 
? ActiveSheet.Shapes("Button 1").OnAction
 
--------------------------------------------------------

回答
投稿日時: 19/06/07 15:27:22
投稿者: WinArrow
投稿者のウェブサイトに移動

すみません、
 
文章を挿入する場所を間違えてしまいました。

引用:
フォームコントロールは、「ActiveX」が開発される前の技術で、
CommandButtonと同類ではないかと思います。
OnActionプロパティはありません。

↑の
>OnActionプロパティはありません。
は間違いです。
ActiveXコントロールおオブジェクト側に
書くつもりでした。
 

回答
投稿日時: 19/06/07 16:24:30
投稿者: Suzu

質問者さん は 色々と、勘違いをされている部分がある様なので、知識の修正を行わないとですね。
 
最終的には

引用:
前任者のものを改定するときなどにどこかエラーが起きてしまうんじゃないかと思ってしまいます。
この不安なのでしょうが、プロシージャ名を変えなければエラーは起きないでしょう。
 
 
 
引用:
・Excel.Worksheetオブジェクトの Buttons メソッドは
 同オブジェクトにおける非表示メンバーである。

Buttons コレクション ですよね?
 
----------------------------------------------------------------------------------------
質問者の方が居ない中で、回答者が盛り上がるのもどうかとは思うのですが。。
引用:
一方、フォームコントロールのボタン( Excel.Button オブジェクト)には
何のイベントも定義されていません。
(いかなるイベントプロシージャも定義することが出来ない)

 
で気づきました。
クラスモジュールを使用した コントロール配列。。あ。。あれってやっぱりすごいんだと。
改めて記事を読もうと探しましたが!!? スキルアップ講座がなくなってる!! 余談でした。

回答
投稿日時: 19/06/07 16:38:56
投稿者: sk

Suzu さんの引用:
Buttons コレクション ですよね?

Excel には Buttons というオブジェクト(コレクション)がある」と
Excel.Worksheetオブジェクトには Buttons というメソッドがある」とは
別の話。

投稿日時: 19/06/07 19:03:53
投稿者: vaioyuki

みなさま、本当にありがとうございます。
 
私の頭の中ではやはりAccessベースがあり、
ボタンに名前を付けてそれにVBAをくっつけるという考えがありました。
なのでボタンの名前にこだわってしまっていました。
今日はとても忙しかったので色々作業ができなかったのですがその中でも、
 

引用:
とりあえず
Public Sub macro1()
  
で作成します。
  
ボタンを右クリックして「マクロの登録」で「macro1」を指定します。
(ボタンとプロシジャの紐付け)
  
その後
PublicをPrivteに変更します。

 
こちらの考えで、
 
Public Sub aaa()
Range("A1").Select
End Sub
 
をシートに作成したらマクロの登録には現れないけど動くということができました。
私の中でこの問題点はかなりスッキリしました。
 
まだひとつ疑問に思うことがありますのでまた来週にでも相談させていただきます。
今日はご報告まで。
 
ありがとうございます。(^−^)

回答
投稿日時: 19/06/07 19:16:32
投稿者: WinArrow
投稿者のウェブサイトに移動

引用:
Public Sub aaa()
 Range("A1").Select
 End Sub
   
をシートに作成したらマクロの登録には現れないけど動くということができました。

>マクロの登録には現れないけど
これ・・・・おかしくない?

回答
投稿日時: 19/06/08 09:38:19
投稿者: mattuwan44

もう、解決したのかも知れませんが、
情報を整理してみます。
 
>マクロとVBAの違い
http://officetanaka.net/excel/vba/beginner/01.htm
http://www.start-macro.com/55/w/s054.html
https://tech.nikkeibp.co.jp/it/members/NBY/techsquare/20021114/1/
https://hikari-program.com/2018/12/12/%E3%83%9E%E3%82%AF%E3%83%AD%E3%81%A8%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%81%AE%E9%81%95%E3%81%84/
 
↑この辺を読むとわかると思いますが、
エクセルの決まった操作手順を自動で実行する機能が「マクロ」と呼ばれる機能です。
(アクセスではまた少し概念が違うのですかね?)
そして、VBEにプロシージャとして、VBA言語で作業手順を書き保存しておくことで、
マクロとして自動で記述しておいた作業手順を自動で実行することが出来ます。
(VBAはVBから各プリケーション用にカスタマイズされたものですから、
エクセル等のアプリケーションの操作以外のこともできます。)
 
次に、エクセルでシート上からマクロを実行するための方法はいくつかあります。
マクロを起動させるきっかけの操作としてよくあるのが、
ボタンをクリックして実行させる方法がありますが
(vaioyukiさんが想定されているのもこの方法だと思います)、
エクセルのシート上に配置出来るボタン(あるいはボタンに見えるもの)は、
複数あります。
1)図形(図形にもマクロの登録ができます。)
2)フォームコントロールのボタン(図形の一種として同じくマクロの登録でプロシージャと紐づけます)
3)ActiveXコントロールのボタン(クリック以外の操作でもマクロを起動できます。)
4)その他、わざわざボタンを配置しなくても特定の操作で起動するようにもできます。
(例えばセルの値を変えたとき。あるいは、セルをダブルクリックした時。等々)
参考>>
http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_event.html
 
1と2の場合は標準モジュールにコードを書き、それをマクロの登録をすることで、
クリックしたときに実行できます。
3と4の場合は、対象のワークシートのモジュールで、
オブジェクトボックスで対象を指定し、イベントボックスでいつ(どんなきっかけで)実行するのかを
選択すると、
Sub????〜End sub と出るので、その間に、やりたいことを記述することになります。
 
そして、各プロシージャは、ネット上にあるサンプル等は(入門用のサイトも)、
Sub ?????()
で始まり、
End Sub
で、終わるよう書かれています。
ここで、
Privateや、Publicというキーワードが出てきますが、
これは、簡単に説明すると、
Private → プロシージャを外部に公開しない(簡単に他のプログラムから参照させないようにして隠す)
Public → プロシージャを外部に公開します。(公開するので好きに参照して使ってもらいます)
という感じの意味になります。
そして、このキーワードを省略した場合は、Publicとして扱われます。
なので、
Privateと記述していれば、「マクロの登録」ウィンドウから参照出来ないので、
登録できる候補として出てきません。
つまり、前任者の方は、このことを利用して、どのプロシージャを使用しているのかを隠して、
無知識の人にコードの改変をされる可能性を減らしたかったのだろうと想像します。
(そんなことをする必要があるのかは微妙な感じですよね?勝手に削除したり出来るのですから。。。
まぁ、本格的にプロテクトを掛けて隠すまでもないけど、知ってる人ならわかるだろうという感じで、
そうされたんですかね?)

回答
投稿日時: 19/06/08 14:38:55
投稿者: simple

既に皆さんから有益な説明がなされているわけですが、
そもそもに戻ってコメントしておきます。(重複していることが多いと思います)
 
【質問】

引用:
まず@つめが、
シートにボタンを作成してクリックするとVBAが動き出すのですが、
このボタンの名前を確認するためにはどうしたらいいのでしょうか?
VBAの記述には
Private Sub main()
とあるのですが、このボタンの名前は「ボタン1」のままで、
どうしてこのボタンをクリックするとPrivate Sub main()が動くのが理解できません。
Aつめは、
@と続くような話なのですが
マクロの登録以外からボタンをクリックしてVBAが動くやり方がわかりません。

 
@について
ボタンと動作対象のマクロを結びつけるのは、
ボタンを右クリックして現れる「マクロの登録」処理の効果です。
そこで対応が図られ、Excelはそれを保持しています。
 
GUIによるユーザー動作に依っています。
これは、Excelのマクロ機能の歴史的経緯です。
フォームコントロールは、ActiveXコントロールより前からある伝統的手法です。
 
OnActionというプロパティにマクロ名を指定させるというのが、
今から見れば、現代的な手法であり、共通のインターフェイスに沿ったものかもしれない。
しかし、当時は、MS社は、個別の「マクロの登録」というもので対応する選択を
したのです。そこで新規作成や修正に入っていくこともできるのです。
 
Accessとは所詮ソフトが違うのだし、我々は使う身なので、それはそういうものとして
受け止めて使うほかありません。
Accessと違う何故だ、とか、ActiveXコントロールの仕方と違う何故だ、
といって悩んで?いても意味が乏しいです。(語弊があるかもしれないが、勢いです。寛恕願いたい)
 
それが、ExcelVBAにある基本的テキスト的なことをすんなり受け入れた方が早いと申し上げた理由です。
 
引用:
Aについて
マクロの登録以外からボタンをクリックしてVBAが動くやり方がわかりません。

・ひとつのボタンであれば、上記のように手作業でマクロ登録するのが
  経緯はあっても簡便だし、使い易いと考えています。
・しかし、多数のボタンとか図形にマクロを登録するのであれば、それは間尺に合わない。
  その場合は、マクロで一斉に登録します。
・例えばこんな風に。
'複数の図形(フォームコントロールのボタンを含む)に共通のマクロを登録する。
Sub test()
    Dim shp As Shape
    For Each shp In ActiveSheet.Shapes
        shp.OnAction = "WhoAreYou"
    Next
End Sub

'自分の図形の名前を表示する
Sub WhoAreYou()
    MsgBox Application.Caller
End Sub

参考になりますか。

回答
投稿日時: 19/06/08 16:06:29
投稿者: mattuwan44

>私はマクロの登録からするつもりなのですが今後の勉強?のためにも
>どうやってうごいているのかが知りたいです。
 
あぁ、simpleさんの回答をみて気づいた。
この疑問について答えてなかった。
 
どうやって動いているかというか、
「ボタンのクリックに対して、どうやって紐づけしたのか?」
ということですよね?
 
他の方がすでに説明されていますが伝わって無いようなので、僕なりに説明すると、
 
フォームコントロールにマクロの登録をしたい場合、
1)ボタン配置→新規作成(のちに自動で作成されたプロシージャに書き足す)とするか、
すでに書かれているプロシージャを選択
2)すでに配置されたボタン上で右クリック→マクロの登録→一覧から選択または新規作成
3)別のマクロで、フォームコントロールのOnActionにプロシージャ名を入れる
くらいの手順しかないです。
 
いづれかの方法を前任者さんが取られたかわかりませんし、
(たぶんWinArrowさんが説明された手順でやられたと想像されますが)
なぜプロシージャをPraivatにしたかも、意図は前任者に聞かないとわからないでしょう。
 
結果として、マクロの登録の一覧にプロシージャ名が出なくなるということです。
 
僕なら、画面の設計と、マクロの構築は別々で考えたいので、
ボタンを配置したあと、一旦キャンセルで抜けて、
別途、マクロ作成後、マクロの登録をするかなと思います。
 
意図の可能性として想像できるのは、
1)どのプロシージャを使っているか隠したい。
2)2重に同じ機能のボタンを作らせたくない。
3) 不用意なプロシージャの再利用を拒否し、後任者に不要なデバッグをさせないようにしたい。
4)単に気分でこんなことも出来るんだとやってみただけ。
こんなとこだと思います。
気になる気持ちはわかりますが、「なぜ?」を追及しても答えがありませんので、
考えても無駄でしょう。
 
ただし、キーワードPrivateについては、ヘルプやネットで検索して、
どういう場合に使うのかを理解しておくのは損ではないと思います。
ですが、ちょっとした入力や操作の補助ツール的な目的でマクロを作りたいなら、
Privateを使う場面はほとんどないので、飛ばしておいても不都合はないと思います。
今回の件でその辺を詳しく説明するのは、本題からはずれるので控えます(混乱させてもいけないので)。
興味があれば、別途検索してみてください。

回答
投稿日時: 19/06/09 21:04:45
投稿者: simple

private指定についてもコメントしておきます。
private指定の効果については、既に説明いただいたとおりです。
 
private属性のプロシージャは「マクロ実行」画面の対象に現れません。
これを利用して、「マクロ実行画面から、ユーザーが誤って実行しない」ように、
前任者がprivate属性に変えたのでしょう。
 
注意しないといけないのは、そのことと質問者さんの分析作業とは直接関係は無いということです。
つまり、質問者さんのされようとしているマクロの修正業務の障害にはならない
ということです。
というのは、
ボタンを右クリックして表示される「マクロ登録」のプロシージャ名に
設定済みのマクロ名がはっきりと表示されるはずです。
(private 属性であっても)
どのプロシージャに紐付けられているかは、一目瞭然のはずです。
 
# 一部削除しました。(誤解を招くので)

回答
投稿日時: 19/06/10 16:14:01
投稿者: Suzu

sk さんの引用:
Suzu さんの引用:
Buttons コレクション ですよね?

Excel には Buttons というオブジェクト(コレクション)がある」と
Excel.Worksheetオブジェクトには Buttons というメソッドがある」とは
別の話。

Worksheet.Buttons(Object) Method
https://docs.microsoft.com/ja-jp/dotnet/api/microsoft.office.tools.excel.worksheet.buttons?view=vsto-2017
Buttons メソッド!! ありました。
 
当方の「メソッド」の認識としては、
『対象オブジェクト(今回であればWorkSheet)に 動作をさせる命令』。
WorkSheet.Buttons は
ActiveWorkbook.Worksheets と同じ成り立ちであり
コレクションを返す 『プロパティ』と思っていました。
 
でも、
ActiveSheet.Buttons これはエラーにならず
ActiveWorkbook.Worksheets これはエラーになります。
メソッドなので、戻り値を受けなくとも良い。
 
よく見ると、メソッドでオブジェクトを返すメンバーが結構いるのですね。。今更ですみません。
 
 
質問関係ないところですみませんでした。

投稿日時: 19/06/11 17:51:27
投稿者: vaioyuki

みなさま、本当に丁寧にわかりやすく解説していただいてありがとうございます。
「初心者が何言ってるんだ!?」的な質問をしてしまって呆れられるかなと思ってたりしたのですが、
本当に本当にみなさん優しく解説していただいて感謝しています。
 
まずはAccessのVBAとは少し別の作りなんだということを頭に入れます。
どうしてもAccessの考えで頭が動いてしまって硬いようです。そう、勘違いがいっぱいです。(^^;)
 

引用:
4)その他、わざわざボタンを配置しなくても特定の操作で起動するようにもできます。
(例えばセルの値を変えたとき。あるいは、セルをダブルクリックした時。等々)
参考>>
http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_event.html

 
これの作りも多々ありました。
開いたとたんにMsgBoxが出るのも、
Accessでいうフォームを開いたときやフォーカス取得時と似たような考えていいんでしょうか?
(またAccess感覚で話してしまってますが。。。)
 
 
引用:
Privateや、Publicというキーワードが出てきますが、
これは、簡単に説明すると、
Private → プロシージャを外部に公開しない(簡単に他のプログラムから参照させないようにして隠す)
Public → プロシージャを外部に公開します。(公開するので好きに参照して使ってもらいます)
という感じの意味になります。

 
こちらもAccessのPrivateとPublicの考えに近いんですかね?
Publicだとマクロの登録画面に表れて、Privateだと現れない?
 
引用:
>マクロの登録には現れないけど
これ・・・・おかしくない?

 
これは私間違ってました。。。
PublicではなくPrivateで作成していました。。。
すいません。
 
標準モジュールでPublicを使用すると別シートでも有効で、Privateを使用するとActiveセルがあるシートにだけ反応する?
シートにPrivateで作成するとそのシートにだけ有効?
って認識であってますか?
 
 
 
物分かりのない質問者で申し訳ありません。
でもとても勉強になります。
みなさんの説明を聞いてから前任者のコードを見るとわからなかったことがなんとなくでも見えるようになってきました。

回答
投稿日時: 19/06/11 20:37:47
投稿者: WinArrow
投稿者のウェブサイトに移動

引用:

標準モジュールでPublicを使用すると別シートでも有効で、Privateを使用するとActiveセルがあるシートにだけ反応する?
シートにPrivateで作成するとそのシートにだけ有効?
って認識であってますか?

 
「Public」は、別の言い方で「グローバル」(広範囲)といいます。
「どこからでも参照できる」
ということです。
 
モジュールには、
(1)シートモジュール
(2)Thisworkbookモジュール
(3)フォームモジュール
(4)標準モジュール
(5)クラスモジュール
と5種類ありますが、
(4)標準モジュール以外は、クラスモジュールになります。
クラスモジュールは、基本的にイベント対応のプロシジャを置くことになります。
標準モジュールには、イベント対応のプロシジャはない(例外もある)という概念です。
イベント対応というのは、「ある事象が発生したときに実行する」ということです。
 
ボタンの話が出てきたので、ボタンを例にとると
フォームモジュールのボタンは、マクロの登録で、「作成」を選択すると
標準モジュールにプロシジャが作成されます。
この技術は、ActiveX出現前なので、仕方がないです。
 
一方、ActiveXのコマンドボタンは、シートモジュールにプロシジャが作成されます。
 
ユーザーフォームについても、AciveX出現前にはなかった。(ダイアログシートが前身です)
マクロについても、マクロシートというのがありました。
かなり、Accessのマクロに似ているかな?
 
少し整理すると、ActiveX出現前と後では、考え方が変わったんです。
現在の主流は、ActiveXなんです。
 
考え方として
Publicプロシジャは、標準モジュールに記述する。
Privateプロシジャは、クラスモジュールに記述する。
勿論、Privateプロシジャは標準モジュールにも記述できます。
 
という概念で考えると、すっきりすると思います。
 
クラスモジュールから、他のクラスモジュールのプロシジャは、基本的には参照しない。
いろいろな場面では、この法則ではないこともあるので、
いろいろな例を挙げると、ややこしくなるので、とりあえずは、こんなところでいかがでしょう。
 
 
 
 
 
 
 
 
 
 
 

投稿日時: 19/06/12 14:03:56
投稿者: vaioyuki

色々ありがとうございます。
最後にひとつだけ。。。(と言いながら追記するかもしれませんが(^^;))
 
別シート(マクロ)にDellボタンを作成して料金シートのセルを削除したいのですが、
今までは標準モジュールに、
 
Sub del()
 
Sheets("料金").Select
Range("a:aj").Clear
Range("a1").Select
Sheets("マクロ").Select
Range("a1").Select
 
End Sub
 
これでなんとか削除できていました。
これを今までの勉強?からすると、標準モジュールにはPublicでもPrivateでも削除することができましたが、
マクロシートに書くと、禁止マークで数字が400と出るメッセージボックスが表示されてマクロシートに表記しているものが消されます。
どうしてもマクロシートに書きたいわけではないのですが、マクロシートに書くとすれば何が間違っているのでしょうか?
それと(あ、ひとつといっておきながらやはり追記してしまいます。。。)
数式を残してあとは全部消去するということは可能なんでしょうか?

回答
投稿日時: 19/06/12 15:34:25
投稿者: WinArrow
投稿者のウェブサイトに移動

別シートのセルを選択(Select、Activate)することは、
シートモジュールではできません。
クラスモジュールの制約です。
 
 
Range("A1").Selectは、自シートと解釈されます。
しかし、別シートをアクティブにしているので、エラーになります。
自シートがアクティブの時のみ有効です。
 
シートやセルを選択するばあいは、標準モジュールに記述したほうが安全です。
もっとも、ここに書かれているコードならば、Selectは不要ですが・・・・
シートやセルをSelectするとレスポンスが落ちます。
ですから、できるだけSelectしない記述を心がけた方がよいです。
 
Selectなしの記述
 
Sub del()
Sheets("料金").Range("A:AJ").ClearContents
End Sub
  
※ClearとClearContentsとの違いを、HELPで勉強してください。
※Range("A:AJ")は、列指定となりますが、データの入っている領域を指定する場合
.UsedRange
を指定します。
 
Sheets("料金").UsedRange.ClearContents
 
 
数式だけ残して削除・・・なんですが、
逆を言えば、定数のみを削除するということですよね?
 
Excelにはマクロの記録という機能があります。
 
「開発」タブの中に「マクロの記録」というボタンがあります。
これをクリックしてから手操作をすると、その操作が記録されます。
記録を終了するといは、「記録終了」ボタンをクリックします。
標準モジュールにコードが作成されています。
 
このコードの中には、Selectが書かれていますが、Selectを除く方法を、コードができたら
紹介しますので、
カスタマイズしてみてください。
 
なお、定数が入っているセルだけ選択するには、
「ホーム」タブの「検索と置換」→「ジャンプ」→「セル選択」→「定数」→「OK」
「Delete」キーを押す
この操作をマクロの記録で実行してみてください。

回答
投稿日時: 19/06/12 15:37:58
投稿者: WinArrow
投稿者のウェブサイトに移動

追加レス
マクロという名前のシートですが、
そのシートにVBAコードを記述つもりでしたら、やめた方がよいです。
 
かなりの部分が標準モジュールで対応できるので
シートモジュールではなく、
標準モジュールに記述することを心がけましょう。

回答
投稿日時: 19/06/12 15:51:40
投稿者: WinArrow
投稿者のウェブサイトに移動

エラー400について
 
VBA記述しているブックですが、
ファイル名(拡張子まで)を教えてください。

投稿日時: 19/06/12 16:08:38
投稿者: vaioyuki

ありがとうございます!!
なんとなくですが、できることできないことがわかってきた気がします。
 
マクロの自動登録はAccessの時でもわからなくなったときに時々するのですが、
そうですね、Excelでもやってみてコードを見てみることもできますもんね。
 
前任者がマクロシートから始まるような形に作成しているのでそれが一般的?な作りになるのかなと思っていました。
私はまだまだわかっていないので素直に標準モジュールで作成していきます。(^^;)
 
ClearとClearContentsもどちらも数式が消えてしまったので何か別のものがあるのかなと思いましたが、
これはまた別で質問させていただきます。
今は「マクロとVBAの違い」がスレッドを立てたよりかは私なりにですがかなり進歩しました。
 
sk様
Suzu様
WinArrow様
simple様
mattuwan44様
 
長々と本当にありがとうございました。
また別でお世話になるかと思いますがよろしくお願いします。