VBAなんでも質問スレ Part3
VBAを使った質問ならなんでもござれ 本来の対象であるオフィスアプリを操作する以外の話もOK ゲーム作り、Webアクセス、外部アプリの操作 COM(ActiveX)、Win32API、.NET Framework、DirectXなどなど VBAで実行するものであればなんでも質問してください VBAを開発環境としていろいろ作っちゃいましょう 前スレ VBAなんでも質問スレ Part2 https://mevius.5ch.net/test/read.cgi/tech/1432173164/ VBAなんでも質問スレ http://peace.2ch.net/test/read.cgi/tech/1342087380/ プロシージャ終わったあとに変数の中身を保持するにはどうすればいいですか ボタンとかで変数を後で呼び出したいです >>4 Static変数をつかう プロシジャの外で変数を定義する VBA以外のどこか(シートとか)に保存する 好きな方法えらべ 超初心者です すみません、他スレでもきいたのですが 以下の対応をさせたいです @シートを支店分だけ増やす Aシート名をそれぞれ「支店一覧」A2〜A18の支店名にする B作成したシートのB5に支店名を入れる C作成したシートの表のA列が"0"になっている行を削除する D作成したシートのオートフィルタを解除する 以下のものではエラーになりますが、どこが悪いのでしょうか Sub シート作成 Dim 支店名 As Range For Each 名前 In Worksheets("支店一覧").Range("A2:A18") Worksheets("原本").Copy After:=Worksheets(Worksheets.Count) With ActiveSheet .Name = 支店名.Value .Range("B5") = 支店名.Value End With Range("B3").AutoFilter 1, "0" With Range("B3").CurrentRegion.Offset(1, 0) .Resize(.Rows.Count - 1).EntireRow.Delete Range("B3").AutoFilter End With Next 支店名 C作成したシートの表のB列が"0"になっている行を削除する の誤りです コードの3行目は For Each 支店名 In Worksheets("支店一覧").Range("A2:A18") の誤りです >>7 エラーについて質問する時は、なんていうエラーが出たか、どの部分が黄色くなってるか書いて プログラムは間違ってないから、おかしいのは支店一覧のA列に入ってる支店名と思われる >>7 です。 間があいてしまい、申し訳ございません。 マクロを実施すると、「支店一覧」A2:A18のA2,A3,A4のシートまでは対応が完了するのですが、 その後A5名のシートが作成されず、「原本(2)」というシートが作成されたあと、以下エラーとなります。 「実行時エラー'1004': この名前は既に使用されています。別の名前を入力してください。」 >>9 さんの仰る通りなのだと思うのですが、「支店一覧」をみるかぎりではおかしなところはみあたりません (もちろんA2:A18に重複もありません) >>10 隠しシートか、支店名のところに隠れた行があるのでは? きちんとデバッグしないと分からんけど。 簡単なデバッグとしてら、まずはwithステートメントを全てコメントアウトして、動くかどうか。 あとは支店名のところをシンプルにアルファベットのAからQとかに変えてみる。 reportのインスタンスを作成して、property Letでprivate変数に配列を渡した後に、docmd.openreportを行うと変数が全部初期化されるのな。 reportに表示させるものを変数で与えるのは不可能なのかなあ? やっぱり、クエリとか一時的なテープルが必要なのかな?Openargsで出来そうだけど、数が多いと非現実的だよね。 グローバル変数でやるべきかなあ?でも変なときに変数の寿命が来るから不安だよなあ。 word vbaについて質問です。 本文↓ 0001234567891 コード↓ Sub findText() With Selection.Find .Text = "1" Do While .Execute Selection.Comments.Add Range:=Selection.Range Selection.TypeText Text:="あ" Loop End With End Sub 特定の文字列を検索し、コメントを追加するマクロを作っているのですが、 コードを実行すると、本文1個目の「1」にコメントがついた後, 2ループ目の「Selection.Comments.〜」で「5935 コメント、脚注および文末脚注は、本文にのみ追加できます。」というエラーが出ます。 コメント入力時にカーソルが本文外に出るのが原因かと思い、 ループの最後にカーソルを本文中(コメントを付けたワードの直後)に戻すようにしたいのですが どのように記述したらいいのでしょうか? Excel VBAで質問です 現在開いているシートにマクロボタンを作り、実行させると… 現在シートのB列に検索値 別のシート(ABC)のB列の5行目〜400行目までを検索して一致したセル番号が欲しいのですが For cnt=1 To 10 samsu(cnt)=WorksheetFunction.Match(Cells(cnt,1),Worksheets(”ABC”).Range(Cells(5,1),Cells(400,1)),0) … next このMatch関数の正しい書き方を教えてもらいたいのですが。 B列ってcells(?,1)で合ってる? もうcells(?,"B")しか使わないから忘れた >>17 すみません。 Bは2でした… 2に訂正しても、match関数としては動かないみたいです。 質問です。 アクセスから書き込みパスワード付きエクセルファイルに保存するためにエクスポートします。 当然、単純にエクスポートするコードを書いたらエラーで止まります。 これが5年くらい前 最近、この手順を自動化するために エクセルファイル側の書き込みパスワードを解除し、保存、 アクセスからエクスポートと、いうコードを書きました。 パスワードの再設定をしていないのに正常にエクスポートされ、 書き込みパスワードも正しくかかっています。 パスワード絡みの動作がおかしい気がしますが 心当たりはありますでしょうか? WiNdowsを10にかえたことも影響あるかもしれま追記 せん。 ウインドウズの更新かかったらさらに挙動が変わりましたw 質問の件ですが もともとファイル内容の変更ではなく 新規作成で問題無い事に気づいたので パスワードなしマクロファイルを作成→ マクロファイルからパスワード付きで新規(上書き)保存 と、二段階にしました。 2日前まで動いていた自作のマクロが、昨日からウィルスと誤検出されて実行できなくなってしまいました 内容はseleniumでchromeを操作して特定のページを表示させるだけの比較的単純な物です Windows Defenderの定義と、chromeとseleniumと.netは最新にしましたが改善されません どうしたら誤検出だとシステムに教えることができるのでしょうか? デジタル証明書を作って読み込ませたら実行できるようになりました ありがとうございました それにしても、こんなに簡単に証明書を作れてしまうのなら、あんまり意味がない気もしますね とりあえず実行はできましたが、証明書を入れたら起動がとても遅くなってしまいました 誤検出だと知らせる方法もお願いします Excel VBAの質問です。 初心者で申し訳ありません。 yahoo知恵袋にベストアンサーにあったものなのです。 Sub Sample1() Dim dt As Date dt = Range("D11").Value Range("D12").Value = GetNENDO(dt, 3) MsgBox dt & " は " & GetNENDO(dt, 3) & " 年度です" End Sub Function GetNENDO(dt, x) GetNENDO = Year(DateAdd("m", -x, dt)) End Function Range("D12").Value = GetNENDO(dt, 3)の(dt, 3)が理解できません。 またYear(DateAdd("m", -x, dt))の-xとはどういうことでしょうか。 抽象的ですみません 自作のファンクションでGetNENDOというのを作っていて、 このファンクションは引数に指定された日付dtに対してxか月前(-x)の日付の年を返却するみたいだね。 今回はセルD11に入っている日付の3か月前の年をD12に設定しているような動作だと思う 例)D11に「2022/2/3」が入っていればD12には「2021」が設定される 知恵袋さんは回答するだけしといて解説が無いから初心者にはキツイよ カレンダー年から会計年に変換するVBAのようだが こんなのワークシート関数で十分なのに有り難がって使う理由が分からんよ >>29 プログラミング全般に言えることだけど、単なる数式と比較して、関数化して名前が付けてあると、他人が見た時に用途や動作がわかりやすくなるという大きなメリットがある >>29 それ言い出したら、「全部0100010101000」で表現できるのにいちいちアセンブラとかありがたがって使う意味わからん、まで遡る。 抽象化は大事だよ。 あと、地の文に「有難がって」みたいなネガティブな印象の語を持ってきて、言いたいことを暗に伝えるのはやめたほうがいいと思う。 ゲスゴミがよく使うんだけど、「・・・などと訳のわからないことを言っており」とか、「行き過ぎた○○の是正を」とかの表現を使って責任逃れしつつ人や物にレッテルを貼る卑怯者に見える。 俺がゲスゴミって表現使ったのことでなんとなく俺のスタンス伝わるだろ?そういう類。 >>29 ライブラリとか作ったり使ったりしたことなさそう >>26 GetNENDはなんでわざわざ引数2つにしてるんだろうな 年度を求めるなら暦年との差は必ず3な訳で、 2つめの引数に3以外を指定するならGetNENDOって名前が不適切 >>33 https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1063327550 これだろ? 質問の要件が「エクセルのVBAを使って」なんだからおかしくはない >>34 年度が4月始まりじゃない場面は業界によって色々ある >>35 それは事業年度 年度とだけ言う場合は4月始まりだよ 知恵袋をたまに見てるとさ、無言で変な構文やなんかのサイトを張り付けて去っていく回答者いるけど、なんか不気味じゃない?? 事業年度や会計年度は主体・組織によって全く異なる。 会社だと3月期決算の会社は4月始まりだが、 3月期決算でない会社は世の中にたくさんある。 学校年度だって国によって違う。 4月始まりの日本は少数派。 年度が4月始まりじゃないならなおさら二つ目の引数は馬鹿丸出しだろ 普通年度始まりの月とかにしないか? 26です >>27 ありがとうございました。 >>34 のとおりの知恵袋です。 解説が欲しかったので助かりました >>42 VBAなんてExcelに該当のコード貼り付けてステップ実行もすぐできるんだからためそうぜ 「Year(DateAdd("m", -x, dt))」についてはヘルプに引数の説明が載ってるんだから見て理解しないと今後が思いやられるぞ 今日の発見 Option Explicitの有無でサブフォームの選択の仕方が変わるのな ちゃんと書かないとエラーになるコードもOption Explicitを消すと動く >>45 行数が節約できるじゃん。それにOption Explicitを書かないとちゃんと動作するんだよ。 このことはどこかに書いてないかな? 自分は業務で使うちょっとしたツールをVBA使う事があるけど Option Explicitを書いてもちゃんと動くようにコーディングするのが普通だと思うから外すつもりはないけど 行数削減目的で外すとかは絶対ないわ 若いもんに作らせて外されててつけたら動かないようなもの持ってきたら作り直させるね エラーになるってことは変数宣言されてないのが含まれてるってことだよな ちゃんとエラーで止まるコードと何となく動くけど実はバグってる(けど気づかない)コードとどっちが良いのか良く考えなよ まず「ちゃんと書いてない」部分が何かわからないから議論にならないでしょ ただ>>44 のVBAはちゃんとかかなくても動いてる(目的が達成できる)ならそれでいいと思う 自分とこの業務だったら拒否するけどね 購入した業務用のmdbのコードが余りに酷いからリファクタリングごっこしてるうちに見つけたんですよ。1200以上のモジュールをOption Explict化したら急にオブジェクトが見つからないとか言われて驚いたんですよ。変数宣言は1週間かけてチェック済なんですよねえ。不思議ですよねえ それはOption Explict化をミスってるんじゃないか 広域で定義(または利用されて暗黙的に定義)されてる変数を ローカルで定義したとかの可能性が高い つか1000以上のモジュールがあって販売してるようなプログラムとは思えん作りだな 「ごっこ」って言葉を免罪符にしてるんだろうけど 直せないならやらなきゃいい >>44 Option Explicitはあえてエラーをエラーとするようにするための記述だからな HTMLでいうstrictだよ >>51 > 広域で定義(または利用されて暗黙的に定義)されてる変数を > ローカルで定義したとかの可能性が高い でも、Compileは通るんですよねえ。 あとで実験してみますね。 >>つか1000以上のモジュールがあって販売してるようなプログラムとは思えん作りだな 愚痴らせて下さい。 金取るくせにOption Expliciじゃないモジュールが多数。変数がなんでもかんでもVariant。変数の使い回しし放題。インデントがめちゃくちゃ。 命名規則がメチャクチャでバラバラ。 古いコードがコメントアウトで多数残ってる。何十行ものコメントアウトがたくさんあって読みにくいたらありゃしない。 戻り値を返さないFunction。戻り値が返ったと思ったら、受け取る変数はどこでも読まれない。Subでいいだろうが。 宣言だけして利用されない変数多数。空のプロシジャーを呼び出すなど無意味なコード。 とりあえず読み書きされない変数は全部削除しましたが3日かかりました。 全部変数宣言するには1週間かかりました。 分析ツールは他にも多数のDead Codeを指摘していますが、全部はできません。 酷すぎます。 >>52 おいら、プログラマーじゃないんだよ。だから「ごっこ」と書いた。でも本はちゃんと買ってあるよ。 業務で利用しているAccessを改良しているうちに泥沼にはまったんだよ。 Accedssを初めて使ったときは変数という言葉も知らなかったよ。 なんにせよAccess VBAはスレチ Explicitの綴り間違えすぎてるのも怪しいし ここはVBAなら何でもありだと思うけどな 「Excel VBA」スレと間違えてないか? >>54 あるあるだね とくに若手に作らせるとそんなもんだよ 命名規則とかインデントとか、とにかく余裕がなくて勉強してるヒマがない 納期に追われて、とりあえず動く物を作るのでせいいっぱい まあ自分の担当になったんなら、気長に直していくこったな 俺はひどいコード直すの嫌いじゃない 最近はいいツールあるしね インデントぐらいならほぼ一発で綺麗に直してくれるし 購入品なら不具合出たら責任取らせればそれで済む話 リファクタリングなんて自分の勉強目的以外は無意味 自分の勉強目的ならここに愚痴だか何だかわからない書き込みをするのも無意味 書いてみて反応がなければよし、あれば語らう。 自由な空間で試行錯誤をすることを否定するなよ老人脳。 スレも理解できない奴が他人を批判するのもどうかと思うけどな そもそもソースすら満足に直せない奴も低能なのではないか ソースは差し障りがないように改変して皆さんに相談してみたいと思います >Option Explicitの有無でサブフォームの選択の仕方 選択の仕方ってのがどういった状況を指してるのかわからんけど 正常に動作してる状況で宣言の有無でそれが変わる例が思いつかんわ そこだけでもコード曝せ 私も非常に驚いたので晒したいです。 今日は家族サービスでできないので近いうちに。 >>44 それは解決とは言えんのだな バグり上等でとりあえず動けばいいなら さしあたり1200以上のモジュールってのは行数のことだよね オプエクで動かなくなるのって、デフォルトプロパティあたりのタイプミスとかじゃないのかなあ 晒せるように改変してたらあっさり解決したりして 若手って何歳を指しているのよ? まさか40代を指して若手とか定義しているのか? 年齢でも勤続年数でもないのは確か 何ができたら一人前とか定義するのも不可能だし 初心者の定義ならできそう マニュアルを読まない 型を適切に使い分けない コーディングルールを意識しない(インデントやコメント、命名規則も含む) エラーメッセージを読まない とにかくググらない いきなりあのマニュアルは敷居が高すぎる とは思う。 >>71 それは初心者でなくバカなだけでしょ 自分ができない事の原因にそれがあったら直せといいたい ググるっつても、見るのは当然MSヘルプのみ。 上級者はこれ。 他の訳の分からないサイトは一切見ないと聞いた それは構文なんかのお作法が頭に入っているから出来る話 >>74 リファレンスマニュアルのことをマニュアルって呼んだり読むっていう文化無かったからびっくりした リファレンスって呼んでたし見るって言ってる 確かにマニュアルだけど 上級者はMSヘルプだけで解決と聞いた 訳の分からないサイトは参考にしないと PowerPointのVBAについてご教示ください ・達成したいこと 社内作成のファイルを顧客に送付するための処理としてスライドに表示されている情報以外(個人情報、非表示スライド、ノート)を削除したい ・うまくいかないところ ノートのスライドイメージを残しつつ、それ以外を削除すること ・試したこと NotePage.Shapesを全削除→スライドイメージごと削除されてしまう DocumentInspectors(4)でノート削除→ノートに貼られた図などが残る ワードVBAでの質問です. ワードの連番フィールド(SEQフィールド)の結果を文字列で固定したいのですがどうすればいいでしょうか? 多くのフィールドは ActiveDocument.Fields.Unlink で固定化できるのですがSEQフィールドは対象外です. よい方法があれば教えてください. >>81 自己レスです。 Ctrl + a、Ctrl +shift +F 9でできました。 マクロでCtrl +shift +F 9の操作を記録したのですが何も記録されませんでした。VBA には対応するコマンドはないようですね。 お騒がせしてすいませんでした。 今日ろくに考えずに書いたのが 上手く動いて驚いた しかも期待する以上の働きを してたわ 本当に大丈夫か心配だけど じっくり見る気力がないわ WORD VBAでハイパーリンクをクリックする処理はどうすればいいでしょうか. ハイパーリンクをクリックしたときに処理Aを同時に実行したいのですが,エクセルVBAはのようにハイパーリンクのクリックイベントがWORDVBAにはないので,逆にボタンに処理Aと塀パーリンククリックの処理を書こうとしています. ご存知ならば教えてください. >>87 ありがとう followで上手くいきました a=Application.InputBox(”英数字を入力して下さい”,“~を入力“) この入力の時に、全角モードになっていても半角英数字の入力に自動で変更する方法はないでしょうか? sendkeys “%{kanji}“を使用すると、半角英数字になっていた時に全角モードにされてしまいます。 よろしくお願いします。 >>90 ありがとうございます。 ここのページも見て試したのですが、実行した後に手動でセルに直接入力する場合には確かに半角英数字になるのですがinputboxからの入力ではIMEの方が強いみたいです if IMEStatus=vbIMEModeOn then sendkeys “%{kanji}“ end if でどうですか? ありがとうございます >>92 試してみますね >>93 そのやり方と If IMEstatus<>vbIMEModeOff then Sendkeys “%{kanji}“ End If のやり方も駄目でした inputbox後や前に msgbox IMEstatus を置いてみると常に3を吐いています >>92 入力後の半角英数字化ではなくて、入力時には半角英数字になっている状態にしたいです 初心者です。 Excelシート上に、activeXコントロールのボタン、コンボボックス、テキストボックス貼り付け そのプロパティ見ても、タブインデックスが見当たらない? Excelシート上では、タブインデックスは設定不可なのですか? 教えて先輩方 >>98 自動でやるのは不可能 Tabが押されたらカーソルを移動するプログラムを1つずつ自分で書く必要がある アクセスVBAの質問です。 目的のフォルダーにカレントフォルダ―を変更してからファイル選択ダイアログを開こうとしていますが、カレントフォルダーが変更されません。 ChDir "C:\" & 目的フォルダー名 With Application.FileDialog(msoFileDialogOpen) If .Show = True Then フルパスのCSVファイル名 = .SelectedItems(1) Else Exit Sub End If End With どこがおかしいのでしょうか? >>102 ありがとうございました。 できました。 ChDir "C:\" & 目的フォルダー名 はいらないのですね。 >>99 フォーカスのセットができないですね うーん >>105 フォーカスの移動だけならこのへんがヒントになるかな https://excel-ubara.com/excelvba1/EXCELVBA437.html ただしEnterでクリック(確定)はまたちょっとハードルが高い VBAが壊れたファイルってもう駄目ですか? 何か壊れた時の対策はしてますか? VBAに限った話では無いけどデータ破損に備えてファイル履歴残しておくのは最低限の心構えだと思うけどな >>108 何か改造する度にコピーを作成してクラウドで二重化しているなあ。 コマンドボタンを1個置いただけでmdbが壊れて途方に暮れてからそうしている。 外国のサイトを巡っているときに壊れたmdbを修復すると謳うユーティリティーソフトを見た覚えがあるなあ。 フリーの奴をダウンロードして使った記憶がある。俺の場合は役に立たなかったけど、試す価値はあると思う。 昔に比べりゃだいぶ減ったよねブック破損やマクロ破損は。 5chは年寄の巣窟ですよ。 子供は他所で遊んだ方が良いですよ。 >>111 バックドアが結構入ってるから会社ではやらん方がいいよ 1.CommandButton1_Click ウインドウ作成 GetWindowLongPtr→RegisterClassEx→CreateWindowEx 作った窓のウインドウハンドルはパブリック変数に格納 2.CommandButton2_Clickで削除 ウインドウ破棄 DestroyWindow 3.ウインドウハンドル確認ソフトでもウインドウが消えてることを確認し、 手順1に戻るとRegisterClassExが失敗(戻り値ゼロ)になる 何でかな? >>117 「何で」がどこを差しいているかわからんが、 2で破棄したからじゃね >>118 自己解決したわ 手順3でDestroyWindowの後、UnregisterClassを入れないと駄目らしい 購入さたパソコンはオフィス非搭載 VBAは以前簡単なモノは作ってましたが、すっかり忘れてます。 再び勉強してみようかと思ってますが、 無料ソフトのカルクでVBAがある程度学習できるとネットでみつけましたが、これは本当に可能ですか? pythonは大学が無料テキストを公開してますが、VBAの無料テキストは検索しても見つかりませんでした。 どこか無料テキスト公開しているサイトを知りませんか? みなさん、Accessに外部からLoadFromTextを行うときに出てくる 「この操作を実行するとプロジェクトがリセットされます。実行しますか?」 を出なくする方法を知ってますか? 1000以上のモジュールをインポートしないと行けないので、1000回以上ボタンをクリックするのが面倒くさいです。 >>120 MSのサイトでリファレンス公開されてるじゃん VBAが廃止予定とマイクロソフトから予告めいたことが出てるらしいですが、実際はどうなんでしょうか? >>125 その予告によるとVBAの移行先は何処と言ってるの? >>125 それ5年前にも10年前にも聞いたけど、10年たってもあんまり進んでないからあわてる必要は全然ない >>122 そもそも、手動で1個ずつインポートして「ダイアログを出なくする方法」を探すこと自体が間違ってる 1回で済むようにまとめるか完全自動化するのが正解 >>126 Office系がWebView I/Fになり、 JavaScriptになると言ってます >>125 VBA廃止してPythonにすっからよろしくな! ↓ Python導入辞めるわ、使いたかったら優れたアドオン2つあるから使ってな! って前科もあるし >>131 大分前に公式フォーラムで開発者が発言してる MS広報としての発言ではないけど read.cgi ver 07.5.1 2024/04/28 Walang Kapalit ★ | Donguri System Team 5ちゃんねる