Excel VBA 質問スレ Part73

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ 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
114デフォルトの名無しさん (ワッチョイ bf68-I2En)
垢版 |
2021/09/21(火) 21:13:59.43ID:pV6hI0Vx0
>>110
全シートを選択してカットペーストでいけるだろ、と思ったら無理だった

VBEをVBAで動かすしか無いと思う。
https://jizilog.com/vba-modadd
http://officetanaka.net/excel/vba/vbe/07.htm
115デフォルトの名無しさん (ワッチョイ bf68-I2En)
垢版 |
2021/09/21(火) 21:29:23.86ID:pV6hI0Vx0
>>109
vbaってグローバル変数の初期化できないのか・・・
見たことはない。変な気はする
とりあえずはシートに書くほうが楽だと思う
constでいいなら初期化が出来る。社名みたいにほぼ絶対変わらない物ならこれでもいいかも

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

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

あと、初期化用の関数はPublic指定にしておかないと別のモジュールから呼び出せないよ。ThisWorkbookから呼び出すんでしょ?
2021/09/22(水) 08:55:25.77ID:h9k7055fM
ありがとうございます
2021/09/22(水) 08:56:23.60ID:h9k7055fM
constやってみます
2021/09/22(水) 11:22:09.41ID:QukUYkwCa
普通じゃなかったのか…俺もそうしてた
>>116
勉強になります
120デフォルトの名無しさん (ワッチョイ f72f-fBlf)
垢版 |
2021/09/22(水) 15:13:16.34ID:XBxd6ZoY0
書籍「イヤンもう!最初からそう教えてくれればいいのに!ExcelVBAのプログラミングのツボとコツがゼッタイにわかる本」の評判はどうですか?買うか検討中なのですが。
2021/09/22(水) 19:17:45.16ID:igHuaWyKa
>>120
ゼッタイにわかる本系の口語調文章に抵抗がないラノベ好きには良いんじゃない?
2021/09/22(水) 19:18:09.88ID:igHuaWyKa
>>120
ゼッタイにわかる本系の口語調文章に抵抗がない人には良いんじゃない?
2021/09/22(水) 19:19:18.20ID:igHuaWyKa
なにこのエラー去勢された
2021/09/22(水) 19:35:51.24ID:wAf2i/6rH
>>120
人それぞれ印象が違うから、参考書は最初の2、3ページ立ち読みして自分で決めるのがいいよ
125デフォルトの名無しさん (ワッチョイ bf68-I2En)
垢版 |
2021/09/22(水) 20:05:10.79ID:anCt84pS0
イヤンもう
って言うから検索したら特にそんな単語ついてないじゃないですか
2021/09/22(水) 21:46:48.06ID:Th7N/2yOd
https://i.imgur.com/Izd2bnq.jpg
127デフォルトの名無しさん (ワッチョイ bf68-I2En)
垢版 |
2021/09/22(水) 22:05:18.59ID:anCt84pS0
若い子が水着姿で教えるVBAの本なら簡単に死ぬほど売れるのでは?と思った
2021/09/22(水) 22:14:11.23ID:ER/2UqvV0
そもそもVBA自体がオッサン臭い言語
2021/09/22(水) 22:16:41.63ID:cVN8rRFZM
そもそも5ch自体がオッサン臭い場所
2021/09/22(水) 22:21:20.29ID:RvuuvfBjM
そもそもオッサンしかいない
2021/09/22(水) 23:01:12.21ID:LAnicbtO0
VBAとか作業記録してそれループするなり可変したりするなりちょっと直せば誰でも作れるからな
2021/09/22(水) 23:14:36.78ID:jBUNeyMwa
「はたらくプログラミング 」
「高校生からはじめる プログラミング」
「メイクロックマン 史上最大のプログラミング」
「独学プログラマー Python言語の基本から仕事のやり方まで」
のようなアニメやゲームキャラやイケメンを
採用して若い子にアピールするとか
「乙女チック4Gamer」第267回:
「推しと学べるプログラミング」
初心者も学べるプログラミング学習ゲーム
とか

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

恋のプログラミング~ダメ男の見分け方~ DVD-BOX2
のようなDVDを付録に付けてみたりとか
とかとにかくVBAもなんとか頑張って欲しい
2021/09/22(水) 23:55:17.87ID:ToEmXEKY0
オレも1冊3000円くらいのVBAの本買ったわ
その本をキーボードの下奥に置くと角度が良い感じになるんだわ
手首が疲れないし、職場でもなんか「やってる」感がかもし出せるし、本当に買って良かったと思える1冊だったな
134デフォルトの名無しさん (アウアウウー Sa5b-hED7)
垢版 |
2021/09/23(木) 00:25:56.19ID:1QHTb9H7a
全国フェミニスト議員連盟が半泣き←いまここ
https://www.tokyo-np.co.jp/article/132305
2021/09/23(木) 00:27:06.21ID:4aFmMHLK0
>>132
ん。
昔、EXCELVBAゲーム大作戦とかいう本が出てたよ。まぁVBAも昔からあるからゲーム作るのも先駆者がいたんだね。

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

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

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

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

何かいい解決法があれば教えてください。
2021/09/23(木) 09:39:09.54ID:MTBJM7920
自己解決しました。

@プロパティウィンドウでプルダウンからフレームAを選択する。
ACtrl+[A]で全選択した後、Ctrl+[X]で切り取り状態にする。
BフレームBのエリア外にマウスカーソルを持っていき、Ctrl+[V]で貼り付ける。
140デフォルトの名無しさん (ワッチョイ bf68-I2En)
垢版 |
2021/09/23(木) 11:52:58.11ID:O9y54sVl0
おめ〜^^
2021/09/23(木) 13:11:17.06ID:cmFu96z6a
>>139
たった5分も考える事が出来んのか
2021/09/23(木) 13:48:48.21ID:tEWlRRfOM
せっかく解決策書いてくれてるのにイチャモンつけるバカって何を考えてるんだろ…
2021/09/23(木) 13:53:17.23ID:DsLS3pBM0
ただの寂しがり屋の暇つぶしとか
2021/09/23(木) 13:59:57.49ID:5gST2jZHM
黙って去るやつよりよっぽどいいんだが
2021/09/23(木) 14:03:41.04ID:F4JAOFkVr
配列からグラフを書いたときってデータ数の上限はありますか?
その場合どのように対処すれば良いですか?
2021/09/23(木) 14:08:33.29ID:KMctW7zL0
>>145
上限を気にするようなデータ数だったら
excelでは重くて動かないと思う
別の言語で書いた方がいい
2021/09/23(木) 14:45:47.29ID:gN04ENXIM
>>145
その場合はデータをコンパクトにまとめるしかなくね
2021/09/23(木) 14:47:47.80ID:dUOklB1+M
>>145
数千個程度は描けたような記憶がある
そもそもそのレベルだと個々の値は見えないから複数個まとめて平均取るとかしてデータ量を減らせばいいかと
149デフォルトの名無しさん (ワッチョイ bf8c-xsW+)
垢版 |
2021/09/23(木) 15:12:01.32ID:AtVLca4O0
系列数に上限がいかにもありそう 255とか
150デフォルトの名無しさん (ワッチョイ bf8c-xsW+)
垢版 |
2021/09/23(木) 15:22:04.38ID:AtVLca4O0
>>145
上限なしだって
https://support.microsoft.com/ja-jp/office/excel-%E3%81%AE%E4%BB%95%E6%A7%98%E3%81%A8%E5%88%B6%E9%99%90-1672b34d-7043-467e-8e27-269d656771c3
これスレのテンプレに入れといてほしい
2021/09/23(木) 18:38:01.80ID:rxtBh7Jj0
>>145
セルに適当なデータいれてグラフ作ったら 9万9千9百+α までしか表示されなかった
メモリの問題かもしれん
2021/09/23(木) 18:52:18.65ID:c0lh6Lzfr
ごめんなさい
セルからではなく配列から直接グラフを読み込むときの話です。
自分の場合配列から散布図書いてて
データ数が15000?あたりから表示されなくなったので
2021/09/23(木) 20:46:47.80ID:rxtBh7Jj0
だからメモリ少ないんじゃね
2021/09/24(金) 16:28:38.47ID:GLO6/yx90
VBAで、リボンを常に表示させるてことできるんですか?
ググると
Application.ExecuteExcel4Macro "SHOW.TOOLBAR(""Ribbon"", True)"
ていうのが出てくるんですが、
”タブとコマンドの表示”ていう状態にしたい。
2021/09/24(金) 18:53:45.39ID:towOKsyE0
If Application.CommandBars.GetPressedMso("MinimizeRibbon") = True Then
Application.CommandBars.ExecuteMso "MinimizeRibbon"
End If
2021/09/25(土) 02:37:13.36ID:p3qnNTxE0
>>155
おおサンクスww
できた。

なんでリボンの表示・非表示の記事書いてるやつはここまで書かないのかね。
2021/09/25(土) 06:01:58.81ID:A2HuAdJq0
なんでだと思う?
158デフォルトの名無しさん (ワッチョイ 1e68-wYsx)
垢版 |
2021/09/25(土) 07:24:00.70ID:i7f0lbxJ0
しっかりと自分で考える事が大事!向上心をもって勉強しよう!
2021/09/25(土) 07:50:31.86ID:xUBmE3KO0
ひろゆきのクラスモジュールの説明は的確で分かりやすかった
2021/09/25(土) 07:51:02.02ID:xUBmE3KO0
クラスモジュールというよりはオブジェクト指向か
2021/09/25(土) 13:59:25.45ID:QZokVoY5p
このスレにはクラスとかオブジェクト指向とかいうと、ファビョって「マウント取りに来たー!!」とか騒ぐじじいがいるから気をつけた方がいいぞ
2021/09/25(土) 14:23:54.16ID:ADwaIx4kM
5chはじじいの巣窟ですよ。
子供は他所で遊んだ方が良いですよ。
163デフォルトの名無しさん (アウアウキー Saef-nXzz)
垢版 |
2021/09/25(土) 15:09:26.96ID:kjOWSdg4a
>>161
聞く方もじじいだし
2021/09/25(土) 22:54:03.42ID:/8ShLWKPp
エクセル詳しい方にご質問。

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

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

見えない仕組みとか、基本的な仕様を見逃してるんかなぁ…
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
注: ユーザーは、この設定に関係なく、保護されたワークシートでオートフィルターを適用または削除できません。
2021/09/26(日) 00:17:38.53ID:BPwZjS350
とあるフォルダへのショートカットを作成する方法を調べたところ、
コーディング前に、
>参照設定は、VBA画面→ツールメニュー→参照設定で「Windows Script Host Object Model」を選択します。
>これでWshShellクラスとWshShortcutクラスを利用できるようになります。
という記述がありました。

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

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

しかし、シートの保護とAutoFilterを両立できないとは、痒いところに手が届かない仕様ですな。
2021/09/26(日) 01:37:23.16ID:O844yIU50
>>167
オートフィルターON/OFFと同時にシートの保護/解除も書いてしまえばいいんでないの?
2021/09/26(日) 01:39:32.52ID:BPwZjS350
>>166
自己解決しました。

参照設定を変更しなくてもショートカットの作成は可能でした。
そちらの方法にします。
https://excel-ubara.com/excelvba4/EXCEL293.html
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については、相手にも参照設定をしてもらわないとショートカットの作成は行えない、ということだと思います。
2021/09/26(日) 01:51:41.55ID:vU9Y5LAHp
>>168
確かに、仰る通りですね。
保護は事前に設定しておくものと勝手に思い込んでいました。

一番良い形で解決できそうです。ありがとうございます。
2021/09/26(日) 15:56:59.18ID:ynzNBMLj0
>>170
参照設定した内容はそのエクセルファイルに保存されてる
エクセルファイルを渡した先でその参照設定がちゃんと動くなら動く
2021/09/26(日) 18:28:19.91ID:6z2Q/VJPM
二次元配列の第三カラムが重複していたらレコードまるごと排除して、かつ排除された分のレコードを別シートに転記することってできます?

連想配列に入れておけば重複してたらわかるようになるけど、そういう方法ってまとも?
2021/09/26(日) 18:29:58.19ID:Fsa0c3oL0
第三限定なの?
2021/09/26(日) 19:28:17.19ID:HYuUGx6O0
できるかどうかではなく、そういう処理を作りたいんじゃないの?
2021/09/26(日) 21:42:42.58ID:hcQxkCQHM
配列とレコードとシートの区別ない人だね
2021/09/26(日) 23:35:14.87ID:ISHRJ32V0
そういう方法で重複チェックをしたことはあるけど
それがまともかと聞かれるとわからんなぁ
2021/09/27(月) 17:52:26.41ID:wG/2iXK70
配列は要素数が増減するものには向いてない
が、まあいろいろ頑張ればできる

連想配列でわかるのは、入れようとしたときに重複するかどうかで、そもそも重複したものは入っていないだろ
179デフォルトの名無しさん (ワッチョイ 1e68-wYsx)
垢版 |
2021/09/27(月) 21:07:52.71ID:9JOCRyj50
>配列は要素数が増減するものには向いてない
「vbaの」配列な
他の言語にはpushとか色々便利なものがあるんやで
2021/09/27(月) 21:09:45.06ID:1fIlBTl00
Excelにはセルっていう使いやすい2次元配列があるからな
速度はご愛嬌
181デフォルトの名無しさん (ワッチョイ 1e68-wYsx)
垢版 |
2021/09/27(月) 23:17:35.36ID:9JOCRyj50
シート入れれば三次元やぞ
2021/09/28(火) 06:06:35.41ID:NhFpYAOsM
>>179
> 他の言語にはpushとか色々便利なものがあるんやで
スクリプト言語とかだろそれ
言語自体の機能として配列のサイズを変えられる言語はそんなに多くないよ
そもそもVBAはその多くない言語に含まれるし
2021/09/28(火) 11:35:58.86ID:mkxQja700
無いものねだりしてもしょうがない
そもそも他言語やっててVBAやった場合
ない機能をどうやって実装するか考えるのが
醍醐味なんだから
184デフォルトの名無しさん (ワッチョイ 92ad-mV7G)
垢版 |
2021/09/28(火) 12:14:47.38ID:fFhZgLlN0
>>182
実はVBAは「配列」のサイズを変えれる数少ない言語
まあ多分全コピー発生してるんだろうけど
コレクション系が弱いからそれぐらいできんとかなりツラい
今なら.NETの使うとか出来るけど
2021/09/28(火) 13:45:05.92ID:T/P4fEdFM
>>184
> コレクション系が弱いからそれぐらいできんとかなりツラい
どこが弱いの?
2021/09/28(火) 15:11:07.44ID:8+n9QyO8M
今の時代、メモリなんてたくさん確保しておけばよくね
187デフォルトの名無しさん (ワッチョイ 6f8e-emG0)
垢版 |
2021/09/28(火) 15:43:04.78ID:ZLV/p08A0
「たくさん」と言ったってワークステーションやサーバ系のハードウェアでない限りせいぜい64GBか128GBが上限では?
2021/09/28(火) 15:46:57.39ID:9IVurO/LM
お、おう
189デフォルトの名無しさん (ワッチョイ 4be5-XWMK)
垢版 |
2021/09/28(火) 16:43:48.67ID:yyyanN8B0
64KBまでだよ
2021/09/28(火) 16:48:32.26ID:vws8rDV40
VBA(Excel)にそんなメモリ使わせたらヒヤヒヤしちゃう
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に変更するにはどうするのが良いでしょうか?
2021/09/28(火) 18:37:14.39ID:nfdxFkKa0
リアルタイムにやる必要が無いならバイナリでファイルに書いて
Singleで読むとか出来そうな気がする。
同じ考え方でADODB.stremも使えそう。
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
194デフォルトの名無しさん (ワッチョイ 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

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

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

Singleの内部形式はIEEE 754のはずだから、自分でビット演算してもできるだろうけど
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
2021/09/29(水) 03:32:54.18ID:hT//j47fd
VBAには共用体もポインタもないから、
LSetでメモリの内容をコピー
バイナリファイル経由
IEEEの内部フォーマットに合わせてゴリゴリ計算
ぐらいしか思い付かん

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

C#とか使えばもっと簡単にできるんで、そもそもこの作業はVBAに向いてない
2021/09/29(水) 04:17:58.49ID:DNRsGaHg0
>>198
それ符号ビットの問題があるぞ
VBAには論理シフトとかないからな

バイナリファイルにするにしても、Longの不要な16ビット捨てる方法考えんといかん
2021/09/29(水) 05:23:25.92ID:HULqg2bxd
符号ビット対策
64bit限定ならLongLong型を経由すればもっと簡単になるのか?どう書けばいいのかわからんけど

Dim MSB As Long
MSB = (Long0 And &H8000) And &H80000000
MyLong = MSB Or ((Long0 And &H7FFF) * &H10000 + Long1)
2021/09/29(水) 05:43:02.15ID:ia9ebpqvd
訂正
MSB = ((Long0 And &H8000) <> 0) And &H80000000
2021/09/29(水) 08:25:13.60ID:slA14A+y0
>>201
いや、Longの中に入っている時点でマイナスなら* -1してやればいいだけだけど、だったらもっと範囲の広い型で後ろ2バイト以外クリアする方が分岐もなくスッキリするだろう
2021/09/29(水) 08:41:09.05ID:+gGxbszWd
>>202
元データの上位2バイトが00で埋まってた場合、論理シフトで符号が変わる場合があるでしょ
VBAには論理シフトがないから、何か別の方法で再現する必要があると思うんだけど
具体的に、動くコード書いてみて
2021/09/29(水) 09:29:57.66ID:ilMiUA0BM
Byte型からLSetが単純で一番速いと思う

定義(追加部分のみ)

Type tyByte
  Byte0 As Byte
  Byte1 As Byte
  Byte2 As Byte
  Byte3 As Byte
End Type

代入処理はこんな感じ
データの格納順序は知らんから適当

myByte.Byte0 = long0 And &HFF&
myByte.Byte1 = (long0 And &HFF00&) \ &H100&
myByte.Byte2 = long1 And &HFF&
myByte.Byte3 = (long1 And &HFF00&) \ &H100&
LSet mySingle = myByte
2021/09/29(水) 09:40:16.79ID:f5tfMzLod
>>204
それなら最初にLongをByteにLsetすれば、マスクやシフトしなくても途中のバイトがそのまま取り出せる
コードの行数は増えるけど演算量はもっと減らせる
2021/09/29(水) 12:56:20.18ID:slA14A+y0
>>203
ちょっと何を言ってるか分かりませんね。
まずシフトの話はどこから出てきたの?
Long型ならマイナスであれば常にトップビットは
立っているよね?
だからプラスに変換するってことだけど?
トップビットが立っていなければプラスなんで変換する必要はない。
もちろん、最初の設定値のLong型の下位2バイトでマイナスを表現するならそれぞれ*-1してやらなきゃいけないけど>>191を見た限りではそのような扱いでもないしね。

途中でマイナスをもつような型の変数に入れるなら
その後始末をしないといけないというだけ。
そもそもトップビットがなぜ符号なのかというところから理解しないとね。
トップビットを単純に0にすればプラスの値に置き換わるというものでもないし。

例えば、1バイトの変数で言えば、-1はFFhだよね。
これのトップビットを倒すと、7Fhになる。
つまり、1にはならずに127になるよね。
2021/09/29(水) 19:09:56.88ID:UXZ9zF/70
VBAのウインドウの固定で行を選択するとA列に移動してしまうのはどうにかならない?
手動だとそのまま列でウインドウの固定になるから違いがよくわからん
2021/09/29(水) 21:29:48.02ID:7Q67NENAd
>>206
元の質問と、そこに付いてるレスをよく読んで
2021/09/29(水) 22:06:13.36ID:bAaW5g7mM
>>206
ゴタクはいいから
> 具体的に、動くコード書いてみて
って言われてるぞ
2021/09/29(水) 22:10:21.46ID:slA14A+y0
>>209
具体的なコードは昨日既に>>195で書いているな。
2021/09/29(水) 22:32:44.25ID:helTTC1Td
図解するとこういうことじゃないの?俺の理解が間違ってる?
https://i.imgur.com/z48adB1.jpg
212デフォルトの名無しさん (ワッチョイ 124f-E55q)
垢版 |
2021/09/29(水) 22:47:00.69ID:slA14A+y0
>>211
うん。それであってるよ。
ただ、.Netみたいにアンサインな型の変数が無いから
それをどうしようか、という話。
Longで普通に計算すると上位2バイトに65535(&HFFFF)辺りが入れば
例えば&HFFFF00000が入ったとして、4294901760が欲しいのに
普通にLong型だと-65536が取れちゃったりするよね。
2021/09/29(水) 23:33:48.06ID:slA14A+y0
あ、でも*-1する方法じゃダメか。
これはあくまでマイナスをプラスにする方法であって、トップビットが立っていてもプラスとみなす方法じゃないからね。
そう考えるとやっぱりもう少し幅の広い変数持っといて計算する方法が楽かな。

だからみんなByte型とか使ってたのかー。
なんか勉強になったわ。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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