2023年06月30日

【Excel VBA】ユーザー定義型でちょっとハマった件

お題

constがカオス・・・w
似たようなものがいっぱいあってごっちゃごちゃだから、まとめよう。
と思ったらちょっと罠があったので、メモ。


実装

●定義
Public Type FileInfo
    fileName As String
    shtName As String
    beginRow As Long
    endColumn As Long
End Type


●値セット
Public Function SetType( ByRef info1 As FileInfo, ByRef info2 As FileInfo)
    With info1
        .fileName = "test.xls"
        .shtName = "sheet1"
        .beginRow = 2
        .endColumn = 8
    End With

    With info2
        .fileName = "test2.xls"
        .shtName = "sheet2"
        .beginRow = 2
        .endColumn = 10
    End With
End Function


●呼び出し
Dim info1 As FileInfo,info2 As FileInfo
Sub Main()
    Call SetType(info1,info2)
End Sub



メモ

FunctionはByRefで渡さないと、エラー吐きます。
へなちょこは理由がなければ基本ByVal渡しする派なので、最初は何も考えずにByValで渡してて、ちょっとハマった
当たり前よね笑

ユーザー定義型にしておくと、メンバが表示されるようになるので、入力間違いも防げるし、いちいち宣言しなくてもいいから楽ちん♪
今回はあくまでターゲットの情報をわかりやすくしたかったので、あえて別のオブジェクトにしてみた。
infoをまとめてがちゃがちゃやる場合はinfoを配列にしちゃえばいいよ。










タグ: Excel tips

2022年04月27日

【Excel VBA】行継続文字(_)を使いすぎています

FULL OUTER JOINをやらなくてはいけない案件があって、せっせとSQLを書いてました。
実際のカラムはValしたりCdateしたりAsしたりと長いので、3カラムずつで。
1つのSQL文で書かなきゃいけないので、LEFT JOINとIS NOT NULLしたRIGHT JOINをUNIONすればいけっかなーなんて軽い気持ちで書いてて・・・

2022_0426_1.png
※仕事のやつをそのまま載せるわけにはいかないので、てきとーに書いてます。
たぶん間違ってるけど、そこは突っ込まないこと。


あともう少し!!ってとこで
2022_0426_2.png

ええーー!
& _ って回数制限あるの!?
数えてみたら、25個目でエラーが出ました。

& _ は24個まで。
7年やってて、初めて知ったw
そんなに改行するなんてアホか、とMSに言われた気分です。
知らなくてもたいていは困らない知識を取得しました。



タグ: エラー VBA Excel

2021年03月17日

【Excel VBA】ユーザーフォームのCaptionが文字化け

初対面

ユーザーフォームのCaptionに、日本語で直接入力して
2021_caption_1.png

「てすと」を確定すると
2021_caption_2.png


文字化け。
今までこんなことなかったのに!!

マルチページ、ラベル、ボタン、チェックボックス等よく使うもの諸々のCaptionすべて文字化けします。
あと、テキストボックスのTextも。


環境

[発生した子]
Office365
バージョン 2008
ビルド 13127.21064

へなちょこのプライベートPCでは発生しません
Office2019
バージョン 2102
ビルド 13801.20266


設定確認

[コンパネ]→[地域]→「管理」タブ→[システムロケールの変更]

ベータ:ワールドワイド言語サポートでUnicode UTF-8を使用
2021_caption_5.png


にチェックが入っていると文字化けする

という情報があったのですが、発生した子はチェックオフでした。

試しにチェックを入れてみたら、プロジェクトエクスプローラーが文字化けしましたw
 ↓
2021_caption_6.png

コードは見た目は文字化けしてないけどパスとかシート名とか日本語が読めてなくてエラーが出ましたw
(イミディエイトで変数見たら、文字化けしてました)


MSDN

Visual Basic エディタの検索ダイアログで文字が正常に表示されない

検索/置換ダイアログ ボックスじゃないけど、症状が似てるからこれやってみようかな。


回避策?@

メモ帳で打ったものをコピペ。

でもねぇ、毎回コピペするのはめんどい。


回避策?A

レジストリ触ります。

Microsoftからの警告
 レジストリ エディタの使い方を誤ると、深刻な問題が発生することがあります。
 最悪の場合、オペレーティング システムの再インストールが必要になることがあります。
 マイクロソフトは、レジストリ エディタの誤用により発生した問題に関しては、一切責任を負わないものとします。
 レジストリ エディタは、自己の責任においてご使用ください。
 へなちょこも責任取れません。


【key】
\HKEY_CURRENT_USER\Software\Microsoft\Office\ 16.0 \Excel\Options

※16.0はバージョンコードなので、お使いのバージョンによって異なります

名前:QFE_17407
種類:DWORD(32ビット)値
データ: 1
2021_caption_4.png

発生した子にはこのキーはなかったので、作りました。


結果

PC再起動したら、文字化けしなくなりました。
2021_caption_3.png

めでたしめでたし。











タグ: Excel VBA バグ

2020年06月01日

【Excel VBA】Workbook_openで「パス名が無効です」

突然の出会い


ブックを開くときにフォームを表示する。

Private Sub Workbook_Open()
 UserForm1.Show vbModeless
End Sub


よくあるやつ。

いつも通りに書いて、ファイルを開きなおしたら
20200530_1.png
Σ(゚Д゚)
なんで!?

[OK]を押したら、そのままファイル閉じた・・・。

もう1回ファイルを開いたら、エラーは出ないけど、Excelのタイトルバーに、ファイル名[修復済み].xlsmって出てる。
こ、壊れた・・・??

まだそんなに作りこんでなかったから、新規ブックにモジュールをインポートしてもう一回。

やっぱり同じエラーが出る。



コード特定

セーフモードでファイルを開いて、Private Sub Workbook_Open()から実行してみたら、

UserForm1.Show vbModeless

で止まりました。
えええぇぇ!?



環境?

エラーが出たのは、Win10 64bit + Office2019 64bit。

埃かぶってるサブノートPCを引っぱり出してみた。
この子はWin7 32bit + Office2010 32bit。
(サポート切れてるけど、完全オフラインだから許してw)

こっちでも出た。



対策

修復済みになったファイルで、フォームを実行するとエラーは出ないでちゃんと表示されるから、コードに問題はなさそうなんだけどなぁ。

いつもと違うとこ・・・。

うーーーん。



アッ!!
今回だけいつもと違うとこあった!!!

いつもはチェックボックスのValueは都度コードで判定してるんだけど、今回は数が多くてめんどくさいのと、今後増減の可能性大だから、セルにリンクさせてた!

片っ端からControlSorceのセル番地を削除してみたら、エラーは消えましたヾ(*´∀`*)ノ

でも・・・、リンクセル使いたい(>ω<)
とゆーか、リンクセル前提で作っちゃったもん。
使えないと困る。
設計からやり直し、めんどくさい。


ダメもとで、InitializeでControlSorceを設定したら、エラーは出ませんでした♪
こんなカンジ。

Private Sub UserForm_Initialize()
 Cbox1.ControlSource = "Sheet1!A1"
End Sub




調査

さんざんググってみたけど、「パス名が無効です」は、ファイル関連ばっか。
MSDNも見つからなかったです。
見つけた方、是非教えてください。

てか、ControlSorceが原因なのに、「パス名が無効です」ってエラーメッセージおかしいよ!
つかそもそも、エラーがMsgBoxで出てくるってどーゆーこと!?
ふつーだったら
20200530_2.jpg
こーゆーのでしょ。
MsgBoxのエラーなんて初めて見た。
しかもMsgBoxだったらふつーは、タイトルバーはExcelかMicrosoft Excelじゃない?

絶対VBAのバグだと疑ってます。



追記

TextBoxのControlSourceと、ListBoxのRowSourceでも出ました。










タグ: バグ Excel VBA

2019年11月26日

【Excel VBA】エラーチェックオプションのプロパティ

依頼

ユーザーから、「緑の三角うっとおしい」って。
「数式は隣接したセルを使用しません」が出てるけど、「大丈夫だから。気にしないで」って言ってみたが、「消せるなら消してよー」

あ、ハイ・・・。


エラーインジケーター

エラーインジケーターの操作は、
range.Errors.Item(引数).Ignore = Boolean


引数がわからないので、MSDNを開いたら・・・

https://docs.microsoft.com/en-us/office/vba/api/excel.errors.item

な、なんという・・・。
こんなんでわかるかー!!

ということで、 コチラ を参考にさせていただきました。

やってできなくはないけど、セルいっぱいシートいっぱい。時間かかる。


エラーチェックオプション

じゃあ、エラーチェックオプションをオフっちゃおう。
がさごそ・・・。

https://docs.microsoft.com/ja-jp/office/vba/api/excel.errorcheckingoptions

すごいわかりにくい!!(屮゛Д")屮 ムキー

仕方ないので、生まれて初めての「マクロの記録」でプロパティを調べてみた。


プロパティ

0042_1.png

'「バックグランドでエラーチェックを行う」
Application.ErrorCheckingOptions.BackgroundChecking = False


'「エラー結果となる数式を含むセル」
Application.ErrorCheckingOptions.EvaluateToError = False


'「領域内のセルを除いた数式」
Application.ErrorCheckingOptions.OmittedCells = False


'「テーブル内の矛盾した集計列の数式」
Application.ErrorCheckingOptions.InconsistentTableFormula = False


'「数式を含むロックされていないセル」
Application.ErrorCheckingOptions.UnlockedFormulaCells = False


'「2桁の年が含まれるセル」
Application.ErrorCheckingOptions.TextDate = False


'「空白セルを参照する数式」
Application.ErrorCheckingOptions.EmptyCellReferences = False


'「文字列形式の数値、またはアポストロフィで始まる数値」
Application.ErrorCheckingOptions.NumberAsText = False


'「テーブルに入力されたデータが無効」
Application.ErrorCheckingOptions.ListDataValidation = False


'「領域内の他の数式と矛盾する数式」
Application.ErrorCheckingOptions.InconsistentFormula = False


'「誤解を招く数値の書式」
これ、2013にはないなぁ。
2019にはあるけど、2016はどうなんだろ?
2016持ってない
とりあえず記録してみたら

ExecuteExcel4Macro "(,,,,,,,,,,,FALSE)"

よくわからん。


用途

初めて記録のありがたさを知りましたw
Workbook_OpenとWorkbook_BeforeCloseに入れて、そのファイルだけオフにしてみた。

「数式は隣接したセルを使用しません」は、「領域内のセルを除いた数式」で消せます。
コレね。
Application.ErrorCheckingOptions. OmittedCells = False


大きいデータを扱うときは、「バックグランドでエラーチェックを行う」をオフにすると、心なしか早くなるかも。





2019年09月24日

【Excel VBA】入力規則でアプリケーション定義エラー

事件勃発

今まで問題なく回っていたのに、ある日突然、アプリケーション定義エラー

問題のコードはコチラ

Sub test()
 With Range("A1").Validation
   .Delete
.Add Type:=xlValidateList , _
   Operator:=xlEqual, _
   Formula1:=strFormula
  End With
End Sub


.Addで出た
なんでーー???

同じモジュール内で、IMEのOn/OffとかxlValidateWholeNumber(指定した間の整数のみ)とかはエラー出ないのに。
それどころか、さっきはふつーに通ってたのに!



調査

とゆーかググっただけw

いろんなサイトやブログでの原因をまとめてみた

・シートの保護がかかっている
・すでに設定されている
・シートがActiveになっていない
・Formulaの式中のシート名が存在しない


うん。
どれも該当しない。
上記は全部イミディエイトで確認した。
わからん。

目下急ぎの仕事があったので、とりあえず放置。
んで翌日の朝回してみたら、エラー出なかった。

気のせいだったことにしておこうw



デバッグ

しばらくして、また回したら、嬉しくない再会。
2度と会いたくなかったんだけど。

仕方なくデバッグしてみる。

うんうん唸りながら3時間・・・。

ふと、strFormulaって何が返るんだ?って気になった。
他の人が作ったやつだし、エラー出ないときもあるから、strFormulaは絶対に合ってると思い込んでてちゃんと見てなかった。
COUNTIFだけども少々ややこしいんで、strFormulaをコピーしてセルに入れてみた。

アッ・・・!
035_1.png

そりゃそーだorz



答え

画像でわかるかな?

Excelの仕様です。

列の表示をR1C1形式にしてるときに、A1形式で式を入れるとエラー吐きます。
逆も然り。
このせいですね。

strFormulaはA1形式で書いてます。
んで、へなちょこは基本的にR1C1です。
VBAとゆーよりかはExcelそのものがエラー出してるんですねぇ。

それならもうちょっとわかりやすいエラー出してよ。
MSさんは、アプリケーション定義エラーをVariantと定義しているのだろうか。
なんかよくわからんエラーはとりあえずアプリケーション定義エラーにしとけ!みたいな・・・。



対策


入力規則を設定する直前に、コレを入れてみた
If Application.ReferenceStyle = xlR1C1 Then
 Application.ReferenceStyle = xlA1
End If

R1C1だったら強制的にA1に戻す。
これでおK♪



結論

入力規則をAddするときに出るアプリケーション定義エラーの原因
・シートの保護がかかっている
・すでに設定されている
・シートがActiveになっていない
・Formulaの式中のシート名が存在しない
Formulaと、現在のExcelの参照形式が異なっている



タグ: VBA Excel

2019年03月05日

【Excel】最大化で起動してくれない件

お隣さんの悩み

お隣さんからの質問。
「たまに、Excel起動するとすんごい縦長なんだけど、何とかならんかのぅ?」

とりあえず現象が起きたときに声掛けてってゆっといたら、その日のうちに遭遇。

こんなカンジだったw
0041_0.png
※イメージです
 さすがに職場のスクショは撮れないので、家で再現しました



設定確認

[スタート]→[Excel]を右クリック→[その他]→[ファイルの場所を開く]→Excelを右クリック→[プロパティ]

0041_01.png

実行時の大きさは[最大化]になってるね・・・。



レジストリ確認

Microsoftからの警告
 レジストリ エディタの使い方を誤ると、深刻な問題が発生することがあります。
 最悪の場合、オペレーティング システムの再インストールが必要になることがあります。
 マイクロソフトは、レジストリ エディタの誤用により発生した問題に関しては、一切責任を負わないものとします。
 レジストリ エディタは、自己の責任においてご使用ください。

お決まりの警告w
今回は見るだけだけども、レジストリってなーに?って方はスルーしてください。

\HKEY_CURRENT_USER\Software\Microsoft\Office\ 14.0 \Excel\Options

※14.0はバージョンコードなので、お使いのバージョンによって異なります

キーは[Maximized]
最大化は10進数だと 3 です。

うん。
3になってる。



MSDN

ふつーにあったwww
コチラ→

【現象】
ワークブックが非表示になっているマクロを含んだ Excel ファイルが、XLSTART フォルダーに置かれている場合、前回終了時にウィンドウが最大化されていた場合でも、Microsoft Excel 2010 が最大化されたウィンドウ サイズで起動しません。

たとえば、個人用マクロ記録ブック (PERSONAL.XLSB) を使っている場合や、XLSTART フォルダーに Excel アドインを置いている場合に、この現象が発生します。

なお、この現象が発生した際は、XLSTART フォルダーにある、他のファイル (Book.xltx などの新規ワークブックのテンプレートとして利用するファイル) が読み込めない場合があります。


待って!
personal.xlbって普通シート非表示で使うよね?
回避策に「ワークブックを表示した状態に変更して保存する」って書いてあるけど、personalを表示してたらうっとおしいことこの上ないよ?
つまりは、personal.xlb死亡宣告じゃんw



状況

2019年3月現在
「マイクロソフトでは、この問題について現在調査中です。詳細については、わかりしだいこの資料に掲載する予定です。」

あ、これ一生直らないやつだw
2010から出てるのに未だ直ってないもんね。
新しいバージョンにバグはそのまま移行するのはMSのお決まり。




結論

要するに、XLSTARTに何かあると起こるバグですね。
へなちょこもXLSTART使ってるけど、最大化で開くのはどーでもいいから、気づかなかったw
personal.xlbは最悪の場合、アドイン化して別フォルダに移動すればいいけど、Book.xltxは別フォルダで起動時読んでくれるのかな?
Templateフォルダでいけるかな?
Book.xltxはないと困るよ!!
どうしよう・・・(||゚Д゚)

XLSTARTの異常は、へなちょこ的には致命的なんですけど。
巨大化しすぎてもう手付けられないんだろうなぁ。
パワークエリとかよくわからんクソ重い機能なんていらんから、直してーー!








タグ: Excel バグ VBA

2018年11月03日

【Excel VBA】customUIに既存の機能を入れる

お題

リボンを作ってて思うこと・・・
「既存の機能も入れたい!!」

今まで出来ないと思ってたので、既存機能はオプションからタブを作って入れてました。
でもこれって、アイコンがちょっとしかなくて、なかなかピッタリなものがなくて不満。
あとcustomUIとタブが分かれちゃって不便。

前回、タブやグループのコントロールID一覧を見ててふと気づいた。

Control Nameに既存の機能も含まれている ということに。

ってことは、cusomUI.xmlに書けるんじゃん!?



試行錯誤

とりあえず勘でw
<button id="Button001" imageMso="HappyFace" label="VBE&#xD;&#xA; " size="large" onAction idMso="VisualBasic" />


0040_01.png


怒られた・・・。
へなちょこの勘、無に等しき。

onAction="idMso="VisualBasic"
command idMso="VisualBasic"

とかイロイロ思い付きでやってみたけど、Excel様はお気に召さないようです。
しょーがないよ。
13時すぎは睡魔と戦うのが仕事だもの。



初心に返る

わからないときは、作った本人に聞け!
MSDN を眺めてみた。

ひたすらひたすらスクロールしてたら・・・眠くなっちゃった。
ぼーーっとしながらスクロールを続け・・・

スクロールする手が疲れちゃったから、そろそろ諦めよっかなー、と思ったら・・・

0040_02.png


コレだ!!!


実装

<button idMso="VisualBasic" />


0040_03.png


できた!!
あれこれ試行錯誤したけど、こんな簡単なものでしたw


しかし、ちっさいなー。
ダメもとでやってみる。
<button idMso="VisualBasic" size="large" imageMso="HappyFace" label="VBE"/>


0040_04.png


いけた♪

調子に乗ってどんどんつっこんでみる。
<button idMso="ControlsGallery" size="large" />
<button idMso="DesignMode" />


あれーー??
0040_05.png


コントロール名のこぴぺミスったかな?

コントロールID一覧を見直してみたら

0040_07.png


Control Typeがgalleryになってるね。
一番最初はControl Typeを書くっぽい。←MSDNをちゃんと読んでない
<gallery idMso="ControlsGallery" size="large" />

にしてみたら、Excel様もご満足いただけた模様。



結論

< Control Type idMso=" Control Name " />




余談

へなちょこのタブはこんなカンジ。

0040_06.png

デザインモード〜マクロの記録は、boxに入れてます。
既存機能を入れられたおかけで、開発タブは、もういらない笑












2018年10月03日

【Excel VBA】既存のタブをカスタマイズ

お題

customUI.xmlでタブを追加すると、一番右に表示されます。
でもよく使うものだから、一番左に表示したい!
そのためには、デフォルトのコントロール名が必要です。



デフォルトのコントロール名一覧

Office 2016 Help Files: Office Fluent User Interface Control Identifiers

Office 2013 Help Files: Office Fluent User Interface Control Identifiers

Download Office 2010 Help Files: Office Fluent User Interface Control Identifiers


Excelは、ExcelControls.xlsxに記載されています。
Let's DownLoad。



ホームタブの左にタブを追加

 insertBeforeMsoを使うと、指定したコントロールの前(左)にタブが追加されます
0039_1.png

<tab id="CustomTab1" insertBeforeMso ="TabHome" label="test">




ホームタブの中にグループとボタンを追加

通常は、「ホーム」タブの一番左のグループは、クリップボードですが
0039_2.png


下記のコードを入れてあげると、クリップボードの左にグループを作れます
0039_3.png

<tabs>
    < tab idMso="TabHome" >
        <group id="customGroup" insertBeforeMso="GroupClipboard" label="test">
            <button id="customButton" label="test" imageMso="HappyFace" size="large" onAction="test" />
        </group>
    </tab>
</tabs>



ホームタブの中のグループにボタンを追加

同じように、クリップボードグループの中にinsertBeforeMsoで既存のボタンを指定したらエラー吐かれた。
既存グループの中にはボタンは作れないようです。
残念。













2018年09月03日

【Excel VBA】.xlsm→.xlsx保存でエラー

問題

.xlsmを.xlsxで保存しようとしたらエラーが出た。
wb.SaveAs Filename:=FileName, FileFormat:=xlWorkbookNormal

実行時エラー '1004':
'SaveAs' メソッドは失敗しました: '_Worksheet' オブジェクト


え?なんで??
びっくりしすぎて、エラーのスクショ撮るの忘れたw


MS技術情報

[XL2002] エラー メッセージ : 'SaveAs' メソッドは失敗しました

【発生条件】
VBA マクロを使用してワークシートを保存している。
かつ
ファイル形式に、定数 xlWorkbookNormal を指定している。

【回避策】
ファイル形式の指定を定数 xlWorkbookNormal から 1 に変更します。

【へなちょこメモ】
技術情報は2002だけど、2016でも発生
workbookを保存でも発生


やってみた?@

とりあえず、MSの言う通りにやってみる。
wb.SaveAs Filename:=FileName, FileFormat:= 1

これで実行したら、確かに実行時エラーは出なくなった。
が。

保存したファイルを開きなおすと・・・
0038.png

ちょw
MSさーーん!
ちゃんとテストしてよー!!

つか、 XlFileFormat 列挙 には、1っていう値は載ってないようだが・・・。
1って何だ?
xlWorkbookNormalは、-4143でしょ?


やってみた?A

XlFileFormat 列挙に使えそうなものはないか、がさごそ・・・。
あった。

wb.SaveAs Filename:=FileName, FileFormat:= xlWorkbookDefault

これだとエラーも出ず、開きなおしても問題ない。

xlWorkbookDefaultは
Excelのオプション>保存>ブックの保存のファイルの保存形式

かな?と思って、試しに.Excel 97-2003 ブック(*.xls)に設定して、xlWorkbookDefaultで保存してみたけど、.xlsxで保存されてた。
デフォルトって何だろう??
曖昧なものはあんまり使いたくないけど、しゃーない。

MSさん、新機能なんてもういらないから過去のバグ直してけろ。













タグ: Excel VBA

2018年08月08日

【Excel VBA】リボンの準備

リボンを作るときのコピペ用です。
自分の環境が変わったとき用なので、詳しい解説はないです(;'∀')


_res

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Relationships xmlns=" http://schemas.openxmlformats.org/package/2006/relationships"><Relationship Id="rId3" Type=" http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties" Target="docProps/app.xml"/><Relationship Id="customUIRelID" Type=" http://schemas.microsoft.com/office/2006/relationships/ui/extensibility" Target="customUI/customUI.xml"/><Relationship Id="rId2" Type=" http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties" Target="docProps/core.xml"/><Relationship Id="rId1" Type=" http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="xl/workbook.xml"/></Relationships>



customUI


<?xml version="1.0" encoding="Shift_JIS" ?>
<customUI xmlns=" ">http://schemas.microsoft.com/office/2006/01/customui">
<ribbon>
<tabs>
<tab id="CustomTab1" label="ラベル">
<group id="Group10" label="">
<button id="Button101" imageMso="" label="" size="large" onAction="" supertip=""/>
<button id="Button102" imageMso="" label="" size="large" onAction="" supertip=""/>
<button id="Button103" imageMso="" label="" size="large" onAction="" supertip=""/>
</group >

<group id="Group11" label="">
<button id="Button111" imageMso="" label="" size="large" onAction="" supertip=""/>
<button id="Button112" imageMso="" label="" size="large" onAction="" supertip=""/>
</group >
</tab>
</tabs>
</ribbon>
</customUI>

ラベル改行→&#xD;&#xA;


クリックで渡される

control As IRibbonControl












2018年02月01日

【Excel VBA】StatusBarが表示されない

問題

昨年、MS-Officeが2016に変わってから、Application.StatusBarが表示されなくなりました。
まったく同じコードでも、Excel2010だとちゃんと表示されるんだけどなぁ。
Application.StatusBar以外は問題ないからとりあえずそのまま使ってるけど・・・。
やっぱり何とかしたい!
へなちょこはめんどくさがりやだから、進捗状況用のフォームとか作るのめんどくさいもん。
今処理してるファイルのファイル名さえわかればいいの。
よし!!
久しぶりにコードとご対面してみようかな。


やってみた1


ググってみたら、Application.StatusBarの前にDoEventsを入れてみては?ってゆー意見が多々。
とりあえず入れてみる。


With Application
.ScreenUpdating = False
.DisplayAlerts = False
.StatusBar = "処理中・・・"
End With
  ・
  ・
  ・
targetFile = Dir(targetPath & "\*.xls*")
  ・
  ・
  ・
Do While targetFile <> "" And InStr(targetFile, "~$") = 0
DoEvents
Application.StatusBar = targetFile & " 処理中・・・"



状況は変わらず。
Application.StatusBarの後にもDoEvents入れたけど、やっぱり表示されない。


やってみた2

ループ2回目で中断して、眺めてみる。

うーーん。
targetFileは問題なく開いてて、StatusBarはちゃんと表示されてるんだけどなぁ・・・。

・・・。

・・・・・・。

・・・・・・っっ!!!

ちょっと関係ない話思い出した!!

Excel2016で[上下に並べて表示]をしたときに、上のウインドウにも下のウインドウにもリボンが表示されるので
「何これ。超うざい」
って思って仕様を確認したら、Excel2013から、ファイルを開いたり新規ブックを作成すると、新しいインスタンスが作られるそうな。
「同じウインドウで開く」とゆー概念がなくなったようです。
どーしてそーなった?Microsoftよ・・・。
シングルで不満はなかったのに。
いや、むしろシングルのほうがいいんだけど。

はい。話戻ります。


つまり、Excel2010は
0035_1.png
1つのExcelウインドウで複数のファイルが開いている
ウインドウが1つだから、どちらのファイルがアクティブであってもStatusBarは表示される。

一方Excel2016は
0035_2.png

targetFileとマクロ実行ファイルはウインドウが別。
マクロ実行中は、targetFileはバックグラウンドで見えないけど、ActiveなのはtargetFileなのよね。

StatusBarはApplicationクラスだから、ブックの指定はできず、今Activeなブックのウインドウに表示される。


ってことは、StatusBar表示直前に、マクロ実行ファイルをActiveにすればいいんじゃん!?


With Application
.ScreenUpdating = False
.DisplayAlerts = False
.StatusBar = "処理中・・・"
End With
  ・
  ・
  ・
targetFile = Dir(targetPath & "\*.xls*")
  ・
  ・
  ・
Do While targetFile <> "" And InStr(targetFile, "~$") = 0
DoEvents
ThisWorkbook.Activate
Application.StatusBar = targetFile & " 処理中・・・"




マクロを実行してるファイルのStatusBarにファイル名が表示されました♪
ご満悦♪♪
DoEventsはなくてもたぶん大丈夫だけど、 念のため。 消し忘れw

それにしても、こーゆー仕様変更やめてほしいなぁ。
一見関係なさそうなとこで、いろいろ問題が起こるんだもんなぁ。


注意

?@図まで作って解説風なことを言ってますが、あくまでへなちょこの見解です。
Microsoftの公言ではありません。

?Aへなちょこは、オブジェクトは必ずオブジェクト変数に格納して、オブジェクト変数をあれこれします。
ThisWorkBookをActiveにしているので、その後オブジェクトの指定は必須ですよ。
指定してないと悲劇が起こるかも・・・。








2018年01月22日

【Excel VBA】値貼り付けのショートカットキー

やりたいこと

仕事では、Excelで[Ctrl] + [V]なんて滅多に使わない。
Excelの悪仕様のおかげで、うっかりふつーに貼ったら、無駄にリンクされちゃったり。
書式とか入力規則とか、モレなくおまけで付いてこられても嬉しくないし。
むしろ迷惑。
おまけはいらん。

Excelでの貼り付けの95%は値 or 式です。
でも、毎回毎回右クリックして[値]ボタン押すの、めんどくさい。

[Ctrl] +[Shift] + [V]で値貼り付けできるようにしましょ。


コード

標準モジュール

Sub PasteOnlyValues()
On Error Resume Next
Selection.PasteSpecial xlPasteValues
End Sub


 ※コピーが行われていない状態で実行するとエラーが発生するため、「On Error Resume Next」で回避


クラスモジュール

Private Sub Workbook_Open()
Application.OnKey "+^v", "PasteOnlyValues"
End Sub



※[Ctrl] + [Shift] +[V]で貼り付けた場合、アンドゥ(元に戻す)は効きません。
※いつでも使いたいので、PERSONAL.XLSBに保存するか、.xlamでアドイン化しておきましょう。


特殊キー

キー
コード

Shift
+ (正符号)
Ctrl
^ (カレット)
Alt
% (パーセント記号)



一般キー


キー コード
BackSpace {BACKSPACE} または {BS}
Break {BREAK}
CapsLock {CAPSLOCK}
Clear {CLEAR}
Delete または Del {DELETE} または {DEL}
{DOWN}
End {END}
Enter (テンキー) {ENTER}
Enter ~ (チルダ)
Esc { ESCAPE} または {ESC}
Help {HELP}
Home {HOME}
Ins {INSERT}
{LEFT}
NumLock {NUMLOCK}
PageDown {PGDN}
PageUp {PGUP}
Return {RETURN}
{RIGHT}
ScrollLock {SCROLLLOCK}
Tab {TAB}
{UP}
F1 〜 F15 {F1} 〜 {F15}




すみません。
へなちょこはhtml初心者です。
表もキレイ書けないし、Syntax HighLightも入れ方わかりません。
見ずらくってほんとにすみません。
いつか、コードをカラーリングしたいなぁ・・・。










タグ: ExceVBA
Build a Mobile Site
スマートフォン版を閲覧 | PC版を閲覧
Share by: