Excel VBA 質問スレ Part73
■ このスレッドは過去ログ倉庫に格納されています
!extend:checked:vvvvv:1000:512 !extend:checked:vvvvv:1000:512 ↑同じ内容を2行貼り付けるナリ ExcelのVBAに関する質問スレナリ コード書き込みや作成依頼もOKナリ ※前スレ Excel VBA 質問スレ Part70 https://mevius.5ch.net/test/read.cgi/tech/1616072923/ Excel VBA 質問スレ Part71 https://mevius.5ch.net/test/read.cgi/tech/1621914481/ VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured モジュールとボタンを別のブックにコピーしたくてできたと思ったんだけど ボタンに登録されるマクロがコピー元のマクロになっちゃってとうすりゃええのか分からん .OnAction=Thisbook&”マクロ名”とかじゃ動かないのね ボタンをインポート? これも楽な方法があったらいいのにね シート上のフォームコントロールを消す時って ・右クリックで選択 ・コンテキストメニューをESCで消す ・切り取り、もしくは「deleteキー」 で合ってますか? 選択する時はF5キーのオブジェクトでもいいんですけど、 どちらにしろ右クリックで選択というのが何か気持ち悪い >>101 sheetモジュールのマクロ? それとも標準モジュールのマクロ? どちらによるかでやり方が変わる Ctrl+クリック Delete でいいんじゃない >>107 短縮できました、ありがとうございました private subのどのプロシージャーからでも、グローバル変数に入った値を取り出す方法として、 たとえばenvという標準モジュールを作り、そのなかで public dim grobal_a as string sub hoge global_a = "aaaa" end sub とやっておき、 エクセルのブック起動と同時にこの初期値を入れておきたいので thisWorkbookにcall hoge ってやるの、普通? >>110 シートに標準モジュールのやつを呼び出すSubを書いて、それをボタンから呼び出せばいい >>109 普通は grobal_a と global_a の二つを一つにまとめると思う >>109 vbaってグローバル変数の初期化できないのか・・・ 見たことはない。変な気はする とりあえずはシートに書くほうが楽だと思う constでいいなら初期化が出来る。社名みたいにほぼ絶対変わらない物ならこれでもいいかも Public Const 定数 = 1 sub foo debug.print 定数 end sub >>113 わらった >>109 普通か普通ではないか、と言われれば普通ではないかなぁ。 ではどこが、と言われるとまずモジュール変数をグローバル指定しているところはPrivateにして外部から呼び出す用のプロパティに組み込む。これでどこかで値が変更されてもブレイクポイント仕掛けてどこで呼び出されて値が変更されたかを確認出来るようになる。 あと、初期化用の関数はPublic指定にしておかないと別のモジュールから呼び出せないよ。ThisWorkbookから呼び出すんでしょ? 普通じゃなかったのか…俺もそうしてた >>116 勉強になります 書籍「イヤンもう!最初からそう教えてくれればいいのに!ExcelVBAのプログラミングのツボとコツがゼッタイにわかる本」の評判はどうですか?買うか検討中なのですが。 >>120 ゼッタイにわかる本系の口語調文章に抵抗がないラノベ好きには良いんじゃない? >>120 ゼッタイにわかる本系の口語調文章に抵抗がない人には良いんじゃない? >>120 人それぞれ印象が違うから、参考書は最初の2、3ページ立ち読みして自分で決めるのがいいよ イヤンもう って言うから検索したら特にそんな単語ついてないじゃないですか 若い子が水着姿で教えるVBAの本なら簡単に死ぬほど売れるのでは?と思った VBAとか作業記録してそれループするなり可変したりするなりちょっと直せば誰でも作れるからな 「はたらくプログラミング 」 「高校生からはじめる プログラミング」 「メイクロックマン 史上最大のプログラミング」 「独学プログラマー Python言語の基本から仕事のやり方まで」 のようなアニメやゲームキャラやイケメンを 採用して若い子にアピールするとか 「乙女チック4Gamer」第267回: 「推しと学べるプログラミング」 初心者も学べるプログラミング学習ゲーム とか 美少女×プログラミング学習×ソーシャルゲーム『コードガールこれくしょん』 とかゲームで呼び込み 恋のプログラミング~ダメ男の見分け方~ DVD-BOX2 のようなDVDを付録に付けてみたりとか とかとにかくVBAもなんとか頑張って欲しい オレも1冊3000円くらいのVBAの本買ったわ その本をキーボードの下奥に置くと角度が良い感じになるんだわ 手首が疲れないし、職場でもなんか「やってる」感がかもし出せるし、本当に買って良かったと思える1冊だったな >>132 ん。 昔、EXCELVBAゲーム大作戦とかいう本が出てたよ。まぁVBAも昔からあるからゲーム作るのも先駆者がいたんだね。 けど、結局難しいというか、お仕事で覚えることとベクトルが違うんだよ。1/60秒単位で押されているキーの値読み取って、キャラクターや地形描いてその当たり判定行なったりね。 まぁ暇でそういうの作ってみたいというのにはいいかもだけど、お仕事でVBA使うのの興味を持つために、というのにはちょっと重いかもね。 >>133 分かりすぎる 分厚い本って意外と重宝するよなw vbaでゲームは基本的にかなりめんどくさい メインのループ処理がキツイ 定期的に処理をエクセルに返してあげないと色々と不具合が起きる 曲芸でなければvbaで作るのは絶対に避けたほうが良い 2つあるフレームの位置を調整していたら、 フレームAをフレームBの中にドラッグしてしまったらしく、 2つのフレームが一緒になってしまいました。 プロパティウィンドウを見ると、フレームAはまだ存在するのですが、 画面上にはフレームBしか表示されていないため、Aを選択することができず、 AをBから分離することができません。 AのLeftやTopを変更してみましたが、画面上に変化はありませんでした。 何かいい解決法があれば教えてください。 自己解決しました。 @プロパティウィンドウでプルダウンからフレームAを選択する。 ACtrl+[A]で全選択した後、Ctrl+[X]で切り取り状態にする。 BフレームBのエリア外にマウスカーソルを持っていき、Ctrl+[V]で貼り付ける。 せっかく解決策書いてくれてるのにイチャモンつけるバカって何を考えてるんだろ… 配列からグラフを書いたときってデータ数の上限はありますか? その場合どのように対処すれば良いですか? >>145 上限を気にするようなデータ数だったら excelでは重くて動かないと思う 別の言語で書いた方がいい >>145 その場合はデータをコンパクトにまとめるしかなくね >>145 数千個程度は描けたような記憶がある そもそもそのレベルだと個々の値は見えないから複数個まとめて平均取るとかしてデータ量を減らせばいいかと >>145 セルに適当なデータいれてグラフ作ったら 9万9千9百+α までしか表示されなかった メモリの問題かもしれん ごめんなさい セルからではなく配列から直接グラフを読み込むときの話です。 自分の場合配列から散布図書いてて データ数が15000?あたりから表示されなくなったので VBAで、リボンを常に表示させるてことできるんですか? ググると Application.ExecuteExcel4Macro "SHOW.TOOLBAR(""Ribbon"", True)" ていうのが出てくるんですが、 ”タブとコマンドの表示”ていう状態にしたい。 If Application.CommandBars.GetPressedMso("MinimizeRibbon") = True Then Application.CommandBars.ExecuteMso "MinimizeRibbon" End If >>155 おおサンクスww できた。 なんでリボンの表示・非表示の記事書いてるやつはここまで書かないのかね。 しっかりと自分で考える事が大事!向上心をもって勉強しよう! ひろゆきのクラスモジュールの説明は的確で分かりやすかった このスレにはクラスとかオブジェクト指向とかいうと、ファビョって「マウント取りに来たー!!」とか騒ぐじじいがいるから気をつけた方がいいぞ 5chはじじいの巣窟ですよ。 子供は他所で遊んだ方が良いですよ。 エクセル詳しい方にご質問。 保護シートの「オートフィルター使用」にチェックつけてる状態で、 Range(Cells(1,1),Cells(1,5)).AutoFilterを実行すると保護解除しろと言われるのですが、原因わかりますか? Rangeで指定しているセル範囲の保護を外しても言われる始末。 オートフィルターの使用を許可すりゃ通るもんだと思ってました。 見えない仕組みとか、基本的な仕様を見逃してるんかなぁ… とあるフォルダへのショートカットを作成する方法を調べたところ、 コーディング前に、 >参照設定は、VBA画面→ツールメニュー→参照設定で「Windows Script Host Object Model」を選択します。 >これでWshShellクラスとWshShortcutクラスを利用できるようになります。 という記述がありました。 それで作れそうですが、 作った.xlsmファイルを他人に渡した場合、 その相手が上記の参照設定をしていない環境だったとしても、ショートカットの作成は行えますか? >>165 ご回答頂きありがとうございます。 こういう基本的な説明くらい最初から見とけって話でしたね。 しかし、シートの保護とAutoFilterを両立できないとは、痒いところに手が届かない仕様ですな。 >>167 オートフィルターON/OFFと同時にシートの保護/解除も書いてしまえばいいんでないの? >>166 自己解決しました。 参照設定を変更しなくてもショートカットの作成は可能でした。 そちらの方法にします。 https://excel-ubara.com/excelvba4/EXCEL293.html ちなみに、 @参照設定で「Windows Script Host Object Model」をONにする。 AWshShellクラスとWshShortcutクラスを利用してコーディングする。 Bプログラムを実行する。 Cショートカットの作成に成功する。 D参照設定で「Windows Script Host Object Model」をOFFにする。 Eプログラムを実行する。 Fショートカットの作成に失敗する。(Aの中の定義について「ユーザ定義型は定義されていません」のエラー) となったので、 >>166 については、相手にも参照設定をしてもらわないとショートカットの作成は行えない、ということだと思います。 >>168 確かに、仰る通りですね。 保護は事前に設定しておくものと勝手に思い込んでいました。 一番良い形で解決できそうです。ありがとうございます。 >>170 参照設定した内容はそのエクセルファイルに保存されてる エクセルファイルを渡した先でその参照設定がちゃんと動くなら動く 二次元配列の第三カラムが重複していたらレコードまるごと排除して、かつ排除された分のレコードを別シートに転記することってできます? 連想配列に入れておけば重複してたらわかるようになるけど、そういう方法ってまとも? できるかどうかではなく、そういう処理を作りたいんじゃないの? そういう方法で重複チェックをしたことはあるけど それがまともかと聞かれるとわからんなぁ 配列は要素数が増減するものには向いてない が、まあいろいろ頑張ればできる 連想配列でわかるのは、入れようとしたときに重複するかどうかで、そもそも重複したものは入っていないだろ >配列は要素数が増減するものには向いてない 「vbaの」配列な 他の言語にはpushとか色々便利なものがあるんやで Excelにはセルっていう使いやすい2次元配列があるからな 速度はご愛嬌 >>179 > 他の言語にはpushとか色々便利なものがあるんやで スクリプト言語とかだろそれ 言語自体の機能として配列のサイズを変えられる言語はそんなに多くないよ そもそもVBAはその多くない言語に含まれるし 無いものねだりしてもしょうがない そもそも他言語やっててVBAやった場合 ない機能をどうやって実装するか考えるのが 醍醐味なんだから >>182 実はVBAは「配列」のサイズを変えれる数少ない言語 まあ多分全コピー発生してるんだろうけど コレクション系が弱いからそれぐらいできんとかなりツラい 今なら.NETの使うとか出来るけど >>184 > コレクション系が弱いからそれぐらいできんとかなりツラい どこが弱いの? 今の時代、メモリなんてたくさん確保しておけばよくね 「たくさん」と言ったってワークステーションやサーバ系のハードウェアでない限りせいぜい64GBか128GBが上限では? VBA(Excel)にそんなメモリ使わせたらヒヤヒヤしちゃう long配列の下位16ビットにデータ格納されている long[0],[1]の下位16ビットを結合するとsingleの値となる (要はsingleが16ビット分割されてlong型に格納されている) こんなデータが大量に格納されるんですが、上手く結合して型変換する方法がわかりません。。 val("&H" & hex(long(1)) & hex(long(0))) で32ビット結合はできましたが、その後の暗黙的な変換なしでsingleに変更するにはどうするのが良いでしょうか? リアルタイムにやる必要が無いならバイナリでファイルに書いて Singleで読むとか出来そうな気がする。 同じ考え方でADODB.stremも使えそう。 >>191 禁じ手だけどユーザー定義型とLSetで変数の中身を型変換せずに直接コピーできる LongをSingleにコピーする例 Type TypeLong varLong As Long End Type Type TypeSingle varSingle As Single End Type Sub Long2Single() Dim myLong As TypeLong Dim mySingle As TypeSingle LSet mySingle = myLong End Sub >>191 ん? 今一つよく分からんけど、CSng使って明示的に変換すればいいんじゃないの? Sub Convert() Dim originalValue(1) As Long Dim convertSingle As Single originalValue(0) = 1 originalValue(1) = 3 convertSingle = CSng(CDbl(originalValue(0) And 65535)) * 65536 + (originalValue(1) And 65535) Debug.Print convertSingle End Sub こんな感じに。 オーバーフローして表示しきれなくなった分は知らんけど。 おっと、すまんこ 括弧の位置間違えてた Option Explicit Sub Convert() Dim originalValue(1) As Long Dim convertSingle As Single originalValue(0) = 7 originalValue(1) = 15 convertSingle = CSng(CDbl(originalValue(0) And 65535) * 65536 + (originalValue(1) And 65535)) Debug.Print convertSingle End Sub こうかな。 因みにビット扱っているなら説明すると失礼に当たるかもだけど、 65535は16進で&HFFFF、65536は16進で&H10000ね。 ANDは論理演算子ではなくてビット演算子。 >>191 SingleもLongも32ビット長なんだが、Singleの内部形式が分割されて二つのLongに16ビットずつ格納されているのか? なんでそんなことになってるんだよ。Integer二つでいいじゃないか 考え方としては>>193 さんの言う通りLSetでできる 二つのLongから有効な32ビット抜き出すのが手間だけど Singleの内部形式はIEEE 754のはずだから、自分でビット演算してもできるだろうけど とりあえず作ってみた エンディアンの呪いがかかってても知らんw Type TypeQByte varByte1 As Byte varByte2 As Byte varByte3 As Byte varByte4 As Byte End Type Type TypeLong varLong As Long End Type Type TypeSingle varSingle As Single End Type Function WLong2Single(ByVal long1 As Long, ByVal long2 As Long) As Single Dim myLong1 As TypeLong Dim myLong2 As TypeLong Dim myQByte As TypeQByte Dim tmpQByte As TypeQByte Dim mySingle As TypeSingle myLong1.varLong = long1 myLong2.varLong = long2 LSet tmpQByte = myLong1 myQByte.varByte1 = tmpQByte.varByte3 myQByte.varByte2 = tmpQByte.varByte4 LSet tmpQByte = myLong2 myQByte.varByte3 = tmpQByte.varByte3 myQByte.varByte4 = tmpQByte.varByte4 LSet mySingle = myQByte WLong2Single = mySingle.varSingle End Function VBAには共用体もポインタもないから、 LSetでメモリの内容をコピー バイナリファイル経由 IEEEの内部フォーマットに合わせてゴリゴリ計算 ぐらいしか思い付かん この中ではLsetが一番シンプルだし高速 上位、下位の順番が分からんから適当に書くけど、基本的にはこんな感じ MyLong = Long0 * &h10000 + Long1 Lset MySingle = MyLong C#とか使えばもっと簡単にできるんで、そもそもこの作業はVBAに向いてない >>198 それ符号ビットの問題があるぞ VBAには論理シフトとかないからな バイナリファイルにするにしても、Longの不要な16ビット捨てる方法考えんといかん ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.4 2024/05/19 Walang Kapalit ★ | Donguri System Team 5ちゃんねる