(01) Excel 2016 の「マクロの記録」で保存される内容(実はVBAコード)を確認してみよう!
無料で標準添付の VBA を使わない手はない!
Mac版 Excel にも、 VBA ( Visual Basic for Application ) 環境は標準で含まれています。
本日から、「初めて VBA を触れる方」向けの連載を開始致します。(Excel for Mac 2016 相当)
「広告」
新ブログにて、Excel2016 for Mac 以降 MacScript コマンドの代替となった AppleScriptTask コマンドの利用方法を解説しました!
(VBAから、選択したフォルダ内の全ファイル名を 取得する AppleScript のサンプル付き)
(01) Excel の「マクロの記録」で保存される内容(実はVBAコード)を確認してみよう!
まず、Excel メニューバーの [ヘルプ] - [更新プログラムのチェック] にて、適用されていないアップデートがあれば行ってください。Excel 2016 for Mac 環境での説明となりますので、 Mac版 Excel 2011 では( VBA が利用できますが )同じ結果にならない場合があるかもしれません。
現状、 VBAコード 内で日本語を記述すると(貼り付けのみ可能な場合あり)乱れたり、保存時にクラッシュすることが多いため、 VBAコード は「未変換の英数字のみ」で記述してください。
無料で標準添付の VBA を使わない手はない!
テスト用で xlsm ファイル形式の Excelファイルを「新規作成」するか、既存の Excel ファイル ( xlsx 拡張子 ) を「名前を付けて保存」で xlsm ファイル形式にて 別ファイル名で保存します。
一番右側のリボンに「開発」タブが表示されていない方は、メニューバーの [Excel] - [環境設定] にて以下画面のように設定してください。
開発リボンの [マクロの記録] をクリックして表示される画面で「マクロの保存先」に「作業中のブック」を指定後、 [OK] ボタンをクリックすると「マクロの記録」が開始されます!
適当に複数セルを選択後、任意色で「塗りつぶし」します。
開発リボンの [記録終了] クリックにて、「マクロの記録」を終了。
同様に、「Macro2」では同一の複数セルを 別の色で「塗りつぶし」します。
Mac版 Excel にも、 VBA ( Visual Basic for Application ) 環境は標準で含まれています。
開発リボンの [Visual Basic] クリックにて、VBAコード編集用の VBE ( Visual Basic Editor ) ウィンドウが表示されます。このウィンドウを閉じていないのにどこかに隠れてしまった場合は、Excel のメニューバーから [ウィンドウ] - [Visual Basic Editor] を選択すると再表示されます。
「作業中のブック名」が表示されている行左端の「▲」の記号をクリックして、「モジュール」内の「Module1」をクリックすると、「マクロの記録」にて保存された VBAコード が表示されます。
同一の複数セルを違う色で「塗りつぶし」すれば、コードの違いは1箇所の数字のみ!
黄色で「塗りつぶし」を行うと 65535 、赤色で「塗りつぶし」を行うと 255 のはずです。
この数値の箇所で「色指定」を行っていると推測できますね。
[command] + [Q] にてExcel を終了時、「作業中のブック」を保存するか確認のダイアログ画面が表示されるため 「保存」しましょう。
お疲れ様でした!
「マクロの記録」で保存される内容は英語っぽい一種のプログラム(VBAコード) であることが、良くお解りになったと思います。
続きは、また明日の夜 投稿させて頂きます!
現状、 VBAコード 内で日本語を記述すると(貼り付けのみ可能な場合あり)乱れたり、保存時にクラッシュすることが多いため、 VBAコード は「未変換の英数字のみ」で記述してください。
「広告」
最後まで読んでいただき、ありがとうございます。
ぜひ、右側の「人気ブログランキング」投票に ご協力ください。
また、お越しくださいませ。
// アタル
「広告」
コメント
コメント一覧 (11)
Excel2011forMAC(OSX10.10.5)で作った商品の検索用.xlsmファイルが、Windows環境のパソコン(Windows7-Excel2013、Windows8-Excel2010)で開こうとする「実行エラー"13"」ポップが出現します。
デバッグをすると、下記の
-------------------------------------
Private Sub Worksheet_Change(ByVal Target As Range)
Dim kensakukoumoku As String
With Target
If Target = Range("c3") Then
Worksheets("diagram").Range(Cells(4, 1), Cells(36, 32)).Interior.ColorIndex = 0
Worksheets("diagram").Range("c3:p3").Interior.Color = RGB(240, 240, 240)
kensakukoumoku = Target.Value
If kensakukoumoku = "" Then
MsgBox "input a medecine"
Else
kensaku kensakukoumoku
End If
End If
End With
End Sub
-----------------------
「If Target = Range("c3") Then」の箇所が黄色く表示されます。
デバッグをせずに、ポップを閉じて、作業を行うと問題なく検索もでき、検索結果も表示されます。
ファイルを閉じようとするときには「メモリが足りません」というエラー表示も発生します。
これらのエラー表示はMacPC上(ファイルを作ったPCだけでなく、他のMacPCでも)では発生しないので、原因が突き止められず頭を抱えています。
Macで作った.xlsmファイルは、Windowsで動かすときに気をつける点とかありますでしょうか?
ExcelVBAを触ってまだ半年にもならず、エラー時の対処に関しての知識や経験も全然足りない者なので、ご意見をいただけたら幸いです。
よろしく御願いいたします。
同じ環境が用意できないため、お役に立てないかもしれません。
エクセルVBAで 実行時エラー'13': は「型が一致しません」というエラーです。
黄色く表示される「If Target = Range("c3") Then」の箇所で「型」といえば、
「Target」と「Range("C3")」の2つが該当します。
通常、Rangeオブジェクトは .Value が省略できるため問題ないはずですが、
何らかの理由で比較する「2つの型が合わない」ようです。
(With Target 〜 End With が悪さをする可能性も…)
If Target.Value = Range(“C3").Value Then
への修正を まずは 試してみてください!
With Target 〜 End With は、利用部分のみで固めた方が良いですね。
必要なければ、削除しましょう。
「マクロ(VBA)」を含んだExcelファイルにおいて、マイクロソフトは「Win.版とMac版の互換性」を一切保証していません。
Mac版で作成したVBAコードを関数単位でWin.版に貼り付けると、動作する可能性が高いですが、「逆」は動作しないことがよくあります。
以下は、「Office2016 for Mac」で作成したテストコードです。
「Office2016 for Win.」で作成した「.xlsm」ファイルにテストコードを貼り付けましたが、実行時エラーは出ませんでした。
CStr(Target.Value) は VBAの暗黙の型変換に頼らず、自ら「型変換」関数を利用しています。
Inputbox で受け取った値を数値として利用したい場合も、「型チェック」後に「型変換」関数を利用します。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim kensakukoumoku As String
If Target.Value = Range(“C3").Value Then
kensakukoumoku = CStr(Target.Value)
If kensakukoumoku = "" Then
MsgBox "input a médecine"
Else
MsgBox "Match !"
End If
End If
End Sub
片方では問題のないコードでもOSが変われば、悪さをする場合があるんですね。
奥が深すぎて頭が痛くなりそうです...。
アタル様のご助言を参考に問題の箇所を修正して、確認してみたいと思います。
また分からないところが出てきましたら、図々しいとは思いますがご助言いただければ幸いです。
前回教えてもらった実行エラー13の修正ですが、教えてもらったコードやアドバイスを参考に、さらに
If Target.Value = Range(“C3").Value Then
の箇所を
If Intersect(Target, Range("c3")) Is Nothing Then
に変更したところ、より望む形で無事解決することができました。
ありがとうございます。
ただ、同xlsmファイルをWindowsPCで起動させたところ、閉じようとしたときに「実行エラー7 メモリが足りません」と言うポップウィンドウが表示されるという現象の原因がわかりません。
同ファイルをMacで開いてもそのような現象は出ず、MacとWindowsの互換性の問題かと思って、WindowsPCで新たにxlsmファイルを作ってもこの現象は発生します。
ちなみに、「実行エラー7」が出たと言っても、そのポップウィンドウを閉じれば、普通に保存も終了もすることはできます。
このような現象は何が原因で起こるのか、ご意見、解決策をお教えいただけたら幸いです。
ずうずうしいお願いを何度もしてしまい申し訳ありませんが、よろしくお願い致します。
閉じる際に、「エラー7」が出るのですね…
Mac環境に比べ Windows環境の物理メモリが極端に少なくて発生している可能性は少ないと思いますが、Excelファイルサイズが小さい時でも発生するかどうか調べてみるのも…
以降、VBAコードが原因で「実行エラー7」が出る原因を考えてみました!
(検索して出てきた内容ばかりなら、ごめんなさい)
[1] WorkBook_BeforeClose() イベントプロシージャ記述等の問題!
Auto_Close() 、 Workbook_BeforeSave() イベントプロシージャも念のため、確認してください。
[2] 1つのモジュールやプロシージャ内に、大量のVBAコードを記述しすぎ!
Win.版の場合、モジュールやプロシージャには、Excel内部で64Kの領域が確保されているそうです。
それを超えるような、巨大なプロシージャなどを作成すると「メモリが足りません」と怒られることがあります。
私も何回か体験しましたが、モジュールやプロシージャを分割すればOKです!
[3] Public変数も使用できる領域に制限がありますので、異様に大量なPublic変数を定義していると、このエラーが起こる可能性が!
ちょっと判断が難しいかもしれませんので、 ataruchi7777@gmail.com あてで
メール本文に「記述した全VBAコード」を貼って送って頂いても 大丈夫です!
全ての Sub や Fucntion 等のVBAコード(Public変数定義なども)をお願いします。
(差し支えあるような箇所は、部分的に省略ください)
「原因把握」できないかもしれませんが、気付くことがあるかもしれませんので…
上記のadaさんの質問は解決されているなら、何が原因で、どのようにすれば解決したのか教えて頂きたいです。
私ももう半年くらい前にMS窓口と1時間以上問答し合って結局できないという結論に至って苦渋した経験があります。それ以降MacOfficeは基本的にデータを見るくらいで触らないようにしています。
互換性を担保しないのはMSの勝手ですが、基本的で平易なプログラムに互換性がないのはMSのやる気なさしか感じ得ません。なのでMacVBAは他人に勧めないのがベターじゃないかと感じます。
(なぜ不完全な状態でMSが提供をしたのかも理解できないです)
愚痴になってしまいましたが私が求めるのは、adaさんのようなトライ&エラーと解決法です。MSは自分で知っていてもそれを公開することを拒んでいるので、1つでも多くの事例を知りたいのです。なので私もMacVBAは使えるようにはなりたいというのが希望です。
よろしくお願いします。
今回はMSの問題ではなく、VBAコードの記述ミスが原因でした。
Worksheet_Change() イベントコードを記述したワークシート名を「SheetA」とします。
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Worksheets("SheetA").Cells.Clear
End Sub
上記VBAコードで、全セル(シート全体)が引数の「Rangeオブジェクト」として、Worksheet_Change() イベントが発生
(PCのメモリ環境にも左右されるが)Worksheet_Change() イベントコード記述が完璧でないと、メモリ不足に陥る可能性あり
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Application.EnableEvents = False
Worksheets("SheetA").Cells.Clear
Application.EnableEvents = True
End Sub
手っ取り早くエラーが出ないようにするには、「Cells.Clear」メソッドを イベントの発生を抑制・再開するコードで囲めば良い。
Worksheet_Change() イベントコード記述にて対処するなら、メモリ量も考慮して以下の様なコーディングが必要。
…続く…
For Each aRange In Target
(セル毎に行う処理)
Next aRange
にて、変更された全セル分 繰り返し処理を行う場合は
時間やメモリを消費する可能性を考慮し、
「Sub」の先頭で 制限を設けるのも 良いでしょう。
(以下は、101セル以上同時変更された場合は、処理しない例)
大量セルの Copy & Paste を行った場合など…
If Target.CountLarge > 100 Then
Exit Sub
End If
=====================
「Target.CountLarge」利用の理由
=====================
「Range.Count」プロパティはLong型で Excel2007 で扱える全セル数を超えるため、
「オーバーフロー」エラーが発生する可能性があります!
そのため、ワークシートの最大サイズ (17,179,869,184 セル) までの範囲を
処理できるよう(Variant型らしいですが…)
「Range.CountLarge」プロパティが追加されたとのこと!
「Target.CountLarge」と記述し、「未定義みたいなエラー」になった場合は
「Target.Count」に変更してください。
(Excelの古いバージョンだと、「Target.CountLarge」が利用できないためです)
…続く…
(1)「複数のセルが同時に変更」された時、異なる処理を行う場合のコード
=====================================
Private Sub Worksheet_Change(ByVal Target As Range)
Dim aRange As Range
If Target.CountLarge > 1 Then ' 「複数のセルが同時に変更」された時
For Each aRange In Target
' aRange に順番に変更された「セルが1つずつ」格納されるため、
' 繰り返し 処理する (aRange.Value でセルごとの値を取得可能)
Next aRange
Else ' 「セル1つのみが変更」された時
' Target は単一セルのため、(Target.Value で変更されたセルの値を取得可能)
End If
End Sub
=====================================
(2)「複数のセルが同時に変更」された時も、セル毎に同じ処理を行う場合
=====================================
Private Sub Worksheet_Change(ByVal Target As Range)
Dim aRange As Range
' 以下は 100セル同時変更まで 処理する場合
If Target.CountLarge > 100 Then
Exit Sub
End If
For Each aRange In Target
' aRange に順番に変更された「セルが1つずつ」格納されるため、
' 繰り返し 処理する (aRange.Value でセルごとの値を取得可能)
Next aRange
End Sub
…続く…
(3)「複数のセルが同時に変更」された時にイベント処理を行わない場合
=====================================
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.CountLarge > 1 Then ' 「複数のセルが同時に変更」された時
Exit Sub
Else ' 「セル1つのみが変更」された時
' Target は単一セルのため、(Target.Value で変更されたセルの値を取得可能)
End If
End Sub
きちんと対処するには、「上記3パターンから選択する必要がある」と
ブログ記事にも加筆予定ですが、仕事が忙しくてまだ直していません(汗)
…終了…
[1] 子フォルダを含め、フォルダ内の全ファイル名の取得
[2] テキストファイルの入出力
[3] PDFファイル内の全テキストを抽出
https://mac-excel-vba.blogspot.com/search/label/AppleScriptTask
新ブログは 通称 Cocoa AppleScript と呼ばれる ASOC ( AppleScript Objective-C ) にも手をつけています!