X



Excel VBA 質問スレ Part73
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん (ワッチョイ 4668-xJJl)
垢版 |
2021/09/13(月) 07:29:59.47ID:GNx0xRRz0
!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
0101デフォルトの名無しさん (オッペケ Srcb-KXEG)
垢版 |
2021/09/20(月) 18:05:45.62ID:Mz1RekPdr
モジュールとボタンを別のブックにコピーしたくてできたと思ったんだけど
ボタンに登録されるマクロがコピー元のマクロになっちゃってとうすりゃええのか分からん
.OnAction=Thisbook&”マクロ名”とかじゃ動かないのね
0104デフォルトの名無しさん (ワッチョイ bf8c-xsW+)
垢版 |
2021/09/20(月) 21:44:55.52ID:djFT0hLf0
ボタンをインポート?
これも楽な方法があったらいいのにね
0105デフォルトの名無しさん (ワッチョイ bf68-I2En)
垢版 |
2021/09/20(月) 21:51:19.19ID:lHEjG93V0
シート上のフォームコントロールを消す時って
・右クリックで選択
・コンテキストメニューをESCで消す
・切り取り、もしくは「deleteキー」
で合ってますか?

選択する時はF5キーのオブジェクトでもいいんですけど、
どちらにしろ右クリックで選択というのが何か気持ち悪い
0106デフォルトの名無しさん (ワッチョイ bf68-I2En)
垢版 |
2021/09/20(月) 21:58:02.93ID:lHEjG93V0
>>101
sheetモジュールのマクロ?
それとも標準モジュールのマクロ?

どちらによるかでやり方が変わる
0107デフォルトの名無しさん (ワッチョイ bf8c-xsW+)
垢版 |
2021/09/20(月) 21:58:44.81ID:djFT0hLf0
Ctrl+クリック
Delete
でいいんじゃない
0108デフォルトの名無しさん (ワッチョイ bf68-I2En)
垢版 |
2021/09/20(月) 22:10:20.73ID:lHEjG93V0
>>107
短縮できました、ありがとうございました
0109デフォルトの名無しさん (アウアウアー Sa4f-1CsF)
垢版 |
2021/09/21(火) 16:59:19.72ID:6V+SG26ea
private subのどのプロシージャーからでも、グローバル変数に入った値を取り出す方法として、

たとえばenvという標準モジュールを作り、そのなかで

public dim grobal_a as string

sub hoge
global_a = "aaaa"
end sub


とやっておき、

エクセルのブック起動と同時にこの初期値を入れておきたいので
thisWorkbookにcall hoge

ってやるの、普通?
0115デフォルトの名無しさん (ワッチョイ bf68-I2En)
垢版 |
2021/09/21(火) 21:29:23.86ID:pV6hI0Vx0
>>109
vbaってグローバル変数の初期化できないのか・・・
見たことはない。変な気はする
とりあえずはシートに書くほうが楽だと思う
constでいいなら初期化が出来る。社名みたいにほぼ絶対変わらない物ならこれでもいいかも

Public Const 定数 = 1
sub foo
debug.print 定数
end sub

>>113
わらった
0116デフォルトの名無しさん (ワッチョイ 9f4f-CwtL)
垢版 |
2021/09/22(水) 07:59:00.83ID:ucS/NBRX0
>>109
普通か普通ではないか、と言われれば普通ではないかなぁ。
ではどこが、と言われるとまずモジュール変数をグローバル指定しているところはPrivateにして外部から呼び出す用のプロパティに組み込む。これでどこかで値が変更されてもブレイクポイント仕掛けてどこで呼び出されて値が変更されたかを確認出来るようになる。

あと、初期化用の関数はPublic指定にしておかないと別のモジュールから呼び出せないよ。ThisWorkbookから呼び出すんでしょ?
0120デフォルトの名無しさん (ワッチョイ f72f-fBlf)
垢版 |
2021/09/22(水) 15:13:16.34ID:XBxd6ZoY0
書籍「イヤンもう!最初からそう教えてくれればいいのに!ExcelVBAのプログラミングのツボとコツがゼッタイにわかる本」の評判はどうですか?買うか検討中なのですが。
0125デフォルトの名無しさん (ワッチョイ bf68-I2En)
垢版 |
2021/09/22(水) 20:05:10.79ID:anCt84pS0
イヤンもう
って言うから検索したら特にそんな単語ついてないじゃないですか
0127デフォルトの名無しさん (ワッチョイ bf68-I2En)
垢版 |
2021/09/22(水) 22:05:18.59ID:anCt84pS0
若い子が水着姿で教えるVBAの本なら簡単に死ぬほど売れるのでは?と思った
0132デフォルトの名無しさん (アウアウウー Sa5b-ONKb)
垢版 |
2021/09/22(水) 23:14:36.78ID:jBUNeyMwa
「はたらくプログラミング 」
「高校生からはじめる プログラミング」
「メイクロックマン 史上最大のプログラミング」
「独学プログラマー Python言語の基本から仕事のやり方まで」
のようなアニメやゲームキャラやイケメンを
採用して若い子にアピールするとか
「乙女チック4Gamer」第267回:
「推しと学べるプログラミング」
初心者も学べるプログラミング学習ゲーム
とか

美少女×プログラミング学習×ソーシャルゲーム『コードガールこれくしょん』
とかゲームで呼び込み

恋のプログラミング~ダメ男の見分け方~ DVD-BOX2
のようなDVDを付録に付けてみたりとか
とかとにかくVBAもなんとか頑張って欲しい
0133デフォルトの名無しさん (ワッチョイ ff10-dWRi)
垢版 |
2021/09/22(水) 23:55:17.87ID:ToEmXEKY0
オレも1冊3000円くらいのVBAの本買ったわ
その本をキーボードの下奥に置くと角度が良い感じになるんだわ
手首が疲れないし、職場でもなんか「やってる」感がかもし出せるし、本当に買って良かったと思える1冊だったな
0135デフォルトの名無しさん (ワッチョイ 9f4f-CwtL)
垢版 |
2021/09/23(木) 00:27:06.21ID:4aFmMHLK0
>>132
ん。
昔、EXCELVBAゲーム大作戦とかいう本が出てたよ。まぁVBAも昔からあるからゲーム作るのも先駆者がいたんだね。

けど、結局難しいというか、お仕事で覚えることとベクトルが違うんだよ。1/60秒単位で押されているキーの値読み取って、キャラクターや地形描いてその当たり判定行なったりね。

まぁ暇でそういうの作ってみたいというのにはいいかもだけど、お仕事でVBA使うのの興味を持つために、というのにはちょっと重いかもね。
0136デフォルトの名無しさん (ワッチョイ bf68-I2En)
垢版 |
2021/09/23(木) 00:56:08.87ID:O9y54sVl0
>>133
分かりすぎる
分厚い本って意外と重宝するよなw
0137デフォルトの名無しさん (ワッチョイ bf68-I2En)
垢版 |
2021/09/23(木) 00:59:12.19ID:O9y54sVl0
vbaでゲームは基本的にかなりめんどくさい
メインのループ処理がキツイ
定期的に処理をエクセルに返してあげないと色々と不具合が起きる
曲芸でなければvbaで作るのは絶対に避けたほうが良い
0138デフォルトの名無しさん (ワッチョイ 9fad-qDHA)
垢版 |
2021/09/23(木) 09:34:39.93ID:MTBJM7920
2つあるフレームの位置を調整していたら、
フレームAをフレームBの中にドラッグしてしまったらしく、
2つのフレームが一緒になってしまいました。

プロパティウィンドウを見ると、フレームAはまだ存在するのですが、
画面上にはフレームBしか表示されていないため、Aを選択することができず、
AをBから分離することができません。

AのLeftやTopを変更してみましたが、画面上に変化はありませんでした。

何かいい解決法があれば教えてください。
0139デフォルトの名無しさん (ワッチョイ 9fad-qDHA)
垢版 |
2021/09/23(木) 09:39:09.54ID:MTBJM7920
自己解決しました。

@プロパティウィンドウでプルダウンからフレームAを選択する。
ACtrl+[A]で全選択した後、Ctrl+[X]で切り取り状態にする。
BフレームBのエリア外にマウスカーソルを持っていき、Ctrl+[V]で貼り付ける。
0140デフォルトの名無しさん (ワッチョイ bf68-I2En)
垢版 |
2021/09/23(木) 11:52:58.11ID:O9y54sVl0
おめ〜^^
0149デフォルトの名無しさん (ワッチョイ bf8c-xsW+)
垢版 |
2021/09/23(木) 15:12:01.32ID:AtVLca4O0
系列数に上限がいかにもありそう 255とか
0152デフォルトの名無しさん (オッペケ Srcb-C0eV)
垢版 |
2021/09/23(木) 18:52:18.65ID:c0lh6Lzfr
ごめんなさい
セルからではなく配列から直接グラフを読み込むときの話です。
自分の場合配列から散布図書いてて
データ数が15000?あたりから表示されなくなったので
0154デフォルトの名無しさん (ワッチョイ c23d-4IKK)
垢版 |
2021/09/24(金) 16:28:38.47ID:GLO6/yx90
VBAで、リボンを常に表示させるてことできるんですか?
ググると
Application.ExecuteExcel4Macro "SHOW.TOOLBAR(""Ribbon"", True)"
ていうのが出てくるんですが、
”タブとコマンドの表示”ていう状態にしたい。
0158デフォルトの名無しさん (ワッチョイ 1e68-wYsx)
垢版 |
2021/09/25(土) 07:24:00.70ID:i7f0lbxJ0
しっかりと自分で考える事が大事!向上心をもって勉強しよう!
0163デフォルトの名無しさん (アウアウキー Saef-nXzz)
垢版 |
2021/09/25(土) 15:09:26.96ID:kjOWSdg4a
>>161
聞く方もじじいだし
0164デフォルトの名無しさん (ササクッテロレ Sp47-2mxq)
垢版 |
2021/09/25(土) 22:54:03.42ID:/8ShLWKPp
エクセル詳しい方にご質問。

保護シートの「オートフィルター使用」にチェックつけてる状態で、
Range(Cells(1,1),Cells(1,5)).AutoFilterを実行すると保護解除しろと言われるのですが、原因わかりますか?

Rangeで指定しているセル範囲の保護を外しても言われる始末。
オートフィルターの使用を許可すりゃ通るもんだと思ってました。

見えない仕組みとか、基本的な仕様を見逃してるんかなぁ…
0165デフォルトの名無しさん (ワッチョイ e32f-6iP1)
垢版 |
2021/09/25(土) 23:52:15.96ID:wPvtJ2EG0
>>164
オートフィルターのオンオフはできないのが仕様だな
https://support.microsoft.com/ja-jp/office/%e3%83%af%e3%83%bc%e3%82%af%e3%82%b7%e3%83%bc%e3%83%88%e3%82%92%e4%bf%9d%e8%ad%b7%e3%81%99%e3%82%8b-3179efdb-1285-4d49-a9c3-f4ca36276de6?ns=excel&;version=90&syslcid=1041&uilcid=1041&appver=zxl900&helpid=21290&ui=ja-jp&rs=ja-jp&ad=jp
注: ユーザーは、この設定に関係なく、保護されたワークシートでオートフィルターを適用または削除できません。
0166デフォルトの名無しさん (ワッチョイ 12ad-zD50)
垢版 |
2021/09/26(日) 00:17:38.53ID:BPwZjS350
とあるフォルダへのショートカットを作成する方法を調べたところ、
コーディング前に、
>参照設定は、VBA画面→ツールメニュー→参照設定で「Windows Script Host Object Model」を選択します。
>これでWshShellクラスとWshShortcutクラスを利用できるようになります。
という記述がありました。

それで作れそうですが、
作った.xlsmファイルを他人に渡した場合、
その相手が上記の参照設定をしていない環境だったとしても、ショートカットの作成は行えますか?
0167デフォルトの名無しさん (ササクッテロレ Sp47-2mxq)
垢版 |
2021/09/26(日) 00:44:49.64ID:vU9Y5LAHp
>>165
ご回答頂きありがとうございます。

こういう基本的な説明くらい最初から見とけって話でしたね。

しかし、シートの保護とAutoFilterを両立できないとは、痒いところに手が届かない仕様ですな。
0170デフォルトの名無しさん (ワッチョイ 12ad-zD50)
垢版 |
2021/09/26(日) 01:46:25.94ID:BPwZjS350
ちなみに、
@参照設定で「Windows Script Host Object Model」をONにする。
AWshShellクラスとWshShortcutクラスを利用してコーディングする。
Bプログラムを実行する。
Cショートカットの作成に成功する。
D参照設定で「Windows Script Host Object Model」をOFFにする。
Eプログラムを実行する。
Fショートカットの作成に失敗する。(Aの中の定義について「ユーザ定義型は定義されていません」のエラー)
となったので、
>>166については、相手にも参照設定をしてもらわないとショートカットの作成は行えない、ということだと思います。
0173デフォルトの名無しさん (アウアウクー MM87-b517)
垢版 |
2021/09/26(日) 18:28:19.91ID:6z2Q/VJPM
二次元配列の第三カラムが重複していたらレコードまるごと排除して、かつ排除された分のレコードを別シートに転記することってできます?

連想配列に入れておけば重複してたらわかるようになるけど、そういう方法ってまとも?
0178デフォルトの名無しさん (ワッチョイ e32f-pveB)
垢版 |
2021/09/27(月) 17:52:26.41ID:wG/2iXK70
配列は要素数が増減するものには向いてない
が、まあいろいろ頑張ればできる

連想配列でわかるのは、入れようとしたときに重複するかどうかで、そもそも重複したものは入っていないだろ
0179デフォルトの名無しさん (ワッチョイ 1e68-wYsx)
垢版 |
2021/09/27(月) 21:07:52.71ID:9JOCRyj50
>配列は要素数が増減するものには向いてない
「vbaの」配列な
他の言語にはpushとか色々便利なものがあるんやで
0181デフォルトの名無しさん (ワッチョイ 1e68-wYsx)
垢版 |
2021/09/27(月) 23:17:35.36ID:9JOCRyj50
シート入れれば三次元やぞ
0182デフォルトの名無しさん (ドコグロ MM33-c1VD)
垢版 |
2021/09/28(火) 06:06:35.41ID:NhFpYAOsM
>>179
> 他の言語にはpushとか色々便利なものがあるんやで
スクリプト言語とかだろそれ
言語自体の機能として配列のサイズを変えられる言語はそんなに多くないよ
そもそもVBAはその多くない言語に含まれるし
0184デフォルトの名無しさん (ワッチョイ 92ad-mV7G)
垢版 |
2021/09/28(火) 12:14:47.38ID:fFhZgLlN0
>>182
実はVBAは「配列」のサイズを変えれる数少ない言語
まあ多分全コピー発生してるんだろうけど
コレクション系が弱いからそれぐらいできんとかなりツラい
今なら.NETの使うとか出来るけど
0187デフォルトの名無しさん (ワッチョイ 6f8e-emG0)
垢版 |
2021/09/28(火) 15:43:04.78ID:ZLV/p08A0
「たくさん」と言ったってワークステーションやサーバ系のハードウェアでない限りせいぜい64GBか128GBが上限では?
0189デフォルトの名無しさん (ワッチョイ 4be5-XWMK)
垢版 |
2021/09/28(火) 16:43:48.67ID:yyyanN8B0
64KBまでだよ
0191デフォルトの名無しさん (ワッチョイ 96bb-PL4X)
垢版 |
2021/09/28(火) 17:35:37.46ID:Fgmzo9M90
long配列の下位16ビットにデータ格納されている
long[0],[1]の下位16ビットを結合するとsingleの値となる
(要はsingleが16ビット分割されてlong型に格納されている)
こんなデータが大量に格納されるんですが、上手く結合して型変換する方法がわかりません。。
val("&H" & hex(long(1)) & hex(long(0)))
で32ビット結合はできましたが、その後の暗黙的な変換なしでsingleに変更するにはどうするのが良いでしょうか?
0193デフォルトの名無しさん (スップ Sd32-zD50)
垢版 |
2021/09/28(火) 20:20:03.83ID:chK2kmIxd
>>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
0194デフォルトの名無しさん (ワッチョイ 124f-E55q)
垢版 |
2021/09/28(火) 21:06:13.76ID:mkxQja700
>>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

こんな感じに。
オーバーフローして表示しきれなくなった分は知らんけど。
0195デフォルトの名無しさん (ワッチョイ 124f-E55q)
垢版 |
2021/09/28(火) 21:56:37.27ID:mkxQja700
おっと、すまんこ
括弧の位置間違えてた

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は論理演算子ではなくてビット演算子。
0196デフォルトの名無しさん (ワッチョイ e32f-pveB)
垢版 |
2021/09/29(水) 02:45:23.84ID:DNRsGaHg0
>>191
SingleもLongも32ビット長なんだが、Singleの内部形式が分割されて二つのLongに16ビットずつ格納されているのか?
なんでそんなことになってるんだよ。Integer二つでいいじゃないか

考え方としては>>193さんの言う通りLSetでできる
二つのLongから有効な32ビット抜き出すのが手間だけど

Singleの内部形式はIEEE 754のはずだから、自分でビット演算してもできるだろうけど
0197デフォルトの名無しさん (ワッチョイ e32f-pveB)
垢版 |
2021/09/29(水) 02:50:45.14ID:DNRsGaHg0
とりあえず作ってみた
エンディアンの呪いがかかってても知らん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
0198デフォルトの名無しさん (スップ Sd52-zD50)
垢版 |
2021/09/29(水) 03:32:54.18ID:hT//j47fd
VBAには共用体もポインタもないから、
LSetでメモリの内容をコピー
バイナリファイル経由
IEEEの内部フォーマットに合わせてゴリゴリ計算
ぐらいしか思い付かん

この中ではLsetが一番シンプルだし高速
上位、下位の順番が分からんから適当に書くけど、基本的にはこんな感じ
MyLong = Long0 * &h10000 + Long1
Lset MySingle = MyLong

C#とか使えばもっと簡単にできるんで、そもそもこの作業はVBAに向いてない
■ このスレッドは過去ログ倉庫に格納されています

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