X



Excel VBA 質問スレ Part65
レス数が950を超えています。1000を超えると書き込みができなくなります。
0851デフォルトの名無しさん (ワッチョイ 2791-x7Cl)
垢版 |
2020/05/04(月) 14:14:20.30ID:r232eNWS0
>>841
卜グルボタンとかチェックボックスのようなオンオフするようなものを変数で管理しようとした時に、変数がTrueならFalseに設定し、FalseならTrueに設定する処理を書いている。

最初のIf文の方は英文が分かれば簡単に理解出来る。
Notを使う方はTrue/Falseだから変数を変数自身と反対にすることで実現してる。
0852デフォルトの名無しさん (ワッチョイ 7fdd-ts7H)
垢版 |
2020/05/04(月) 14:35:44.64ID:m3H0OQVZ0
検索Dialogの検索場所(WithIn)をVBAから切り替えるアイデアをお持ちの方いたら教えていただけないでしょうか。
全シートから検索するのが目的ではなく、ブック全体検索後に何気に範囲指定置換を実施して引き起こされる惨状を回避したく。
(または別視点による工夫でもOKです)
詳しい方、よろしくお願いします。
0853デフォルトの名無しさん (ワッチョイ 67ac-fZS3)
垢版 |
2020/05/04(月) 15:43:06.15ID:ESbXk+mE0
>>852
意味不明な点が多すぎる。
>ブック全体検索後に何気に範囲指定置換を実施して
 検索と置換ダイアログでは検索、置換は違うタブだから操作ミスは起きずらいが、
 そこまでしなきゃならないのか

>引き起こされる惨状を回避したく。
 惨状って具体的になにか

そもそも惨状とやらが起きるのは、GUIの話なのかVBAの話なのか
0854デフォルトの名無しさん (スップ Sd7f-C/EQ)
垢版 |
2020/05/04(月) 15:44:13.44ID:gO9XNStOd
今からVBAなんて覚える必要は全くない
0855デフォルトの名無しさん (ワッチョイ a7ad-ur4w)
垢版 |
2020/05/04(月) 18:17:24.80ID:mKy38ERH0
841です。
丁寧な解説、みなさんありがとうございました。
勉強になりました。
0856デフォルトの名無しさん (ワッチョイ 67f9-qVEi)
垢版 |
2020/05/04(月) 19:20:35.81ID:V2+TGFiQ0
>>855
アンカーも書けず全角で数字を書くよな馬鹿は死ね
0857デフォルトの名無しさん (ワッチョイ 7fdd-ts7H)
垢版 |
2020/05/04(月) 19:40:04.11ID:m3H0OQVZ0
>>853
説明が不足していました。

検索と置換のタブはパラメータ設定の記憶が共通となっております。
ブック全体検索を行った後に範囲を選択して範囲内置換を実施しようとCtrl+Hを押します。
すると前回検索時の "検索場所=ブック"が活きている状態になっております。
気づかずに実施すると全シートの指定文字列が置換されてデータが破壊されてしまいます。
コロン ":" でも削除置換しようものなら全ての時刻書式が破壊されます。
お試しください。

これを防ぐには、ブック内検索を実施した際は引き続きシート内検索を実施して設定を戻しておく必要があります。
普段ブック内検索ってあまり使わないのでこんな時に限って忘れてしまいます。
VBAはどうなっているかというと、.Find .Replace共に、WithInパラメータが存在しないため引数指定できず、直前のUI操作依存となるわけです。
自動化された置換処理があったりすると、事故が起こるわけです。

本件、GGってよく捜してみたら同様の悩みに対するQAありました。

 Range("A1").Find("*")

この1行を実施するだけで検索場所をシートに戻せるようです。
逆に検索場所をブックにする方法を探しているところです。

ご存じの方おられましたら教えてください。
0858デフォルトの名無しさん (ワッチョイ 6741-eET6)
垢版 |
2020/05/04(月) 20:21:19.69ID:2XIJsT+F0
.OpenTextで開いたテキストファイルを操作したいのですがやり方がわからなくて困っています。
拡張子CSVなら通常のエクセルワークシートと同様に扱えますが、テキストファイルは無理なのでしょうか?
Workbooks.Countは開いたテキストファイルの分増えているようですが…
ご教示お願いいたします。
0860デフォルトの名無しさん (ワッチョイ 87e6-aR2J)
垢版 |
2020/05/04(月) 20:40:40.91ID:c199Arvf0
1セルに1文字づつならExcelチックに楽しめそうだな

知らんけど
0861デフォルトの名無しさん (ワッチョイ a78e-MvRk)
垢版 |
2020/05/04(月) 20:56:39.11ID:oqIKeiQj0
次から次へと馬鹿が来る
0862853 (ワッチョイ 67ac-ts7H)
垢版 |
2020/05/04(月) 21:05:25.33ID:ESbXk+mE0
>>857
まず、問題としてる事象は提示している方法で解決するんだよね
そのブック開いたときとか操作したときに実行すればいい

>「ブック全体検索を行った後」に「範囲を選択」して「範囲内置換を実施」(ブック全体と指定しているオプションを開いたまま)
 → その悪意に満ちた行為のみを想定するの?
   検索ダイアログのオプション設定は起動中のExcelアプリ(プロセス)に記憶されるから、
   Excelアプリを開いたまま同じPCで同様の操作をしないと再現しないはず

>気づかずに実施すると全シートの指定文字列が置換されてデータが破壊されてしまいます。
 → さっきの操作をすると検索オプションは開いてるはずだけど、
   それでも気付かずファイル保存するっていう悪意ry
   GUI操作->GUI操作で出る問題なら、運用で禁止するか保護するか、影響に基づいて運用システム自体を見直す

>逆に検索場所をブックにする方法を探しているところです。
 → 問題としてる事象の解決は自分で提示しているようだけど、
   逆に引き起こしたいってことは、単にやりたいから?
   VBAで置換するなら別に全シートをReplace擦ればいいだけだし
   GUIでブックにしたいならそう操作すればいいけど、何が必要なの

検索と置換ダイアログの操作はCommandBars.dialogsとかExecuteMsoとかで表示は出来る
ウィンドウ操作にしても他のダイアログ操作と似たようなもんだろう(APIが多分必要)

GUIとVBAをごっちゃに対応するから要らない悩みを抱える
運用やコストを考えない妄想の機能なら、それこそ趣味でアドインでも作ればいい
0863デフォルトの名無しさん (ワッチョイ 6741-eET6)
垢版 |
2020/05/04(月) 21:24:09.39ID:2XIJsT+F0
説明足らずで申し訳ありません。
カンマ区切りのテキストファイルに対してOpenTextを使います。これでカンマごとにセルに値が分けらたエクセルブックが開きます。
このブックのシートを通常のエクセルシートと同様に、例えばRange("A1").Activateとしたいのですが、ブックをどうやって指定すればいいのでしょうか?

以下の方法を試しましたがうまくいきません。
元々開いているブックが一つのとき、テキストファイルはWorkbooks.CountWorkbook=2として開かれることを確認。このときWorkbooks(2)をVariant型の変数に代入しようとしました。

Set myBook = Workbooks(2)

ウォッチ式でmyBookの値を確認すると
型 Variant/Object
値 <変数なし>
となり値が取得できません。

テキストファイルの拡張子をCSVに変更すると問題なく値が取得できます。

すみませんがよろしくお願いいたします。
0864デフォルトの名無しさん (ワッチョイ 7fdd-ts7H)
垢版 |
2020/05/04(月) 21:39:32.81ID:m3H0OQVZ0
>>862
ご回答ありがとうございます。

>オプションを開いたまま
これの意味がわからないですが、ダイアログを開いたままという意味なら、閉じても記憶は維持します。
全体検索実施と範囲選択実施は一連の動作じゃないです。
例えば複数のファイルを開いて作業していて、全体検索を実施したファイルは既に1時間前に閉じていたとしても設定は維持されます。
これを悪意と言われましても、、
まあ、この点は前述のコードをシートイベント等に挟むことで防げそうです。
(設置Bookに限られるかな?まあ、良い方法を考えてみます)

>それでも気づかずに
キーボード主体でマウスはほぼ使わない派なので、範囲選択→ダイアログ開く→検索語、置換語入力→Enterの動作は
一連の操作で、ガッ、ガガガッで感じでやっちゃうのでダイアログのパラメータいちいち確認しないんですよね。
ちょっと落ち着けよって話なんでしょうけど。

>問題としている事象の解決は自分で提示しているようだけど、
最初に掲げた命題が "VBAで検索場所(WithIn)を切り替えたい" だったので逆の操作もできれば知りたいという程度です。
破壊リスクは回避できそうですが、例えば範囲が”シート"の状態からVBAで"ブック"に変更して全置換も可能なのかな、という疑問です。
結論としては通常の方法では出来なそうですね。
Worksheets.Select: Cells.Select を実行すれば、シートをForで回さなくても
 Selection.Replace できることもわかりましたのでこれで解決としたいと思います。

>GUIとVBAをごっちゃに対応するから要らない悩みを抱える
GUIの設定がVBA操作にも影響を与えてしまうから制御できないかなと思った次第です。

お付き合いいただきありがとうございます。
0866デフォルトの名無しさん (ワッチョイ a764-7mTq)
垢版 |
2020/05/04(月) 22:13:52.11ID:HiZbEqQh0
特に目的があるわけではないけど、興味があってVBAを勉強しようと思ってます。
皆さんどんな勉強法しましたか?おすすめの本とか有りましたら知りたいです
0867853 (ワッチョイ 67ac-ts7H)
垢版 |
2020/05/04(月) 22:16:36.67ID:ESbXk+mE0
>>864
まあ終わってるからいいけど・・

>>オプションを開いたまま
>これの意味がわからないですが、ダイアログを開いたままという意味なら、閉じても記憶は維持します。
 →これは、「検索と置換」ダイアログの
  「検索場所」ドロップダウンはGUIだと「オプション>>」ボタンで開かれる拡張エリアにのみ表示されて、
  「ブック全体を選択した」=「オプションを展開表示している」から、GUIなら気付かないわけがない。
  ということ。
  ダイアログ内の設定値同様、オプション展開状況もExcelプロセスで共有してるから、
  他のファイルで展開してるなら違うブックでも展開されたままダイアログ表示される。

>GUIの設定がVBA操作にも影響を与えてしまうから制御できないかなと思った次第です。
  VBAもGUIで行った設定の影響を受けないような、Rangeを指定する記述を普通は心掛けるべきだな
0868デフォルトの名無しさん (ワッチョイ e709-ur4w)
垢版 |
2020/05/04(月) 23:21:11.46ID:igVQrW+K0
今までそーいうものだと思い込ませて放置していたことなのですが、
引数を使うのにカッコつけなきゃいけないメソッドと、使わなくてもいい
メソッドって、なにが違うんでしょうか?なにか理由があるのでしょうか。

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)

ご教授何卒宜しくお願いいたします。
0869デフォルトの名無しさん (ワッチョイ 7fdd-ts7H)
垢版 |
2020/05/04(月) 23:58:21.23ID:m3H0OQVZ0
>>867
オプションが開かれてるという意味でしたか。
なるほどですね。
呼吸レベルでキーコンビネーションで通り過ぎちゃうので、、しっかり見るべきだと。

>VBAもGUIで行った設定の影響を受けないような
ごもっともです。

普段は .Find系は滅多に使わないのですが、あるとき大被害にあって、、、
どちらかというとGUI操作のほうが悩ましかったので、、、

API制御の方法にも辿り着けて、各Controlの制御もわかりました。
一瞬表示されてしまうのが難点ですが。良い情報をいただきました。

ご助言感謝します。
0874デフォルトの名無しさん (ワッチョイ e709-ur4w)
垢版 |
2020/05/05(火) 21:19:05.44ID:lsW1yIjx0
vbaのエディタの話なのですが、皆様はコードの複数行を選択したいとき
ショートカットかなにか使っているのでしょうか?
たとえば、一部のコードが不要になって削除や切り取りしたいときに、
ちゃんと行頭から行末までしっかり選択しないとtabやスペースが残ってしまい、
その後コードがズレたり色々と不都合が生じています。
現在は、Homeで行頭、Shift+下矢印で選択しています。
マウスで左端をドラッグすれば選択できるのは知っていますが、これの
キーボードショートカットとかないんですかね・・・
0877デフォルトの名無しさん (ワッチョイ e709-ur4w)
垢版 |
2020/05/05(火) 22:03:15.71ID:lsW1yIjx0
>>876
web拝見しましたが、「複数選択→tabで行範囲が作成される」という部分
でしょうか?確かに、削除ならこれでいけそうです。
(コピーや切り取りのときにはtab→shift+tabで元通りにしなきゃならないかもですが)
私はずっとvbaを使わずエクセル本体の操作に慣れていたのですが、よく使っているのが
適当な複数のセル範囲を作成⇒それらをshift+spaceで行範囲化
という動作だったので、ここにいる方たちはvbaではどんな操作を
しているのか気になって質問いたしました。ありがとうございました。
0879デフォルトの名無しさん (ブーイモ MM2b-trzR)
垢版 |
2020/05/05(火) 22:11:42.93ID:NpEa/agLM
このハゲー
0881デフォルトの名無しさん (ワッチョイ 738e-jYUs)
垢版 |
2020/05/06(水) 00:51:48.50ID:Kd1uYxyM0
>>880
馬鹿は死ね
0888デフォルトの名無しさん (ブーイモ MMd6-sgQa)
垢版 |
2020/05/06(水) 12:16:06.30ID:j2svN8neM
クラスに対してモジュールという概念がよくわかりません。Cで言うところ外部ヘッダファイルとソースみたいなものでしょうか。クラスを使ってたら基本的に出番がない?
0893デフォルトの名無しさん (ワッチョイ 662f-jW3u)
垢版 |
2020/05/06(水) 16:43:25.70ID:OIN1lY2H0
>>863
それウォッチがちゃんと出ないだけで、ブックそのものはとれてるだろ
試しにやってみたが、myBookのウォッチで展開すると変数なしだが
myBook.Sheets(1).Range("A1").Activate でちゃんと動作するぞ
0898デフォルトの名無しさん (アウアウウー Sa1f-lvFW)
垢版 |
2020/05/06(水) 19:37:46.56ID:aLD+Grz6a
それはプログラミングをするという前提を置いている時点で矛盾している
手段はなんでもいいから目的達成できりゃいい、だと、だいたいのことは出来合いのSaaSを契約して使うのが最良
0901デフォルトの名無しさん (ワッチョイ 5b09-jgrQ)
垢版 |
2020/05/06(水) 20:48:48.08ID:p05hHIhJ0
>>885
余計な操作が無くなることでかかる時間とストレスが減って、その分
新しい知識や技術を取り入れることに割ける、という意味があると思って
質問してみました。
>>878のちがうだろの結局何が違うのかは分かりませんでしたが…
まあ、ググレカスは昔からある2chの風習だと思いますが。
0902デフォルトの名無しさん (ワッチョイ 8f63-07dd)
垢版 |
2020/05/06(水) 22:29:01.29ID:k50qIlTz0
>>901
残念ながら設定でこれだけ躓いて立ち止まるような人は言ってるような時間の有効活用できるとは思えんな
ツールはツールと割り切ったり慣れたりする事ができないなら、今後時間の有効活用できるようにもなれないよ
0903デフォルトの名無しさん (ワッチョイ 738e-jYUs)
垢版 |
2020/05/06(水) 22:34:53.59ID:Kd1uYxyM0
>>901
馬鹿は死ね
0907デフォルトの名無しさん (ワッチョイ 6391-ABif)
垢版 |
2020/05/07(木) 13:12:49.35ID:MibsCGor0
>>896
そいつは違うな。
拘るのは必要だ。

最適なのに拘るの。
だから動いたで終わりにしないで他にもっと良い方法はないかを常に考える。

自分が知らなかった技術を手に入れた時に、これを使えば5年前のあの件はもっと上手く出来たかもと考える。
0915デフォルトの名無しさん (ラクッペペ MMe6-r6hg)
垢版 |
2020/05/07(木) 17:29:14.38ID:OBEeDnS1M
無知の知
0916デフォルトの名無しさん (ワッチョイ 33ad-D+XR)
垢版 |
2020/05/07(木) 17:50:13.55ID:oG7+JCgx0
Application.CentimetersToPoints(1)
で列幅1cmにしたいんですが、
何度やっても5.64cmになります。

Rows(n).RowHeight = Application.CentimetersToPoints(1)
はちゃんと行幅1cmになりました。
Columns(n).ColumnWidth = Application.CentimetersToPoints(1)
だと何故か列幅5.64cmになります。
この事についてどう検索しても誰も言及してないことも含めて謎が尽きません。
煮詰まり過ぎて焦げ付いてきたのでどなたかアドバイスお願いします。
0917デフォルトの名無しさん (ワッチョイ 33ad-D+XR)
垢版 |
2020/05/07(木) 17:58:41.98ID:oG7+JCgx0
あっまさか列と幅のポイントは同じポイントでも数値としては別物って聞いた気もする
そして行幅のポイントの方がVBAのポイントと合致しているという訳か
だとすると列幅のポイントに変換するのはどうしたらいいのか…
0922デフォルトの名無しさん (スプッッ Sd2a-ABif)
垢版 |
2020/05/07(木) 19:06:33.04ID:IeUYmiVSd
>>921
あれ、分からんかった?
瞬時に5通り思いついたとして、5年後に知らない技術を獲得した時に、あの時これ使えばもっと良くなったなあと思うとか。
あるいは昔、どうしても解決出来なかった問題が解決出来たとか。

俺の場合はデフォルトのプリンター設定のポートを変更するプログラムが出来なくてね。
PRINTER_INFO_5構造体を使ってプリンターのプロパティ設定変更するのは出来てたけどポートはさらに先のポインタでその時は出来なかった。

もっとも、これ10年以上前の話だし、それで修正するとかいう話でもないけどな。
0926デフォルトの名無しさん (ワッチョイ 6bac-V20a)
垢版 |
2020/05/07(木) 21:20:02.04ID:k5uIH00p0
>>924
別に古臭いVBAおじさんに絡みたいとかないけどなw
その程度でどや顔して、こんなところで長文まで書いて哀れだなあってねw

・瞬時に5個思い付く(ドヤア)
・10年以上前の話(ドヤア)
・どうしても解決出来ない問題が解決できた(ドヤア)

いい年して恥ずかしいww
0928デフォルトの名無しさん (ワッチョイ 6ab5-OuYa)
垢版 |
2020/05/07(木) 21:29:03.52ID:vCXp7vkf0
4月、5月、6月というシートを請求書という新しいブック名のシートに追加していきたい場合

請求書というブックがなかったら
請求書というブックを作成して○月のシートをコピー
既に請求書というブックがあったら
そのブック内に○月のシートをコピー

という考え方でいいですか?
というか可能ですか?
0938デフォルトの名無しさん (ワッチョイ 7f7f-sgQa)
垢版 |
2020/05/07(木) 23:08:01.99ID:ATN3rOjQ0
array関数で要素を代入する際に、プロシージャ引数のヒントの様にカンマで区切ると何を入力すべきか表示させることは出来ないでしょうか。要素が多いので解りづらくて
戻り値ありの関数作るべきなのでしょうか
0943デフォルトの名無しさん (ワッチョイ 6bac-V20a)
垢版 |
2020/05/08(金) 09:39:57.65ID:NrG+fdAu0
>>941

>出来る奴は瞬時に何通りかは思いつく。

>もっとも、これ10年以上前の話だし、それで修正するとかいう話でもないけどな。

>瞬時に5通り思いついたとして、5年後に知らない技術を獲得した時に、あの時これ使えばもっと良くなったなあと思うとか。

ん?早く質問者に5通りコードで回答してあげなよ、プロVBAおじさんww
0949デフォルトの名無しさん (アウアウウー Sa1f-Y/5H)
垢版 |
2020/05/08(金) 18:51:21.09ID:F9AE4+4ta
バッチを非同期で実行したいんだけどShellでやってもWSHShellでやっても
バッチの終了まで待たされるんだけど何故?

やってることはIEを操作してファイルをDLするところまでVBAでやって
それ以降の処理をバッチでやりたいんだけど…
0950デフォルトの名無しさん (ワッチョイ cfe6-r6hg)
垢版 |
2020/05/08(金) 19:02:53.06ID:XNwDJZFz0
非同期オプション付けても出来ないのですか?
不思議ですね
レス数が950を超えています。1000を超えると書き込みができなくなります。

ニューススポーツなんでも実況