Excel VBA 質問スレ Part65
レス数が950を超えています。1000を超えると書き込みができなくなります。
ExcelのVBAに関する質問スレです
コード書き込みや作成依頼もOK
※前スレ
Excel VBA 質問スレ Part64
https://mevius.5ch.net/test/read.cgi/tech/1575297834/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured >>841
卜グルボタンとかチェックボックスのようなオンオフするようなものを変数で管理しようとした時に、変数がTrueならFalseに設定し、FalseならTrueに設定する処理を書いている。
最初のIf文の方は英文が分かれば簡単に理解出来る。
Notを使う方はTrue/Falseだから変数を変数自身と反対にすることで実現してる。 検索Dialogの検索場所(WithIn)をVBAから切り替えるアイデアをお持ちの方いたら教えていただけないでしょうか。
全シートから検索するのが目的ではなく、ブック全体検索後に何気に範囲指定置換を実施して引き起こされる惨状を回避したく。
(または別視点による工夫でもOKです)
詳しい方、よろしくお願いします。 >>852
意味不明な点が多すぎる。
>ブック全体検索後に何気に範囲指定置換を実施して
検索と置換ダイアログでは検索、置換は違うタブだから操作ミスは起きずらいが、
そこまでしなきゃならないのか
>引き起こされる惨状を回避したく。
惨状って具体的になにか
そもそも惨状とやらが起きるのは、GUIの話なのかVBAの話なのか 841です。
丁寧な解説、みなさんありがとうございました。
勉強になりました。 >>855
アンカーも書けず全角で数字を書くよな馬鹿は死ね >>853
説明が不足していました。
検索と置換のタブはパラメータ設定の記憶が共通となっております。
ブック全体検索を行った後に範囲を選択して範囲内置換を実施しようとCtrl+Hを押します。
すると前回検索時の "検索場所=ブック"が活きている状態になっております。
気づかずに実施すると全シートの指定文字列が置換されてデータが破壊されてしまいます。
コロン ":" でも削除置換しようものなら全ての時刻書式が破壊されます。
お試しください。
これを防ぐには、ブック内検索を実施した際は引き続きシート内検索を実施して設定を戻しておく必要があります。
普段ブック内検索ってあまり使わないのでこんな時に限って忘れてしまいます。
VBAはどうなっているかというと、.Find .Replace共に、WithInパラメータが存在しないため引数指定できず、直前のUI操作依存となるわけです。
自動化された置換処理があったりすると、事故が起こるわけです。
本件、GGってよく捜してみたら同様の悩みに対するQAありました。
Range("A1").Find("*")
この1行を実施するだけで検索場所をシートに戻せるようです。
逆に検索場所をブックにする方法を探しているところです。
ご存じの方おられましたら教えてください。 .OpenTextで開いたテキストファイルを操作したいのですがやり方がわからなくて困っています。
拡張子CSVなら通常のエクセルワークシートと同様に扱えますが、テキストファイルは無理なのでしょうか?
Workbooks.Countは開いたテキストファイルの分増えているようですが…
ご教示お願いいたします。 テキストファイルの中身はどのようなフォーマットで、どう操作したいのですか? 1セルに1文字づつならExcelチックに楽しめそうだな
知らんけど >>857
まず、問題としてる事象は提示している方法で解決するんだよね
そのブック開いたときとか操作したときに実行すればいい
>「ブック全体検索を行った後」に「範囲を選択」して「範囲内置換を実施」(ブック全体と指定しているオプションを開いたまま)
→ その悪意に満ちた行為のみを想定するの?
検索ダイアログのオプション設定は起動中のExcelアプリ(プロセス)に記憶されるから、
Excelアプリを開いたまま同じPCで同様の操作をしないと再現しないはず
>気づかずに実施すると全シートの指定文字列が置換されてデータが破壊されてしまいます。
→ さっきの操作をすると検索オプションは開いてるはずだけど、
それでも気付かずファイル保存するっていう悪意ry
GUI操作->GUI操作で出る問題なら、運用で禁止するか保護するか、影響に基づいて運用システム自体を見直す
>逆に検索場所をブックにする方法を探しているところです。
→ 問題としてる事象の解決は自分で提示しているようだけど、
逆に引き起こしたいってことは、単にやりたいから?
VBAで置換するなら別に全シートをReplace擦ればいいだけだし
GUIでブックにしたいならそう操作すればいいけど、何が必要なの
検索と置換ダイアログの操作はCommandBars.dialogsとかExecuteMsoとかで表示は出来る
ウィンドウ操作にしても他のダイアログ操作と似たようなもんだろう(APIが多分必要)
GUIとVBAをごっちゃに対応するから要らない悩みを抱える
運用やコストを考えない妄想の機能なら、それこそ趣味でアドインでも作ればいい 説明足らずで申し訳ありません。
カンマ区切りのテキストファイルに対してOpenTextを使います。これでカンマごとにセルに値が分けらたエクセルブックが開きます。
このブックのシートを通常のエクセルシートと同様に、例えばRange("A1").Activateとしたいのですが、ブックをどうやって指定すればいいのでしょうか?
以下の方法を試しましたがうまくいきません。
元々開いているブックが一つのとき、テキストファイルはWorkbooks.CountWorkbook=2として開かれることを確認。このときWorkbooks(2)をVariant型の変数に代入しようとしました。
Set myBook = Workbooks(2)
ウォッチ式でmyBookの値を確認すると
型 Variant/Object
値 <変数なし>
となり値が取得できません。
テキストファイルの拡張子をCSVに変更すると問題なく値が取得できます。
すみませんがよろしくお願いいたします。 >>862
ご回答ありがとうございます。
>オプションを開いたまま
これの意味がわからないですが、ダイアログを開いたままという意味なら、閉じても記憶は維持します。
全体検索実施と範囲選択実施は一連の動作じゃないです。
例えば複数のファイルを開いて作業していて、全体検索を実施したファイルは既に1時間前に閉じていたとしても設定は維持されます。
これを悪意と言われましても、、
まあ、この点は前述のコードをシートイベント等に挟むことで防げそうです。
(設置Bookに限られるかな?まあ、良い方法を考えてみます)
>それでも気づかずに
キーボード主体でマウスはほぼ使わない派なので、範囲選択→ダイアログ開く→検索語、置換語入力→Enterの動作は
一連の操作で、ガッ、ガガガッで感じでやっちゃうのでダイアログのパラメータいちいち確認しないんですよね。
ちょっと落ち着けよって話なんでしょうけど。
>問題としている事象の解決は自分で提示しているようだけど、
最初に掲げた命題が "VBAで検索場所(WithIn)を切り替えたい" だったので逆の操作もできれば知りたいという程度です。
破壊リスクは回避できそうですが、例えば範囲が”シート"の状態からVBAで"ブック"に変更して全置換も可能なのかな、という疑問です。
結論としては通常の方法では出来なそうですね。
Worksheets.Select: Cells.Select を実行すれば、シートをForで回さなくても
Selection.Replace できることもわかりましたのでこれで解決としたいと思います。
>GUIとVBAをごっちゃに対応するから要らない悩みを抱える
GUIの設定がVBA操作にも影響を与えてしまうから制御できないかなと思った次第です。
お付き合いいただきありがとうございます。 >>863
txtファイル開いた時点で何かしらのファイル名が付いてるでしょ 特に目的があるわけではないけど、興味があってVBAを勉強しようと思ってます。
皆さんどんな勉強法しましたか?おすすめの本とか有りましたら知りたいです >>864
まあ終わってるからいいけど・・
>>オプションを開いたまま
>これの意味がわからないですが、ダイアログを開いたままという意味なら、閉じても記憶は維持します。
→これは、「検索と置換」ダイアログの
「検索場所」ドロップダウンはGUIだと「オプション>>」ボタンで開かれる拡張エリアにのみ表示されて、
「ブック全体を選択した」=「オプションを展開表示している」から、GUIなら気付かないわけがない。
ということ。
ダイアログ内の設定値同様、オプション展開状況もExcelプロセスで共有してるから、
他のファイルで展開してるなら違うブックでも展開されたままダイアログ表示される。
>GUIの設定がVBA操作にも影響を与えてしまうから制御できないかなと思った次第です。
VBAもGUIで行った設定の影響を受けないような、Rangeを指定する記述を普通は心掛けるべきだな 今までそーいうものだと思い込ませて放置していたことなのですが、
引数を使うのにカッコつけなきゃいけないメソッドと、使わなくてもいい
メソッドって、なにが違うんでしょうか?なにか理由があるのでしょうか。
Dim a As Range: Set a = Cells.Find(What:="test")
ThisWorkbook.ActiveSheet.PrintOut copies:=1
それに付け加えて、findした結果をcolllectionに格納する際、
カッコをつけるとdouble型、つけないとrange型となりました。
検索結果を格納するcollection.Add 検索range
検索結果を格納するcollection.Add (検索range)
ご教授何卒宜しくお願いいたします。 >>867
オプションが開かれてるという意味でしたか。
なるほどですね。
呼吸レベルでキーコンビネーションで通り過ぎちゃうので、、しっかり見るべきだと。
>VBAもGUIで行った設定の影響を受けないような
ごもっともです。
普段は .Find系は滅多に使わないのですが、あるとき大被害にあって、、、
どちらかというとGUI操作のほうが悩ましかったので、、、
API制御の方法にも辿り着けて、各Controlの制御もわかりました。
一瞬表示されてしまうのが難点ですが。良い情報をいただきました。
ご助言感謝します。 >>868
とりあえず戻り値があるかないかの違いとでも思っとけばよい 12121212111211121112みたいな数列で、
1212..と続くものにはA、
11121112..と続くものにはBと置き換え、
AABBBのような文字列を作成することはできますか? その数列を文字列に直しておく
これをReplace関数で
1212 → AA
A12 → AA
に置換する
同様に 1112 についても行う vbaのエディタの話なのですが、皆様はコードの複数行を選択したいとき
ショートカットかなにか使っているのでしょうか?
たとえば、一部のコードが不要になって削除や切り取りしたいときに、
ちゃんと行頭から行末までしっかり選択しないとtabやスペースが残ってしまい、
その後コードがズレたり色々と不都合が生じています。
現在は、Homeで行頭、Shift+下矢印で選択しています。
マウスで左端をドラッグすれば選択できるのは知っていますが、これの
キーボードショートカットとかないんですかね・・・ >>876
web拝見しましたが、「複数選択→tabで行範囲が作成される」という部分
でしょうか?確かに、削除ならこれでいけそうです。
(コピーや切り取りのときにはtab→shift+tabで元通りにしなきゃならないかもですが)
私はずっとvbaを使わずエクセル本体の操作に慣れていたのですが、よく使っているのが
適当な複数のセル範囲を作成⇒それらをshift+spaceで行範囲化
という動作だったので、ここにいる方たちはvbaではどんな操作を
しているのか気になって質問いたしました。ありがとうございました。 >>878
すみません、何回webを読み返しても分かりません…
自分でショートカットを作れる(ユーザ設定のコマンド)という部分
かなとも思ったのですが… コメントアウトだけはctrl+/でデフォルトでできるようにアプデして欲しいわ。。
設定もボタンクリックもめんどい うーむ…どういじっても分からない…
Ctrl+Yは現在の行だけしか削除されないし、そもそも選択範囲は
作成されないし…
おっさんになった私の限界ですかね汗 >>884
やろうとしていることに何の意味がある? クラスに対してモジュールという概念がよくわかりません。Cで言うところ外部ヘッダファイルとソースみたいなものでしょうか。クラスを使ってたら基本的に出番がない? クラスはOOPに出てくるクラス
newする必要がないならモジュール モジュールはVBがオブジェクト指向になるまえからの互換のためだから
クラスを使うなら忘れてもいいよ
広域で静的なクラスだと思えばいい >>865
そのファイル名を使っても値が変数なしになってしまいます… >>863
それウォッチがちゃんと出ないだけで、ブックそのものはとれてるだろ
試しにやってみたが、myBookのウォッチで展開すると変数なしだが
myBook.Sheets(1).Range("A1").Activate でちゃんと動作するぞ 基本的にプログラミングがうまくなる人って、
早い段階で、特定のやり方にこだわらず最終的に要件を満たせればいいってことに気付けるんだよな それはプログラミングをするという前提を置いている時点で矛盾している
手段はなんでもいいから目的達成できりゃいい、だと、だいたいのことは出来合いのSaaSを契約して使うのが最良 仕事ならそうだよね
代わりにSaasでってのは範囲が違うので当てはまらないけど 普段の自分のやり方じゃ対応できない場面が出た時は、
変に拘らずに完成優先でやるべきって意味でしょ >>885
余計な操作が無くなることでかかる時間とストレスが減って、その分
新しい知識や技術を取り入れることに割ける、という意味があると思って
質問してみました。
>>878のちがうだろの結局何が違うのかは分かりませんでしたが…
まあ、ググレカスは昔からある2chの風習だと思いますが。 >>901
残念ながら設定でこれだけ躓いて立ち止まるような人は言ってるような時間の有効活用できるとは思えんな
ツールはツールと割り切ったり慣れたりする事ができないなら、今後時間の有効活用できるようにもなれないよ 頭のおかしい人の書き込みを読むのが無駄なので無視しますね >>896
そいつは違うな。
拘るのは必要だ。
最適なのに拘るの。
だから動いたで終わりにしないで他にもっと良い方法はないかを常に考える。
自分が知らなかった技術を手に入れた時に、これを使えば5年前のあの件はもっと上手く出来たかもと考える。 本気でやり方に拘ったらExcelなんて大半が無駄なわけで
自分達の仕事を守るためにも割り切りは必要 >>896
>>907
短期では手段にこだわらない方が早いが
長期では技術向上になるから両方必要だ そんな1つのVBAに何日もかけれんわ
時間かけれるならWebサービスとかAPIとかもっと皆が幸せな解決方法が大体あるわ VBAとか関係無く、プログラミング全般の話なんだけどね。
動きゃ良いとかいう奴はいつまで経っても出来るようにゃならんよ。 >>911
無い。
VBAが使われる所は殆どVBAじゃないとどうにもならんから使われてる。 Application.CentimetersToPoints(1)
で列幅1cmにしたいんですが、
何度やっても5.64cmになります。
Rows(n).RowHeight = Application.CentimetersToPoints(1)
はちゃんと行幅1cmになりました。
Columns(n).ColumnWidth = Application.CentimetersToPoints(1)
だと何故か列幅5.64cmになります。
この事についてどう検索しても誰も言及してないことも含めて謎が尽きません。
煮詰まり過ぎて焦げ付いてきたのでどなたかアドバイスお願いします。 あっまさか列と幅のポイントは同じポイントでも数値としては別物って聞いた気もする
そして行幅のポイントの方がVBAのポイントと合致しているという訳か
だとすると列幅のポイントに変換するのはどうしたらいいのか… >>913
列幅の単位は違う
列幅の設定の仕方も
「application.centi〜 列幅」
で検索すればサンプルがいくつか出てくるけどね >>917
ページレイアウトにして、列幅1cmをマクロ記録 >>914
瞬時に思い付くのに5年前のコードのこと修正するのかよw
5年間もずっとVBAばっかやって、しかもそんな昔のコード引きずってるのw >>921
あれ、分からんかった?
瞬時に5通り思いついたとして、5年後に知らない技術を獲得した時に、あの時これ使えばもっと良くなったなあと思うとか。
あるいは昔、どうしても解決出来なかった問題が解決出来たとか。
俺の場合はデフォルトのプリンター設定のポートを変更するプログラムが出来なくてね。
PRINTER_INFO_5構造体を使ってプリンターのプロパティ設定変更するのは出来てたけどポートはさらに先のポインタでその時は出来なかった。
もっとも、これ10年以上前の話だし、それで修正するとかいう話でもないけどな。 >>923
理解出来なくて悔しいからって、そうまでして絡みたいの? 効いてる事にして勝ったつもりになってるけど実は・・・ >>924
別に古臭いVBAおじさんに絡みたいとかないけどなw
その程度でどや顔して、こんなところで長文まで書いて哀れだなあってねw
・瞬時に5個思い付く(ドヤア)
・10年以上前の話(ドヤア)
・どうしても解決出来ない問題が解決できた(ドヤア)
いい年して恥ずかしいww 4月、5月、6月というシートを請求書という新しいブック名のシートに追加していきたい場合
請求書というブックがなかったら
請求書というブックを作成して○月のシートをコピー
既に請求書というブックがあったら
そのブック内に○月のシートをコピー
という考え方でいいですか?
というか可能ですか? 既にあるブックを変えて問題ないんならいいんじゃないの >>930
あ、恥ずかしくなってるwかわいーねーw 色々調べ直して列幅1cmできた! ありがとうございます。
それにしたって、なんと解りにくい…
CentimetersToColumnPointsみたいにしてくれればいいのに… >>931
自分の技術が足りないのがそんなに悔しいのかねw >>933
恥ずかしくて言えることないの草
黒歴史だねーww >>933
あ、>>928とか5通り早くコード付で答えてあげなよww
あと5年後まで改善策見つけたら書き込んでねw >>934
君が初心者に毛が生えたレベルなのは俺の責任じゃ無いんだ。
悔しいからって絡むのは辞めてくれw だいたい、バカにしようととしたら自分より上のレベルで悔しくても、それは自分が悪いんだろw array関数で要素を代入する際に、プロシージャ引数のヒントの様にカンマで区切ると何を入力すべきか表示させることは出来ないでしょうか。要素が多いので解りづらくて
戻り値ありの関数作るべきなのでしょうか >>938
入力に困るほど大量のデータをプログラム中に直接書くのは設計が悪いと思う
せめてワークシートに見出しを付けて並べたら? >>936
恥ずかしい書き込みするやつの言うことは違うなあw
10年以上前の話とか言っちゃうんだもんなあww
で、5年がなんだって?w >>940
だから絡むの辞めてくれ。
初心者のプライドが傷ついたのかよw >>941
>出来る奴は瞬時に何通りかは思いつく。
>もっとも、これ10年以上前の話だし、それで修正するとかいう話でもないけどな。
>瞬時に5通り思いついたとして、5年後に知らない技術を獲得した時に、あの時これ使えばもっと良くなったなあと思うとか。
ん?早く質問者に5通りコードで回答してあげなよ、プロVBAおじさんww >>943
その返しもバカっぽくね?
質問の内容とか考えた? >>943
>早く質問者に5通りコードで回答してあげなよ
日本語をちゃんと理解することができる? static変数の宣言と同時に初期値入れても、Cと違って毎回初期値が入るようなんですけが回避方法ってありますか >>945
ほらほらー、10年以上やってこの程度も5通り分からないの?ww
「出来る奴は瞬時に何通りかは思いつく。」
んだろwwほらほらww バッチを非同期で実行したいんだけどShellでやってもWSHShellでやっても
バッチの終了まで待たされるんだけど何故?
やってることはIEを操作してファイルをDLするところまでVBAでやって
それ以降の処理をバッチでやりたいんだけど… 非同期オプション付けても出来ないのですか?
不思議ですね レス数が950を超えています。1000を超えると書き込みができなくなります。