Excel VBA 質問スレ Part70

■ このスレッドは過去ログ倉庫に格納されています
2021/03/18(木) 22:08:43.71ID:jtngtgXU0
!extend:checked:vvvvv:1000:512
↑同じ内容を2行貼り付けるナリ

ExcelのVBAに関する質問スレナリ
コード書き込みや作成依頼もOKナリ

※前スレ
Excel VBA 質問スレ Part69
https://mevius.5ch.net/test/read.cgi/tech/1607786543/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2021/03/26(金) 01:12:09.52ID:ZoYVceoP0
Date型はミリ秒を持てないのでしょうか?
エクセルシートでミリ秒まで表示できている時刻があって、そのシリアル値をVBAのDate型変数に代入するとミリ秒以下が丸められてしまいます
53デフォルトの名無しさん (ワッチョイ 655f-luGl)
垢版 |
2021/03/26(金) 01:52:58.20ID:YMBMwB0G0
>>52
時分秒までです。
54デフォルトの名無しさん (ワッチョイ 655f-luGl)
垢版 |
2021/03/26(金) 01:56:39.74ID:YMBMwB0G0
>>52
Date型に入れて何がしたかったのか?
2021/03/26(金) 02:03:12.37ID:NYhr3fTi0
日付を扱うならDate型使うけど
時間を扱うならDouble型使うなぁ
2021/03/26(金) 08:07:23.35ID:3Vso6amb0
>>52
シリアル値で日付までが整数部で時間から小数点になるから小数点扱える型なのにミリ秒が扱えないと言うのが
ちょっと引っ掛かったので調べてみたよ。

方式はセルにミリ秒まで表示出来るフォーマットを設定して(yyyy/mm/dd hh:mm:ss.000)
隣のセルにその値を代入する数式を書いて、数値で小数点16桁くらい表示するようなフォーマットを設定して、
またその隣にそのセルの値を代入してセルにミリ秒まで表示するフォーマットのセルを用意して
元の値が正しく表示されるか確認した。

で、VBAで最初のセルの値をDATE型の変数に入れてDouble型に変換したら、
キチンと2番目のセルと同じ頭になることが確認出来たので、DATE型はミリ秒まで持てることが分かった。

じゃ、何で丸められちゃうの?
と言うことになると思うけど、どうやらこういうことらしい。
https://support.microsoft.com/ja-jp/topic/excel-ワークシートのセルに-vba-の日付形式またはバリアント型の日付形式を割り当てようとすると-ミリ秒が最も近い秒に丸められます-4a0af2c5-78de-762f-6431-8669890f585b
2021/03/26(金) 12:00:33.82ID:scqWQXi5M
>>53-56
ありがとうございます
勉強中でVBAの動きを理解したいだけで、何がしたいという訳ではないです

調べてみましたが以下の理解で合っていますか?
・シリアル値はDouble型の情報
・日付(Date型)はシリアル値の表示形式を"yyyy/mm/dd h:mm:ss"に変更しているイメージ
 内部ではミリ秒含むシリアル値を持っており、ミリ秒以下の情報が九められた訳ではない
・シリアル値とDate型はCDbl とCDateで相互変換可能。このときもミリ秒以下の情報は丸められない

・ミリ秒が丸められるのは、Date型をセルに=で代入したとき
 これは、Date型の表示をセルにコピーしているため
・セルにDate型でなくシリアル値を代入することで回避できる
2021/03/26(金) 12:08:12.92ID:RjaLBbvt0
(´-`).。oO(「丸める」をどう入力したら「九める」となるのだろう・・・知らんけど)
2021/03/26(金) 12:44:01.98ID:3Vso6amb0
>>57
本当の意味合いではかなり違う気もするけど
イメージ的にはそんな感じかな
2021/03/26(金) 16:10:18.31ID:xthmZvz40
>>58
手書き入力なんじゃないの
知らんけど
61デフォルトの名無しさん (ワッチョイ 655f-luGl)
垢版 |
2021/03/26(金) 17:55:08.09ID:YMBMwB0G0
>>57
Excelの内部データ形式は突き詰めない方がいいよ。

それにセルの書式の組み合わせもあるから、初心者は気をつけてね。
2021/03/26(金) 18:28:35.59ID:scqWQXi5M
ありがとうございます
これ以上は突き詰めないようにします
ここまで解説してるサイトはほとんど見当たりませんでしたが、
Application.Waitの引数にVBAの関数を使うと何故精度が低くなるのか?など
ここまで理解して初めて分かることもあったので良かったです

ちなみに丸が九になったのはパソコンで打った文章をスマホで取り込んだからですね
63デフォルトの名無しさん (ワッチョイ b18e-COrd)
垢版 |
2021/03/26(金) 20:17:02.94ID:9W175/Ms0
馬鹿は入力機器で漢字コードが決まると思っているのか
64デフォルトの名無しさん (ワッチョイ 655f-luGl)
垢版 |
2021/03/26(金) 20:24:40.81ID:YMBMwB0G0
漢字コードとは古臭いw
65デフォルトの名無しさん (ワッチョイ 655f-luGl)
垢版 |
2021/03/26(金) 20:27:23.31ID:YMBMwB0G0
JISコード時代の俗称だぞ。
66デフォルトの名無しさん (ワッチョイ b18e-COrd)
垢版 |
2021/03/26(金) 20:58:19.29ID:9W175/Ms0
JISとかEBCDICとか古いこと自慢か?
2021/03/26(金) 22:02:40.63ID:AwqZOL59M
5chはジジイの巣窟です
昔話に花が咲くのです
68デフォルトの名無しさん (ワッチョイ 655f-j37g)
垢版 |
2021/03/26(金) 23:45:57.50ID:YMBMwB0G0
漢字ROMの時代からやってきた過去の人
2021/03/27(土) 20:27:21.67ID:5nK2M5CU0
質問させてください
worksheetfunctionでsumifやcountifを使用する際の範囲指定はrange(cells(),cells ())と指定する方がいいのか、cells ().resize()と指定する方がいいのか、どっちでしょう?
皆さんはどっちを使用していますか?
70デフォルトの名無しさん (ワイーワ2 FF1a-j37g)
垢版 |
2021/03/27(土) 21:10:41.58ID:/5jOHbkqF
rangeは特殊だからはまりやすい。
2021/03/27(土) 21:23:53.88ID:+4xxppTF0
範囲をどうやって決めているかによる
2021/03/27(土) 21:28:05.27ID:5nK2M5CU0
一般的な場合として、例えば最大行までの範囲とした場合はどうでしょうか?
初心者なので、最近、resizeを学んだばっかりなのですが、resizeの方がすっきりしてるような気がするけど、rangeの方がパッと見、分かりやすいよなぁと思いまして
2021/03/27(土) 21:49:27.21ID:WrV3x1Cf0
たしかえくせるちゅんちゅんでそんな解説記事あったよ
おれは範囲指定だったらrangeかな
resizeは増やす値をちゃんと考慮しないと間違えやすいんだよな
74デフォルトの名無しさん (ドコグロ MM9a-eYIm)
垢版 |
2021/03/27(土) 22:29:55.09ID:kX/HYgzKM
>>72
その程度ならお好みでどうぞ
値貼り付けとかやる場合は、range(cells(),cells ())なんか使ってられないから、Set、Offset、Rresizeの組み合わせを使っているな
2021/03/27(土) 22:36:49.88ID:DIdh8j19a
テーブルにすればRangeでCellsを囲う必要がなくなるから、まずテーブルにできるかから考えてみれば
76デフォルトの名無しさん (ワッチョイ b163-VcSF)
垢版 |
2021/03/28(日) 12:09:35.83ID:gO7qo7Yf0
現在6秒に1回実行するマクロを組んでいるのですが、
複数のエクセルファイルを開いてそのマクロを実行すると、
マクロを実行しているファイルとは別のエクセルファイルを
マウス等で触ってアクティブにすると、関係のないそのエクセルファイルで
そのマクロが実行されて、肝心のマクロが肝心のファイルで実行されず、
エラーになるという現象で悩まされています。
例えば、ファイル名「A」、ファイル名「B」のエクセルファイルがあり、
ファイル名「A」の中にマクロでセルF1を6秒間隔で選択するコードがあると、
6秒間隔で更新している時にファイル名「B」を触ると(アクティブになる)、
ファイル名「B」のセルF1を選択してしまうのです。本来はファイル名「A」
で組んでいえるのでファイル名Aで実行されなければいけないのに。。。
ファイル名、シート名を指定して他のファイルでは実行できないようにコードを
入れてみたのですが治りません。どうすればよいのでしょうか?
ご教授お願いします。
2021/03/28(日) 12:41:13.75ID:SibCEmYdH
>>76
コードの中の全部のRangeやCellsにもブック名とシート名を書いてある?
2021/03/28(日) 12:53:44.04ID:vqLmoR8/M
面倒なのは分かるが意図しない動作をする時はF8で1ステップずつ挙動を確認したりデスクに適当な人形をおいてコードを1行1行何をしている行なのかを人形に対して声に出しながら説明すると原因を突き止めやすいぞ
2021/03/28(日) 13:27:37.72ID:slfnYujm0
当該ブックのアクティブ化とCallだけでやろうとしている?

これかしら?
Application.Run ‘パス+ブック名’!マクロ名

https://excelwork.info/excel/runmethod/
2021/03/28(日) 14:55:28.65ID:0AXzz3HSa
thisworkbookでいいんじゃね
2021/03/28(日) 15:28:42.70ID:58jRB2Jo0
>>76
これだとアクティブなシートの[A1]に入力されます
Range("A1")=1

これだと指定したファイルの指定したシートの[A1]に入力されます
Workbooks("Book1").Worksheets("Sheet1").Range("A1") = 1
2021/03/28(日) 17:37:33.16ID:NPcBjbDnp
まーおそらく値の設定時に
ちゃんとどのブック、どのシートって
設定されていないんだろうけど
もっと気になるのは6秒というスパンの中で
処理が6秒を間に合わなかったらどうするのか
ちゃんと考えて作っていのかってことかな
大きなお世話かも知れんけど
83デフォルトの名無しさん (ワッチョイ d2e6-WhAp)
垢版 |
2021/03/28(日) 18:29:23.67ID:vpNC6cf/0
セルの編集は6秒あれば楽勝です
2021/03/28(日) 20:03:24.72ID:5/aHi+ebd
>>40
自分が書き込んだかと思ったわw
2021/03/28(日) 20:31:26.17ID:y1jMexrp0
UIAutomationでInvokeをするVBAマクロをタスクスケジューラで
日次・定時に起動しているのですがロック画面ではInvokeが実行されません

解決策をご存知でしたらご教示お願いします
2021/03/28(日) 21:54:46.91ID:FtDhz91V0
ロック画面にしない
2021/03/29(月) 18:09:13.47ID:RBGHkQmra
もはやexcelの問題じゃねーし
2021/03/29(月) 19:13:47.90ID:QhuH86uEa
なんでFINDで探せないんだろ
とおもったら
改行コードがはいっていたでござる

やれやれ
2021/03/30(火) 17:58:10.32ID:0EHjDb6N0
質問です

前はExcel2010の時はレジストリを維持って、VBAファイルだけはインスタンス起動が出来るようにするとか可能でしたが
2019にするとインスタンス起動ができなくなってました。
.xlsmファイルだけインスタンス起動するとか方法はないでしょうか
2021/03/31(水) 04:17:21.25ID:1Kn3VVGI0
右クリックして[新規] じゃだめなのか?
9176です。 (ワッチョイ b163-VcSF)
垢版 |
2021/03/31(水) 18:32:23.42ID:Evr26ox50
回答くださった皆さん本当に有難うございます。
これから回答いただいた対処法を全て1個1個試していこうと思います。
なお6秒に一回とは、エクセルのセルに株価をリアルタイムで
反映するソフトがあるのですが、それで株のアラート機能を
VBAで自作で作っているので必要なのです。
ではでは。
2021/03/31(水) 20:42:46.87
sheet1のA1には
https://www.jma.go.jp/英数字

A3からA10000には、それぞれ異なるURLが記載されています

B1には
https://maps.gsi.go.jp/index_m.htmlhttps://www.mlit.go.jp/river/toukei_chousa/kasen/jiten/nihon_kawa/0305_edogawa/0305_edogawa_00.htmlhttps://www.jice.or.jp/knowledge/japan/commentary03
みたいなURLが繋がっている文字列があります

B2からB10000には、上の様なURLが繋がっている文字列があります

A1からA3は
https://www.jma.go.jp/英数字

B1
https://maps.gsi.go.jp/index_m.html

B2
https://www.mlit.go.jp/river/toukei_chousa/kasen/jiten/nihon_kawa/0305_edogawa/0305_edogawa_00.html

B3
https://www.jice.or.jp/knowledge/japan/commentary03


みたいにB列にあるセル内を分解して、分解した分だけA列にA1の文字列を補う処理
以降B10000までを処理して
sheet2に記載したいのですが、どのようにすればよいでしょうか?
2021/03/31(水) 22:33:41.42ID:GYCr8oLd0
何言ってるのか判らんが
好きなようにやればいいよ
94デフォルトの名無しさん (ワッチョイ 655f-j37g)
垢版 |
2021/04/01(木) 00:43:47.27ID:Qm9pGYRd0
>>91
「エクセルのセルに株価をリアルタイムで
反映するソフトがある」

こんな珍味なソフトウェアがあるのかw
95デフォルトの名無しさん (ワッチョイ b163-VcSF)
垢版 |
2021/04/01(木) 02:05:44.32ID:GioFRFH30
>>94
楽天RSS 岡三RSS。
因みに株は難しく甘い世界ではないので安易にやらないようにしましょう。
ほとんどの人が負けます。
96デフォルトの名無しさん (ワッチョイ 655f-j37g)
垢版 |
2021/04/01(木) 03:02:30.23ID:Qm9pGYRd0
変な外国人が作ったんだろうなあ
2021/04/01(木) 09:31:40.60ID:JyQIT704d
「珍味」ってそういう使い方する言葉だっけ
2021/04/01(木) 10:40:32.36ID:Jj+/G5yda
たぶん珍妙
2021/04/01(木) 10:48:06.97ID:jNbL4ETRd
ワークシートの一部を画像として保存する方法にChartObjectsのExportメソッドがあります
が、罫線が一部消えてしまったりフォントが潰れたりして、画質が悪いのが気に入りません
もっと高画質で範囲指定してスクショを保存する方法はないでしょうか?
100デフォルトの名無しさん (ワッチョイ 6963-VcSF)
垢版 |
2021/04/01(木) 11:51:22.66ID:tUMm1OA70
>>99
クリップボードを手作業で切り取る際、エクセルの倍率
(Ctrl+マウススクロールで変えれるあれ)を100%よりも大きい高倍率で
切り取った方が画質が良い。
従って、その画像を取得するマクロの直前に、
エクセルの画面の大きさを変えれるコードがあるので、
それを直前に入れ、それを切り取れば恐らく高画質のが出来るんじゃないかな。
最後は勿論ばい倍率をもとに戻すマクロを入れれば良いと思う。
101デフォルトの名無しさん (ワッチョイ 62ee-Bi/r)
垢版 |
2021/04/01(木) 12:01:45.09ID:fy6TS88x0
>>90
インスタンス起動ではないですよね
2021/04/01(木) 15:56:27.00ID:yB6nLlLi0
>>92
Ruby で作った。
正規表現の否定先読みなどを使えば、もっとスマートに書けるかも

# ? は、直前のパターンの0〜1回の繰り返し。「https?」は、「http|https」と同じ意味
re = %r!(https?://)! #=> https?:\/\/

input_str = %w(https://a/b.html http://c https://x/y).join
#=> "https://a/b.htmlhttp://chttps://x/y";

pos = input_str.size # 文字列の末尾の位置

results = [ ]

# 文字列の末尾から、一致させていく
while pos = input_str.rindex( re, pos )

# 一致した位置から末尾までを削除して、それを配列の先頭に追加していく
results.unshift input_str.slice!( pos..-1 )
end

p results #=> ["https://a/b.html";, "http://c";, "https://x/y";]
2021/04/01(木) 16:01:13.59ID:yB6nLlLi0
>>102
修正
>re = %r!(https?://)! #=> https?:\/\/
re = %r!https?://! #=> https?:\/\/

( ) は、いらない
2021/04/01(木) 16:53:17.71ID:7y1pTd6e0
>>94
オプションのスマイルカーブをリアルタイムに描画するエクセルソフトとかもあるよ。
105デフォルトの名無しさん (ワイーワ2 FF1a-j37g)
垢版 |
2021/04/01(木) 17:08:13.22ID:jznaQuthF
外部からローカルのファイルを更新するなんてマルウェアみたいだな。
2021/04/01(木) 21:32:16.81ID:5T6IIfi20
>>95
配当なんてせいぜい数%
そこから税金2割引かれる
値上がり益は株価が永遠に上がり続けない限り期待値はゼロで、儲かったら2割税金、損しても2割補填してもらえるなんてことはない
つまり税金を考慮した期待値はマイナス
2021/04/01(木) 23:13:35.12ID:yB6nLlLi0
>損しても2割補填してもらえるなんてことはない

補填してもらえる。
何年か損失を繰り越ししていれば、儲かった時に相殺される

長年、銀行が税金を払わないのは繰越損失があるので、
その後、利益が出ても相殺されるから
2021/04/02(金) 20:32:20.64ID:OjzTopDr0
>>107
永久保証ならな
3年でさようならなんだから期待値はマイナス
2021/04/03(土) 10:18:57.57ID:0vCxCYiYa
最近のはinternetexploreを許否するwebがあるからこまる
スマホならともかくビジネスではまだ主流なのに
2021/04/03(土) 10:25:49.87ID:RckTLwqyd
さすがワッチョイにIEを出す男は言うことが違う
2021/04/03(土) 10:59:03.48ID:D2e+M4g2M
Web開発でIE対応が要件にないときにはむしろ意図的にIEで動かないようにするわ
勝手にIEで使われて文句言われるの最高にウザい
2021/04/03(土) 13:29:03.89ID:XPTw6Pj4M
>>33
自己レスだがわかったわ
WEBクエリでWEB内容をシートに書き出す
その中から出来高とかのワードをfindで探して
そのワードのn行後を取ってくる
みたいな動作をしてるんだけど、
ヤフーファイナンスの仕様が変わって
n行後の場所が変更になってた

ETFだけは従来の場所だから
上記結果がゼロならば違う場所を
取ってくるようにした

コピペプログラマだから
今回findとかOffsetを強制的に
学ばされて勉強になった
2021/04/03(土) 13:43:31.82ID:LoNYZ+kpF
>>110
IEが拒否されるときは
こっそりExcelシートでhtml をつくるだよ
htmlならまず拒否されないから

そーして、いつの間にかフォルダーが開いてる
フォルダー御開帳よ
2021/04/04(日) 02:10:27.86ID:7SFCjwlv0
ListViewのすべての項目を一発で削除する方法はありませんか?
ListBoxならClearメソッドが使えるようなのですが
2021/04/04(日) 03:01:59.01ID:OlWsfN+XM
>>114
ListView.ListItems.Clear
2021/04/04(日) 04:07:16.17ID:hsI5tKvB0
別ブックから別ブックへ値を持ってきたいときって、コピーか配列使うしかないですか?
コピーペーストは処理重そうでスマートっぽくないし、配列は張り付ける範囲をちゃんと指定しなきゃダメなのがめんどくさそうなんですけど、いい方法ないですか?
2021/04/04(日) 06:20:04.03ID:5jDGrLPha
コピーでいいやん
2021/04/04(日) 13:08:15.45ID:X/c7fPAEM
>>116
コピー先ブック.コピー先シート.Range().Value = コピー元ブック.コピー元シート.Range().Value
カッコ内はテキトーに
2021/04/04(日) 13:44:02.06ID:7SFCjwlv0
>>115
ありがとうございます!うまくいきました
すみませんがListViewについてもう一つ教えていただけないでしょうか

MultiSelect=Trueのときの選択項目数をラベルに表示させたいと思っています
リストが選択されるたびに表示を更新したいのですが、なにかいい方法はないでしょうか

ItemClickイベントで項目数を数えようとしましたが、選択数分イベントが発生するため項目数が増えると重くなってしまいます
ListBoxのChangeイベントのように複数選択しても一度しか発生しないイベントがあるといいのですが、無さそうなので困っています
2021/04/04(日) 17:46:13.14ID:JgvM3WMx0
>>116
コピー元もコピー先もシートを変数に入れておけば変数シート.セルで指定は少しスマートにできる
2021/04/04(日) 18:49:59.93ID:hsI5tKvB0
>>116です
>>118さんのいった通りrangeにvalueをつけてあげればrange.value =range.valueでうまく値をいれることができました
まだオブジェクトがうまく理解できていなかったです
もっと勉強したいと思います
ありがとうございました!
2021/04/05(月) 04:34:52.29ID:3N8BM4zS0
セルには0.9って入力してあるのに
VBAのcellsでそれを取得すると1と認識されるんですが
勝手に小数点以下を切り捨てないようにするにはどうしたらいいですか?
2021/04/05(月) 07:04:34.80ID:FxhyQ6l10
Currency型の変数に代入する
2021/04/05(月) 07:43:12.07ID:CnxjloBy0
>>123
そだね
ただCurrency型は小数点4桁までしか扱えないから
上記みたいに小数点1桁だったらいいけど
5桁以上扱ったり掛けたり割ったりする場合はDoubleの方がいいかな

ただ、Double型の場合は
浮動小数点あつかいでIEEE754規格だから
変に丸められちゃうことがあるんでかけ算割り算行う時は
一度整数にして計算してやる必要があるけど

まぁ使い所でどの型使うのか分けて使うのがいいかもね
2021/04/05(月) 12:36:23.48ID:3N8BM4zS0
>>123
>>124
ありがとうございます。integer型にしてました
2021/04/05(月) 17:42:39.68ID:GNHugBRe0
>>122
0.9の小数点以下を切り捨てたら 0 じゃね 
2021/04/05(月) 18:04:06.91ID:34gLfvfqa
別にInteger使う理由もないしlongにしちゃえばとも思う
2021/04/05(月) 19:09:20.57ID:IFZcDQ1J0
>>126
たしかに
2021/04/06(火) 06:08:10.23ID:KMOOpCjWa
型を指定すると遅くなるから
できるだけ指定なしがよいよ
マクロらしさを生かそう
2021/04/06(火) 07:02:52.46ID:Au4GybQm0
>>129
メンテが遅くなるからだめ
2021/04/06(火) 10:21:14.29ID:e+L9SfjT0
>>129
おいおいw
いくら質問スレで初心者だらけだからって
適当なことを教えてはいけない

指定しなかった型には自動的にVariant型が割り当てられて
本来Integer型だったりLong型で済むものに莫大なメモリを割り当てるし当然処理速度も遅くなる

VBAは比較的型の扱いが雑でも何とかなる方ではあるが
頭にプログラムの頭にOption Explicit付けといて型は明示的に設定する癖をつけておいた方がいい
2021/04/06(火) 11:09:39.71ID:jDDsYkyr0
複数の多次元配列をプロシージャに参照渡しするときはどう書けばいいですか
こう書くとスルーされます。

Sub Smple()
Dim ara(2,4) As Variant, arb(85,3) As Variant, arc As Variant)
・・・略
Call SheetCreate(ara(),arb(),arc())
End Sub
Sub SheetCreate(ByRef ara As Variant, ByRef arb As Variant, ByRef As arc As Variant)
・・・略
End Sub
2021/04/06(火) 12:45:54.77ID:e+L9SfjT0
>>132
うん、まあ
引数の型をVariantにしているからでしょうなぁ
何故Variantにすると値渡しになるのかは分からんけど

ちゃんと変数宣言のところで
StringとかIntegerとかの配列型宣言をして
呼び出される関数の引数にも
それに見合った型にすれば参照渡しされるんじゃない?
試してみて
2021/04/06(火) 14:36:15.96ID:jDDsYkyr0
>133
知らなかったです。ありがとうございます
2021/04/06(火) 14:39:05.93ID:7PISA/BhM
>>132
普通に
Sub Smple()
Dim ara(2,4) As Variant, arb(85,3) As Variant, arc As Variant
・・・略
Call SheetCreate(ara, arb, arc)
End Sub
Sub SheetCreate(ara As Variant, arb As Variant, arc As Variant)
・・・略
End Sub
って書けばいいだけだと思う
2021/04/06(火) 19:30:17.02ID:jDDsYkyr0
>>135
最初はそれでやっていたのですが、同じくスルーされてました
このサブプロシージャ内でブレークポイントを設定しても止まらなかったので、サブプロシージャがスルーされていると思っていたのですが、
サブプロシージャを外しても止まらず、別のファイルに書き換えたら動くようになりました。
2021/04/06(火) 19:51:59.72ID:JmeclF78d
ブレークポイントで止まらないのはおかしい
根本的に別のとこで間違ってる
2021/04/06(火) 20:36:50.07ID:DMwNdxSba
うむ、おかしい
2021/04/06(火) 22:23:14.18ID:kxv5hjcy0
Sub Smple()
Dim ara(2, 4) As Variant, arb(85, 3) As Variant, arc As Variant
Call SheetCreate(ara, arb, arc)
End Sub
Sub SheetCreate(ByRef ara() As Variant, ByRef arb() As Variant, ByRef arc As Variant)
End Sub
140デフォルトの名無しさん (ワッチョイ e5da-jIYQ)
垢版 |
2021/04/07(水) 19:30:33.27ID:aMJgToSe0
全部省略すれば勝手にByRefだと思ってけど違うの?

SheetCreate ara, arb, arc

Sub SheetCreate(ara, arb, arc)

End Sub
2021/04/07(水) 20:03:43.34ID:rHsSD320H
>>140
その認識は半分正しいけど半分は場合によるので間違い
とくに配列を渡す場合はややこしい
2021/04/07(水) 20:42:25.04ID:Vn8Hoh2Q0
配列・オブ・カリビアン
2021/04/07(水) 20:47:54.61ID:nkaFkhSP0
>>141
不思議なんだよねー
配列変数だとByrefにしてもVariantで渡すと値渡しになることがある
よしんばVariantが値型だとしても値型の参照渡しで渡るのは参照渡しになるはずなのに何で?
2021/04/08(木) 15:04:36.48ID:6DaO6dJm0
色々しらべたよ
まず、VBAやってる人はByValとByRefくらいしか気にしない人多いけど、
そもそも変数には参照型と値型というのがあって値型は値そのものが変数に入っているけど
参照型というのは実体が入っているんじゃなくて実体の入っている場所の情報が入っているんだよ。
オブジェクトの類が参照型で、StringやIntegerなんかが値型。
参照渡し、値渡しとこの参照型、値型という組み合わせで何が渡るか決まるんだけど

参照型の参照渡し;
引数の入っているアドレス(場所)を見に行って、その引数の中に入っているアドレスに入っているものを見に行くから、
内容を変更すると関数で呼ぶ前のものも変更されるよ

値型の参照渡し;
引数の入っているアドレスをコピーしてそのアドレスが指してるところの値を見に行くから、
内容を変更すると関数で呼ぶ前のものも変更されるよ

参照型の値渡し:
引数の入ってる値をコピーするけど、その引数の中には実体の入ってるアドレスが入ってて、そっちを見に行くから
内容を変更すると関数で呼ぶ前のものも変更されるよ

値型の値渡し
引数の入ってる値をコピーして、そのコピーした値の内容も値そのものが入っているから
内容を変更しても関数を呼ぶ前のものは変更されないよ

まずこれが大前提ね
2021/04/08(木) 15:20:56.67ID:6DaO6dJm0
本題に入るね。
配列変数でもその辺は基本変わらないけど、
何故か値渡しにしようとすると構文エラーになるんだ
そんなときは呼び出し先の引数をVariant型に変えてあげればいいって話だけど、
Variant型にしても参照型のものは参照が見られるから内容を変えれば関数を呼び出す前の内容も変わるんだよね。

variant型の配列を作って値型のものと参照型のものを違う要素に入れてそれを引き数に値渡しで設定してあげると
参照型のものを入れた部分は変更すると関数呼び出す前のものにも反映され、値型の部分は変更が反映されない。
思ったよりお利口さんだったよ。

結論を言うと
何で配列でキチンと型設定して値渡ししようとすると構文エラーで落ちるんじゃマイクロソフトのボケが!!
と言うところに落ち着いたよ
2021/04/08(木) 17:10:39.89ID:OX80XKzVM
うろ覚えで申し訳ないんだけど、引数をByVal TestAry() As Longとかにすれば値渡し出来なかったっけ?
2021/04/08(木) 17:27:48.87ID:6DaO6dJm0
>>146
呼び出し元に設定した変数もしくはリテラル値が型的にあっている、
もしくは暗黙の変換が行われる型ならそもそも設定しているものが値型。
そうでなければエラーになると思う。
2021/04/08(木) 17:47:34.27ID:vZ3ddDF70
質問場所間違ってたら言ってください
iPhone用Excelで仕事の日報を書いてるのですが
時間を書き込んで→を押して数字を書き込むと
前のセルに書き込んだ数字
例えば8:00と書き込んで→を、次に16:00と記入しようと1を押すと8:00:001ってなってしまいます
これってならなくする方法ありますか?
149デフォルトの名無しさん (ワッチョイ 558e-tazQ)
垢版 |
2021/04/08(木) 18:07:25.00ID:BiHFumMw0
>>148
死ね
2021/04/08(木) 18:07:51.70ID:6DaO6dJm0
>>148
iPhoneは持ってるんだけどPC側しか365のアカウント持ってないんだ。ごめんね。
だけどググってみたら書式設定は出来るみたいだから数字にしたいセルの部分をそう書式設定すればいいんじゃないかな?

あと、一応EXCEL関連のスレはここに有ったけど
Excel友の会
https://egg.5ch.net/test/read.cgi/software/1223040168/

何か過疎ってるどころか最後の書き込みが去年の10月だから機能していないね。ここのスレでEXCELのこと聞くのは
ここのスレの住人がみんなOKすれば大丈夫だと思うけど
今まで随分色んなことあったから難しいかも知れないよ。
2021/04/08(木) 19:22:03.89ID:wZLPNhcm0
こんなマクロの使い方もあるようで。
https://anond.hatelabo.jp/20210408000218
2021/04/08(木) 20:16:35.28ID:JmFnD0edM
要素数の限界ってどれくらいなの?
多次元配列で一次元あたり数千とかにしたらメモリ不足のエラーになった
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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