トップページtech
1002コメント383KB

Excel VBA 質問スレ Part39 [転載禁止]©5ch.io

レス数が900を超えています。1000を超えると表示できなくなるよ。
0001デフォルトの名無しさん2015/11/27(金) 20:36:45.35ID:9HV+ag/s
ExcelのVBAに関する質問スレです

                   ___
       ___      /____ヽ      ____
      /____\    | |´・ω・`| |    /___ヽ
      .l |´・ω・`|  ニX二 . ̄ ̄ ̄  二X二  |´・ω・`| l 俺たちに任せろ
      !、 ̄ ̄ ̄  ヽ   |       |    /    ̄ ̄ ̄/
       ヽ_/ヽ、  ヽ__)  \__/\_/.   /_/  ノヽ_/
             ̄                ̄ ̄

このスレはコード書き込みOKです。
作成依頼もOKですが、作成依頼限定ではありません。

コードが嫌な人・作成依頼が嫌な人は別スレ建ててください。

※前スレ
Excel VBA 質問スレ Part38 [転載禁止]2ch.net
http://peace.2ch.net/test/read.cgi/tech/1441619979/
0820デフォルトの名無しさん2016/02/10(水) 13:39:21.10ID:OnEbfKeK
>>817
短絡評価の話なら
If 条件A Then If 条件B Then 〜
でいいでしょ
0821デフォルトの名無しさん2016/02/10(水) 16:31:02.12ID:6eyh9AMR
>>819
ぬるぽ
0822デフォルトの名無しさん2016/02/10(水) 16:38:25.44ID:zs62Z3CJ
>>821
ガッ
0823デフォルトの名無しさん2016/02/10(水) 16:54:10.35ID:YqpZzmVY
すいません、教えてください。
毎日使っているマクロで最近エラーが出るようになりました。
コードの一部を下に貼ります。
C=Range・・・(中略)の行で「実行時エラー '6' オーバーフローしました」が出てしまいます。

Dim C As Variant
LastRow = SourceWS.Cells(Rows.Count, "B").End(xlUp).Row
FirstRow = SourceWS.Cells(LastRow, "B").End(xlUp).Row
C = Range(SourceWS.Cells(FirstRow, "A"), SourceWS.Cells(LastRow, "J"))
08248232016/02/10(水) 16:58:27.84ID:YqpZzmVY
その他の情報を追記します。

変数のSourceWS、LastRow、FirstRowには正しく格納されていることを確認しています。
ちなみにLastRowは200000ぐらいでした(これは日によって変わります。10万以上であることがほとんど)
08258232016/02/10(水) 17:08:28.76ID:YqpZzmVY
追記

A列のセルは今までは空欄でした。
つい最近からA列には整数を格納するように変更しました
(GetTickCountで取得した整数です)

恐らくこの変更が影響していると思うのですが原因がわかりません。
どなたかヒントをお願いします。
0826デフォルトの名無しさん2016/02/10(水) 17:56:27.46ID:6eyh9AMR
>>825
Cells(FirstRow, "A") ってなんかおかしくない?
0827デフォルトの名無しさん2016/02/10(水) 20:20:29.77ID:YqpZzmVY
>>826
すみません。どこがおかしいかわかりません。
変数Cに格納する行範囲をB列で判断しているのですが・・・
その行範囲のA列からJ列をバリアント配列Cに格納し、
その後他のブックに貼り付けています。
0828デフォルトの名無しさん2016/02/10(水) 21:06:36.31ID:QrO94O6C
>>827
普通に指定している行が多すぎるんじゃない?

Function Test(o As Range) As String()
Const BatchWidth = 100 '一度に処理する行数
Dim S() As String

With o
t = .Row
b = .Rows.Count
l = .Column
r = .Columns.Count
End With

ShiftC = r - l + 1
ReDim S(1 To b - t + 1, 1 To ShiftC)

For i = t To b Step BatchWidth
sc = i + BatchWidth - 1
If b < sc Then bw = b Else bw = sc
x = Range(o.Cells(i, 1), o.Cells(bw, ShiftC))
For pr = i To bw
For pc = 1 To ShiftC
S(pr, pc) = x(pr - i + 1, pc)
Next
Next
Next

Test = S
End Function

こんな感じでVariant型配列よりも容量の小さい配列に分割処理して入れ込んでみるとかで解決しないかな。
0829デフォルトの名無しさん2016/02/10(水) 21:11:14.10ID:5Sg0dwj9
vba開くときにいつからか、EXCEL OBJECTSとpersonal.xlsbが毎回全展開されるようになったんですけど、直す方法ありませんか?
0830デフォルトの名無しさん2016/02/10(水) 22:49:55.78ID:CjFlMRzq
>>823
要素数2百万くらいどうってことない気がするが、何だろうな。
0831デフォルトの名無しさん2016/02/10(水) 22:56:58.93ID:W4AkdBgm
>>830
何ですか2百万て?間違ってる上にセンスない回答ですね。
無能は黙っててください。
0832デフォルトの名無しさん2016/02/10(水) 23:01:11.33ID:UeLxeYgc
>>831

じゃあまずアンタが黙らないとね
0833デフォルトの名無しさん2016/02/10(水) 23:01:33.33ID:CjFlMRzq
>>831
ハア?
FirstRowがいつくかわからんが、LastRowが200000ぐらいでA〜J列なんだろ?違うの?
0834デフォルトの名無しさん2016/02/10(水) 23:02:19.87ID:W4AkdBgm
>>832
残念ですが僕は無能ではありません。ハズレ!
0835デフォルトの名無しさん2016/02/10(水) 23:03:08.82ID:W4AkdBgm
>>833
おいおまえ数字読めないのか!?
08368232016/02/10(水) 23:15:33.87ID:YqpZzmVY
FirstRowは2であることが多いです。
今回エラーが発生した時の、行数は約20万、列数はA〜Jの10列なので要素数としては約200万でした。
0837デフォルトの名無しさん2016/02/10(水) 23:16:03.19ID:UeLxeYgc
>>834-835
LastRowが200000ぐらい、FirstRowは不明だが最小で1なので
行数は20万前後とする。
A〜Jで10列、
つまり要素数は20万行 * 10列 で200万件
小学生でも出来る計算だぞ
0838デフォルトの名無しさん2016/02/10(水) 23:19:33.56ID:CjFlMRzq
>>835
何を言いたいのかわからんが、自分の環境(イミディエイト)でこう出るんだが?

FirstRow=1 : LastRow = 200000
?Range(Cells(FirstRow, "A"), Cells(LastRow, "J")).Count
2000000

要素数2百万の配列になるんじゃないのか?
0839デフォルトの名無しさん2016/02/10(水) 23:23:31.90ID:CjFlMRzq
>>834-835
はこういう勘違いをしてるのかな?

FirstRow=1 : LastRow = 200000

C = Range(Cells(FirstRow, "A"), Cells(LastRow, "J"))
?typename(C)
Variant()



set C = Range(Cells(FirstRow, "A"), Cells(LastRow, "J"))
?typename(C)
Range

の違い。
0840デフォルトの名無しさん2016/02/10(水) 23:24:31.96ID:W4AkdBgm
>>838
おいお前要素数200万であってるじゃねーか?
まぎらわしい事言うなよ!
でも200万とオバーフローは金輪際関係ないから!
お前がセンスないのは俺のほうが正しい!
0841デフォルトの名無しさん2016/02/10(水) 23:25:53.23ID:jMBe0mp+
ただ単純にメモリーが足りないだけなんじゃないの
常駐ソフトを全部停止させて動かしてみた?
0842デフォルトの名無しさん2016/02/10(水) 23:26:10.04ID:QrO94O6C
深酒は身体に毒ですよ
0843デフォルトの名無しさん2016/02/10(水) 23:26:10.66ID:CjFlMRzq
>>840
俺は最初から >>830 で
「要素数2百万くらいどうってことない気がする」
と言っているのだがな。
0844デフォルトの名無しさん2016/02/10(水) 23:27:52.95ID:W4AkdBgm
>>842
お前は正しいw
0845デフォルトの名無しさん2016/02/10(水) 23:30:18.01ID:TYDlKOEk
xlsとか古い形式だとcell()でも65535行までしかつかえないっていうのは関係ない?
08468232016/02/10(水) 23:33:40.88ID:YqpZzmVY
なんか私の質問で荒れ気味になってしまって申し訳ないです。

>>845
最初に書いてなくてすみません。
エクセル2010でxlsmです。
08478232016/02/10(水) 23:36:48.09ID:YqpZzmVY
>>841
常駐ソフト停止することを試していませんが、
それならば、メモリが不足しています、のエラーになるかと。
オーバーフローというのが解決のヒントかと個人的には思います。
0848デフォルトの名無しさん2016/02/10(水) 23:36:48.13ID:W4AkdBgm
>>846
謝るな!荒したのは俺だw
まあ俺は答えは分からんがガンバってくれたまえwww
0849デフォルトの名無しさん2016/02/10(水) 23:38:29.98ID:YqpZzmVY
>>848
なんかワロたw
0850デフォルトの名無しさん2016/02/10(水) 23:43:11.68ID:CjFlMRzq
>>847
一応聞くけどGetTickCountの値はどの程度?
それとDeclare文の宣言はどうなってますかね?
0851デフォルトの名無しさん2016/02/10(水) 23:49:20.06ID:jMBe0mp+
>>847
確かにメモリーが不足していますのエラーってあるよね
でもなんとなく
その行がエラーを出すんじゃなくてそれより前のコードで大量にメモリーを使用したままなんじゃないのかなぁ

だって結局こういうことでしょ
Sub sample()
Dim C As Variant
C = Range("A1:J200000")
End Sub
0852デフォルトの名無しさん2016/02/10(水) 23:49:30.85ID:YqpZzmVY
>>850

GetTickCountの値:
→190423431〜217241781

Declare文の宣言はどうなってますかね:
→Declare Function GetTickCount Lib "KERNEL32.DLL" () As Long
0853デフォルトの名無しさん2016/02/11(木) 00:10:42.37ID:cll589HH
>>852
LastRowやFirstRowの型、
それとGetTickCountを何かの変数に格納しているならその変数の型、
いずれも十分なサイズなんですよね?

うーむ
08548232016/02/11(木) 00:32:34.09ID:GSEE6twL
>>828>>851
申し訳ありませんが私の知識不足により貴方のレスの意図が理解できていません。
コメント返すまで時間をください・・・

>>853

LastRowやFirstRowの型:
→Dim FirstRow As Long
→Dim LastRow As Long

GetTickCountを何かの変数に格納しているならその変数の型:
→Public Out(1 To 1, 1 To 7) '←標準モジュールにPublicで宣言(variantは明示してませんが)
→Out(1, 1) = GetTickCount 'GetTickCountはVariant変数に直接格納しています

この変数Outを後ほどセルに書き出しています。
0855デフォルトの名無しさん2016/02/11(木) 00:47:48.35ID:mEBsgK8a
>>854
たとえばさ、

C = Range(SourceWS.Cells(FirstRow, "A"), SourceWS.Cells(LastRow, "A"))

でもエラーになるの?

エラーが出始めた前後で、
貴方に心当たりがあるのはA列の変化だけなんでしょ?

だったらその値だけを取得してもエラーになるかどうか試してみたら?
0856デフォルトの名無しさん2016/02/11(木) 03:30:20.36ID:GSEE6twL
>>855
>>823とは異なるデータ(行数は約19万)でまたもオーバーフローしたので>>855を試してみました。
エラーが出た後、デバッグをクリックし、イミディエイトウィンドウに、

C = Range(SourceWS.Cells(FirstRow, "A"), SourceWS.Cells(LastRow, "A"))
としたところオーバーフローしました。ただ、

C = Range(SourceWS.Cells(FirstRow, "B"), SourceWS.Cells(LastRow, "B"))
↑ではエラーとなりませんでした。

C = Range(SourceWS.Cells(FirstRow, "B"), SourceWS.Cells(LastRow, "J"))
↑これもエラーとなりませんでした。

また、A列のデータを全てクリヤした後マクロを実行すると、
C = Range(SourceWS.Cells(FirstRow, "A"), SourceWS.Cells(LastRow, "J"))
↑最近毎回エラーとなるここでエラーが出ませんでした。

どうやら、A列のデータ次第でエラーが出たり出なかったりしているようです。
でもまだ原因がわかりません。どなたか助けてください。
0857デフォルトの名無しさん2016/02/11(木) 04:14:34.02ID:b/HRrcI5
>>856
いろいろテストしたけど
A列の中に かなり大きな値で書式設定(通貨or会計とか)してるセルない?
一度 A列全選択して書式を標準にしたらどうでしょうか?

こちらでテストしたら(Excel2016) データが
=10^15
又は
1000000000000000

で書式が 通貨or会計の時

Dim c As Variant
c = Range("a1")

がオーバーフローになる(書式が標準や数値の時にはならない)
0858デフォルトの名無しさん2016/02/11(木) 07:23:22.39ID:mEBsgK8a
>>856
いや、あのさあ、もうちょっと応用を利かそうよ
A列に問題があるって分かったんなら、
次はそのなかでどの行に問題があるかを調べていくんだよ

例えば
Dim i As Long も宣言しといて
For i = FirstRow To LastRow
Debug.Print C = SourceWS.Cells(i, 1)
Next i
なんてやるとかできるじゃん

あるいは1セルずつだと止まらないかもしれないから
その時は
For i = 1 To LastRow - FirstRow + 1
C = SourceWS.Cells(FirstRow, 1).Resize(i)
Next i
でどこまで行数増やしたら止まるのかをしらべるとかさ

そうやって問題点を絞り込んでいけば
仮に原因までは分らなくても回避策は講じられるかもしれないでしょ
0859デフォルトの名無しさん2016/02/11(木) 09:29:53.37ID:cll589HH
>>857
あなたの問題を検証しようとしていたら環境がおかしく(?)なってきた。

>>825
「A列のセルにGetTickCountで取得した整数を格納した」
と書いてあるので、セル範囲に直接 =GetTickCount() として値を入れてみた。
そうすると以下の2パターンでエクセルが落ちる。

1. 当該範囲を選択後、C = Selection.value としてVariant配列を作成したとき
2. 値を入れた領域の右側のセルに行って ctrl + R でコピーしたとき

まっさらなシートでやってもエクセルを立ち上げ直してもOSを立ち上げ直しても再現する。
これまでこんなことはなかった気がするが、なんだこりゃ?
Office Personal 2010 Excel 14.0.7163.5000(64ビット)
0860デフォルトの名無しさん2016/02/11(木) 12:57:34.93ID:GSEE6twL
>>857
いろいろテストして頂きありがとうございました。
>>858の方法で一行ずつVariant変数に格納してみたところ、
上の方の行では問題ありませんでしたが、13万行あたりでエラー。
その行のA列の書式は日付型でした。
正常にVariantに格納できていた行のA列は標準書式でした。

A列の書式を全て標準とすることで当初のマクロは正常に動きました。
なぜこれでエラーが回避できたのかはわかりませんが、とりあえず大きく前進しました。
ありがとうございました。

>>858
858の一行ずつ格納するコードを実行することでA列書式が影響していることがわかりました。
ありがとうございました。

>>859
私の問題で迷惑をかけてしまい申し訳ありません。
私の環境で1,2を試してみましたがエクセルは落ちませんでした。

OFFICE2010 32bit + Win7 64bit
08618232016/02/11(木) 12:59:46.57ID:GSEE6twL
補足です。

かつてA列には日付が入っており、その名残というか当時の書式が残ってしまっていたようです。
0862デフォルトの名無しさん2016/02/11(木) 14:46:45.09ID:2zWchetY
>>860
> 私の問題で迷惑をかけてしまい申し訳ありません。
いや、そう言うケースでエラーになるのは俺には勉強になったよ
0863デフォルトの名無しさん2016/02/11(木) 15:44:40.95ID:cll589HH
>>860
一体なんだったのかわからん。
さて、ドキュメント作成の作業に戻ろう...
0864デフォルトの名無しさん2016/02/11(木) 23:27:10.13ID:8WhoCP6O
Range.Valueはエクセルでの値を、VBAの値に変換変換して返す
その際に型を選択するんだが、元の値がその型に収まらない場合エラーが出る
今に始まった話じゃないし、対策としてRange.Value2ってのも実装されてる
0865デフォルトの名無しさん2016/02/11(木) 23:56:26.18ID:zhBGlfG9
あるフォルダに入っている複数のエクセルブックの1シート目に欲しいデータがある。
それぞれのシートのA1,A2,B1,B2,C1,C2と固有のセルデータを所得して、
それを新たなブックに1行ずつデータを順に張り付けたい。

1行が1ブック(シート)分のデータになるようにしたい。
どのようにVBAを書けばいいですか

Excel2010でお願いします。
0866デフォルトの名無しさん2016/02/12(金) 00:06:05.03ID:4EYM4HYY
こういう投げやりな質問は報酬制にしてほしいね
0867デフォルトの名無しさん2016/02/12(金) 00:22:05.65ID:NB9uA2aw
どのようにって
普通に書けばいいですね
0868デフォルトの名無しさん2016/02/12(金) 01:59:27.96ID:gunxxlb9
やりたいことを1つずつ調べなよ。
他のブックを参照する、特定のセルの値をとる、
1行ずつブックに値を書く、とかね。
0869デフォルトの名無しさん2016/02/12(金) 06:02:16.01ID:4KxhZPev
>>866
ちなみにいくらぐらい欲しいの?
こんなの報酬もらおうにも100円ぐらいの内容だと思うけど
0870デフォルトの名無しさん2016/02/12(金) 06:08:37.28ID:Fbay5uRw
用件聞いてサンプルデータ貰ってコード書いてテストして、
で、一日かかるかどうかだから二万円くらいじゃね?
0871デフォルトの名無しさん2016/02/12(金) 07:44:15.34ID:vUMz7FOm
プログラマの報酬って1行10円計算と違うん?
0872デフォルトの名無しさん2016/02/12(金) 08:41:10.25ID:eUWMATXs
>>869
100円ww

君のような事例が今のIT業界を作ってるんだなって改めて思ったわ。
0873デフォルトの名無しさん2016/02/12(金) 08:53:48.16ID:6JIdb1d4
>>869
5万円欲しい
0874デフォルトの名無しさん2016/02/12(金) 09:42:12.77ID:tdFcrErR
1人月100万だとすると1日工数で5万。
人月仕事って高いよな
0875デフォルトの名無しさん2016/02/12(金) 12:23:58.29ID:IOOvL8tC
以上、答えられない質問のかわし方でした。
0876デフォルトの名無しさん2016/02/12(金) 16:56:54.83ID:OpesMGU+
インデックスが有効範囲にないならという記述はできますでしょうか?

a(10,10)という配列があり

if a(10,t) > 50 then
のように使うとき、tが12とかだったらエラになりますが、これの回避の仕方をご教授お願いいたします。
0877デフォルトの名無しさん2016/02/12(金) 17:03:35.83ID:vtZ9jqP1
>>876
例外処理をする
0878デフォルトの名無しさん2016/02/12(金) 17:22:44.29ID:0HgA+kac
VBAってlinuxでもできますの?
0879デフォルトの名無しさん2016/02/12(金) 17:24:28.01ID:OpesMGU+
on error goto indexerror
のように作っておけばいいのですね。
勉強になりました!
0880デフォルトの名無しさん2016/02/12(金) 17:45:43.40ID:4KxhZPev
>>879
On Error は他に適当な回避策がないときや、
回避策があってもそれやるがメンドクサイ時とかに使うもんであって
配列の要素数なんて簡単に分るんだから
横着せずにちゃんと UBound と LBound を使って処理しようよ

If (LBound(a, 2) <= t) And (UBound(a, 2) >= t) Then
if a(10,t) > 50 then
End If
End If

のほうが良いよ
0881デフォルトの名無しさん2016/02/12(金) 17:45:50.42ID:Xj/79B1T
こんなところでウダウダしてないで、それを生かして社会貢献してください
0882デフォルトの名無しさん2016/02/12(金) 18:31:13.80ID:hlhHAQgj
>>878
可能
VirtualBox + Windows + Excel と言う構成で良ければ
08838232016/02/13(土) 19:38:51.24ID:EYTUo5+J
>>864
レス遅くなってすいません。

"日付"書式のセルの値をValueプロパティで取り出そうとすると
日付書式の制限(西暦100年1月1日〜西暦9999年12月31日:-657434〜2958465)
を超えるとオーバーフローする、という理解で正しいでしょうか?

Value2というものがあるということは知っていましたが、このようなときに使うんですね。
とても勉強になりました。ありがとうございました。

ValueよりもValue2の方が優れているように感じます。
今後Valueプロパティではなく全てValue2プロパティを使うことにすると何か問題ってありませんかね?
例えば処理が若干遅いとか・・・
0884デフォルトの名無しさん2016/02/13(土) 21:49:38.36ID:GDWv9XcG
>>883
処理速度はValue2の方が速い
0885デフォルトの名無しさん2016/02/13(土) 22:19:41.35ID:2d9oUeOe
「Value2」てもっと違う名前考えつかなかったのかね?
0886デフォルトの名無しさん2016/02/13(土) 22:41:26.61ID:f/VF2KeB
NewWindow2とか
0887デフォルトの名無しさん2016/02/13(土) 23:19:04.31ID:OylkXFzp
>>865

そのまま回答するのはめんどくさい。
https://www.moug.net/tech/exvba/0060037.html
を参考にできんじゃね。
0888デフォルトの名無しさん2016/02/14(日) 00:13:22.48ID:zC+zpx/w
valueとvalue2の違いは?
0889デフォルトの名無しさん2016/02/14(日) 01:10:16.92ID:fDQc/eCz
>>888
通貨型と日付のシリアル値が取得できる
それ以外の型では違わない
0890デフォルトの名無しさん2016/02/14(日) 01:11:01.50ID:zC+zpx/w
>>889
ありがとうございます
0891デフォルトの名無しさん2016/02/14(日) 01:34:20.60ID:AnW4+fzX
そろそろエクセルマクロもC♯になったりしないかね。
0892デフォルトの名無しさん2016/02/14(日) 01:42:46.28ID:zC+zpx/w
別の言語を学ばないといけなくなるのはNG
0893デフォルトの名無しさん2016/02/14(日) 01:43:20.90ID:UrOJS99m
Googleのスプレッドシートはjavascriptだったっけか
0894デフォルトの名無しさん2016/02/14(日) 02:06:30.53ID:SJCumIm8
仮に新しいコンパイラ装備するとなったら、今の風潮からするとF#辺りぶっこんできそうではある。
C系列ならBASIC系列よりよっぽど簡単に覚えられるからC#でもJavaでも大した問題にはならないんだが。
0895デフォルトの名無しさん2016/02/14(日) 05:49:53.65ID:RVpb+5w9
>>892
両方使えるようにすりゃいいだけ
0896デフォルトの名無しさん2016/02/14(日) 07:51:34.27ID:fDQc/eCz
VBAじゃなくてフルセットのVBが使えるようにすれば無問題
機能的にも速度的にも

ていうか、素直にVB使えばええやん
もしかして無料って知られてない?
会社のルールでインスコできないヤツはご愁傷様
0897デフォルトの名無しさん2016/02/14(日) 10:13:31.34ID:/e94Iuh/
i=i+1を書くのが嫌だ
0898デフォルトの名無しさん2016/02/14(日) 11:02:24.78ID:fDQc/eCz
インクリメント、ビットシフト演算子、符号なし整数型あたりは欲しいときがけっこうある
0899デフォルトの名無しさん2016/02/14(日) 12:29:32.95ID:qwowkzgX
VBだとVBAのようなVariant型は使えないんだっけ?
0900デフォルトの名無しさん2016/02/14(日) 12:43:28.94ID:SJCumIm8
>>899
VBAまでのバージョンだと仕様的に基本的なデータ型を別に扱わなければならなかったせいで、
Variant型が必要だったけど、VB.NETになって全てObject型で扱う事が出来るから廃止された。

という風にググッたら書いてあった。
0901デフォルトの名無しさん2016/02/14(日) 13:16:52.23ID:+WF+5Yyl
そのObject型配列にセル範囲データを簡単に突っ込めるならいいかも。
でも大幅な書き換え作業はやっぱりいやだな。いま出来ている事ができなくなる不安もあるし。
0902デフォルトの名無しさん2016/02/14(日) 19:29:42.13ID:I7Qc+kxz
array関数を使うとオブジェクト型の変数もその他もお構いなしに突っ込めるのは関数だからのようですが
ここだけsetの洗礼を免れるのは違和感があるんですが本当にいいんです?
func(obj1, obj2)
dim a
a = array(obj1, obj2, 1, "挿入")
set a(0) = nothing
a = array()
それとこういう場合のnothingし忘れたobj2の参照はどうなるんでしょうかね
0903デフォルトの名無しさん2016/02/14(日) 19:56:22.66ID:SJCumIm8
C系列の言語から入ってくるとVBAの特殊な環境に戸惑うというのは分かる。
でもなんで自分で実験すりゃ済む事を疑問として抱え込んだり、出来ないと思い込んでVBAの欠点だと騒ぐんだろう。
0904デフォルトの名無しさん2016/02/14(日) 20:03:05.35ID:Bsnhcx6p
>>902
>オブジェクト型の変数もその他もお構いなしに突っ込めるのは関数だから
ちがいます
要素がバリアント型なので普通の値もオブジェクトも格納できるだけです

Nothingし忘れはどうなるだろうな
配列の要素まで参照カウンタ減らしてくれるかな?
デストラクタ(Class_Terminate)にログ仕込んだクラス作って実験してみればわかるんじゃね
0905デフォルトの名無しさん2016/02/14(日) 20:08:24.25ID:viQJz0oS
下のように、あるモジュールで開いたメモ帳の装置番号をおなじモジュール内の違うプロシージャに引き継がせたいのですが、どうすれば良いのでしょうか。
変数ならprivate subを使えば良いようですが、ファイルの装置番号の引き継がせかたがわかりません。すみませんがお願いいたします

sub a()
open 〜input.txt output as #1
call b
endsub

sub b()
print #1
close #1
end sub
0906デフォルトの名無しさん2016/02/14(日) 20:22:40.85ID:0n9Q+x/K
>>905
sub(a)の上行に public 装置番号
とか宣言すればモジュール内で使えます

workシートのあるセルを使っても引き渡せます
0907デフォルトの名無しさん2016/02/14(日) 20:49:27.29ID:qwowkzgX
>>904
たぶん>>902はなぜ Set = と書かなくても格納できるのかを疑問視してるんじゃない?

バリアント型だから普通の値もオブジェクトも格納できるってのはその通りだけど、Set = と書かなくてすむ
別の理由を求めたいんだろう。
0908デフォルトの名無しさん2016/02/14(日) 20:50:38.97ID:qwowkzgX
>>903
>なんで自分で実験すりゃ済む事を疑問として抱え込んだり、出来ないと思い込んでVBAの欠点だと騒ぐんだろう。

ふつうは実験する前に規格があるからじゃない?
0909デフォルトの名無しさん2016/02/14(日) 21:10:13.27ID:1RrNJs8y
>>906
セルで引き渡します。ありがとうございました
0910デフォルトの名無しさん2016/02/14(日) 22:02:39.06ID:+EEU6IXV
>>902
> ここだけsetの洗礼を免れるのは違和感があるんですが本当にいいんです?
いいも何もマイクロソフトがそれでいいと思ったからこうなってるだけだしな。
元々Setが必要なのはデフォルトプロパティが紛らわしいから値の代入と参照の代入を区別する為だけど、
マイクロソフトはArray()関数の引数でデフォルトプロパティを使いたい場面はないと判断しだんだろ。
必要だと思えばそれなりの構文を用意してくるはずだ。

要するにそういう決まりだというだけで、何ら論理的な理由はない。
受けいれるか受けいれないかだけだ。


あと、必ず最後にNothingを代入するのはやめろ。
メモリの解放を人が管理するとかならず漏れがあるから言語側で面倒を見てくれているのだから
Nothingの代入を書く癖がつくと当然書き漏らしが出てくる。
そして、そのプログラムを見た誰かは当然「どうしてここだけNothingが代入されていないのか」
という無駄な疑問を抱く事になる。プログラム的にな何ら問題がないにもかかわらず、だ。
つまり、どうしても他人を混乱に落しいれたいのでなければ余計な事はするな。
Nothingは代入するな。
0911デフォルトの名無しさん2016/02/14(日) 22:11:05.23ID:Ahl3Hrvy
>Nothingの代入を書く癖がつくと当然書き漏らしが出てくる。

この前提が間違ってる
「万が一書き漏らした場合には他者がそのコードを見たときに混乱する可能性も有る」
という程度の話なら理解できるけど
0912デフォルトの名無しさん2016/02/14(日) 22:11:45.16ID:SJCumIm8
ループ内でNewする時は明示的にNothing入れないとメモリを圧迫していくから、
そこには注意する必要があるけどな。

最後にNothing入れたい変数を持つ一連の処理は可能な限り別関数にすべきだけど。
0913デフォルトの名無しさん2016/02/14(日) 22:13:39.02ID:+EEU6IXV
>>911
お前は万が一かもしれんが、普通の人は十が一程度なのだよ。
0914デフォルトの名無しさん2016/02/14(日) 22:28:57.78ID:LvmVag53
変数が使われなくなった時点で開放されるだろ
信じろ
もしメモリが開放されてなかったら馬鹿にしてもらってもいい
0915デフォルトの名無しさん2016/02/14(日) 22:46:01.63ID:Ahl3Hrvy
>>913
その程度の人物なら他人の書き漏らしにも気付かないから
結局同じ事だよ
0916デフォルトの名無しさん2016/02/14(日) 22:58:05.65ID:Bsnhcx6p
>>912
>ループ内でNewする時は明示的にNothing入れないとメモリを圧迫していく
軽く試した範囲では、新しいインスタンス代入した時点で、前のインスタンスは破棄されてるっぽいぞ
当然他に参照が無い前提だぞ

>>914
循環参照とかしてると、使われなくなった後も開放されないんだが
まあ、参照されてるわけだから、使われなくなっていないと言えなくもないが
0917デフォルトの名無しさん2016/02/14(日) 22:58:31.32ID:qwowkzgX
>>910
そういうことを推測すること自体おかしいよ。
言語仕様を規格化していないことは罪だ。
0918デフォルトの名無しさん2016/02/15(月) 01:13:01.96ID:akbmk0Ll
マクロで一通りのこと出来るようになったと思ってたけどここの話を見てると全然何言ってるかわからないわ
0919デフォルトの名無しさん2016/02/15(月) 06:37:55.70ID:Lkye5vJL
言ってる本人達も9割分かってないわw
レス数が900を超えています。1000を超えると表示できなくなるよ。