VBAなんでも質問スレ Part2 [転載禁止]©2ch.net

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2015/05/21(木) 10:52:44.71ID:KLv0vQmm
VBAを使った質問ならなんでもござれ
本来の対象であるオフィスアプリを操作する以外の話もOK

ゲーム作り、Webアクセス、外部アプリの操作
COM(ActiveX)、Win32API、.NET Framework、DirectXなどなど
VBAで実行するものであればなんでも質問してください

VBAを開発環境としていろいろ作っちゃいましょう

前スレ

VBAなんでも質問スレ
http://peace.2ch.net/test/read.cgi/tech/1342087380/

関連スレ

Excel VBA 質問スレ Part36 [転載禁止]©2ch.net
http://peace.2ch.net/test/read.cgi/tech/1419718732/

Access VBA 質問スレ Part1
http://peace.2ch.net/test/read.cgi/tech/1328536426/

VBプログラマ質問スレ(Ver.6.0 まで) part64
http://peace.2ch.net/test/read.cgi/tech/1393069842/

Excel総合相談所 118 [転載禁止]©2ch.net
http://peace.2ch.net/test/read.cgi/bsoft/1430352555/
220218
垢版 |
2016/06/16(木) 07:48:37.40ID:MO4h1nff
>>219
同期処理に変えたら全く落ちなくなりました。
どうやら推測は当たったみたいです。

手動で立ちあげてる時には同じトラブルは一度も起こったこと無く、誰からも聞いていないので、
VBA処理が原因で間違いないと思います。

ぐぐっては見てたんですけど、VBA関連でのエラー報告は0でしたね。
しかし、元々この手のトラブル報告がかなり多いことにはびっくりしました。

とりあえずは解決です。皆さんどうも有難うございました。
2016/06/16(木) 14:05:29.72ID:tOwQ8tvq
タイミングの問題で、バグが起きるときは、

sleep 3秒などで、時間稼ぎすることが多いな
2016/06/16(木) 16:27:03.77ID:YtVxucfB
>>221
タイミングというか処理を待ち合わせる必要があるって事だよな
3秒で完了しない処理だと問題が起きる
90%くらい解決出来れば実用上は問題にならないかも知れないけど
2016/06/16(木) 21:40:45.67ID:JOmdLZoV
' キャッシュ反映を待って5秒待つ

↑これなんとかして
2016/06/16(木) 21:53:33.23ID:EpEOLr57
>>223
何のキャッシュか判らないけど
キャッシュをフラッシュするインターフェイスがあればそれを使えば良いのでは
無いなら知らない
2016/06/17(金) 01:16:02.29ID:Sh+IdTol
起動方法と起動のタイミングの問題で
>1分〜数分以内に「エクスプローラは停止しました」
>場合によっては20分くらい経ってからクラッシュ
のような症状が出るとは考えにくいけどな

まあ、直ったって言うならそれでいいけど
226樵の結び目。
垢版 |
2016/09/03(土) 18:27:18.44ID:Ms7vNg4j
この作者について
http://img.atwikiimg.com/www9.atwiki.jp/gensouv/attach/346/23/ExcelVBAPractice.html
どう思いますか??
 
227デフォルトの名無しさん
垢版 |
2016/09/28(水) 19:27:48.59ID:BVBInYIb
vbaの And, Or って短絡評価してくれないの???
2016/09/28(水) 20:30:34.84ID:X231kNmm
>>227
普通しない
(常にしないかどうかは知らんけど)
2016/09/28(水) 22:20:25.14ID:w7cfX4QA
X(n) And Y(m) で X(n) = False だった場合、Y(m) は評価しなくても式が False と確定する
Or でも同様のことが可能

VBAがショートサーキットしているかどうかは、各関数で Debug ログを出力してみればわかる
2016/09/29(木) 04:55:17.68ID:IF5lu7hc
>>229
いちいち短絡評価の説明なんてしなくていいよ...
231227
垢版 |
2016/09/29(木) 08:22:26.74ID:l2tsRcXf
くぅ。
短絡評価してくれるもんだと思って、
True, False, Nullを返す関数の結果で、
NullをFalseに倒したくて、
左辺でNot isNullやってたけど、
右辺もNullで動いてしまってエラーになってはまったわ。
2016/09/29(木) 12:46:05.66ID:tIM+raH6
VBAあるある
2016/10/06(木) 19:51:33.65ID:prbbit7d
.NetならOrElseやAndAlsoが使えるし
Nullable指定も出来るから便利なんだけどなー

まあ無いものねだりしても始まらないか
2016/10/08(土) 17:43:11.29ID:fiaM9vLl
VB(A)はWithとかある割にそういうとこは全然気が利かないよな
C言語すら知らない人が作った言語なんだろう事は判る
2016/10/08(土) 22:59:38.27ID:315EhZFM
VBって元々はMSじゃないんだよね BASIC好きのゲイツが惚れ込んで買収しただけ
2016/10/27(木) 20:44:38.40ID:LE0ob9Yw
vbaの中、上級者向けの書籍を教えてください
2016/10/27(木) 21:44:23.99ID:BIHhfe0H
漠然と「VBAの初心者向けの本を教えてください」ってのはよくあるが、上級者向けは珍しいね
ある程度基礎が身に付き、やりたいことが分かってきていれば
○○に関する本、ってなるように思うんだが・・・

田中亨氏の「Excel VBA 逆引き辞典パーフェクト 」は名著だよ
2016/10/28(金) 04:23:54.86ID:s9odN72t
>>237
ありがとうございます。
クラスや多段階配列、イベント自作、擬似コントロール配列あたりの情報がある書籍はありませんか?
2016/10/28(金) 15:06:05.95ID:Sg+Wt/Uz
アプリ作成で学ぶExcel VBAプログラミングユーザーフォーム&コントロール(横山達大著)
かんたんプログラミング 応用編(大村あつし著)
同じく、かんたんプログラミング コントロール関数編

デバッグ関連だと
立山秀利著の本
2016/10/29(土) 23:22:10.90ID:b3lytwnZ
VBAでコードを抜き出してSVNやgitで管理したりするとそれだけで上級者っぽくなる
241デフォルトの名無しさん
垢版 |
2016/10/30(日) 08:10:21.54ID:R4QvvoTp
それ以上にバカっぽいけどなw
2016/10/30(日) 09:23:46.57ID:2kQlDpFE
今時差分管理もしてないのかよ
2016/10/31(月) 23:59:17.10ID:9abcSnRr
VBACとか使ってんの?
2017/02/06(月) 12:06:59.89ID:1XFRepCN
PowerPointのVBAでファイルを閉じた後も変数の値が保存されるようにしたいんですが外部のテキストに書き出す以外にファイル本体にどうにかして埋め込む方法はありますか?
2017/02/06(月) 14:57:53.43ID:atuXlQHb
透明のシェイプとかに書くとか色々あるけど
実際本体ファイルを更新されるとバージョン管理とか使う側が気持ち悪がるとか運用面で問題が出そう
2017/02/06(月) 19:29:23.46ID:4FxLnD3n
Excel脳っすなぁ
標準的なユーザーデータ保存場所がちゃんとあるんだからそれ使えばいいじゃん
2017/02/06(月) 19:58:54.20ID:KOZLaxG/
>>246
どうすればいいでしょうか
2017/02/06(月) 21:21:37.88ID:VJg+IRhi
>>244
Presentation.CustomDocumentProperties
https://msdn.microsoft.com/ja-jp/library/office/ff744661.aspx
2017/02/07(火) 07:09:26.95ID:HIDKMkau
>>246
条件によるだろ
思いつきで即答すんなアホ
2017/02/07(火) 07:27:10.54ID:ff698yUf
>>249
条件って
ファイル本体に埋め込みたい
ってことだろ
>>246 の保存場所がどこの事を言ってるのかよくわからんが >>245 より >>248 の方がはるかにマシ
2017/02/07(火) 07:40:32.09ID:xddq+MTq
ファイル本体に埋め込みすんのがアホなんだよわかれよ素人
ゴミを量産して人に迷惑かけないでくれ
独りよがりの仕事してんじゃねえよ
2017/02/07(火) 08:07:27.12ID:ff698yUf
単なる基地害だったのか
2017/02/07(火) 20:25:02.30ID:1dqSFjs6
実際に仕事してるとそれこそ基地外避けを作る必要が出てきたりするんだよな
2017/02/07(火) 21:24:47.40ID:lpX4EXgF
ユーザーデータを変な場所に保存したりするやつとか避けないとな
2017/02/07(火) 22:43:16.46ID:diTiDCUQ
>>254
> 変な場所に
透明のシェイプとかのことですね、わかります
2017/02/13(月) 17:14:33.92ID:QPcPOced
50枚のスライドが入ったパワポが5個あります。
これを統合したいのですが
ファイル1の1枚目
ファイル2の1枚目
ファイル3の1枚目
ファイル4の1枚目
ファイル5の1枚目
ファイル1の2枚目。。。

という順番にしたいのです。
どういうマクロを書けばいいでしょうか?
2017/02/13(月) 21:36:30.61ID:MAF656mM
>>256
その通りのマクロを書けばいいのでは?
2017/02/13(月) 21:54:55.31ID:1gaAmlEB
新規で作ったらコピペを繰り返すだけ
2017/02/14(火) 00:38:49.96ID:hvVJhpIb
パワポってマクロ使えるんだ
そらそうだわな
260デフォルトの名無しさん
垢版 |
2017/02/14(火) 01:58:27.90ID:ahDpDw9M
ExcelVBAをつかいこなしていても
パワポはマクロの記録がないと腰が重いな
2017/02/15(水) 08:18:34.60ID:uIQboeV9
>>256
この作業用を何回も繰り返さないといけないの?
1度きりならあなたの場合は手作業の方が早い気が
2017/02/15(水) 13:14:12.73ID:zgJtAmDR
>>256
スマホからだから試してないけどこんな感じかな
Application.Presentations.Open(ひとつ目のファイル)
Application.Presentations.Open(ふたつ目のファイル)
...
Application.Presentations.Open(いつつ目のファイル)
Set P = Application.Presentations.Add
For I = 1 To 50
For J = 1 To 5
Application.Presentations.Item(J).Slides(I).Copy
P.Slides.Paste
Next
Next
P.SaveAs(新規のファイル)
2017/02/23(木) 13:32:21.69ID:xPy6pfR0
選択されているセル範囲内の文字、図形を削除する手順を作ってみましたが、処理がえらく重いです。
もっと処理を早くする方法はないでしょうか?
Sub sakujo()
Application.ScreenUpdating = False   '画面更新を停止
Dim shp As Shape
Dim rng As Range
If TypeName(Selection) <> "Range" Then Exit Sub
For Each shp In ActiveSheet.Shapes
Selection.ClearContents
Set rng = Range(shp.TopLeftCell, shp.BottomRightCell)  '図形の配置されているセル範囲をオブジェクト変数にセット
If Not (Intersect(rng, Selection) Is Nothing) Then  '図形の配置されている範囲と選択されているセル範囲が重なっているときに図形を削除
shp.Delete
End If
Next
Application.ScreenUpdating = True  '画面更新を再開
End Sub
2017/02/23(木) 14:40:32.47ID:bekNjoMq
>>263
再計算とイベントも停止してみた?
あと、コレクションに対するループの中で自分自身のコレクションが変化するのは、なんとなくまずい気がする
根拠はないけど、それって遅くなる要因と違う?
2017/02/23(木) 15:02:34.32ID:Q2T7iSLN
処理の基本をよく考えるべき。
1.Shape毎にSelection.ClearContentsする意味は?
2.shp.Delete後もループする意味は?
3.そもそもSelectionって何?つまり何が選択されている時に削除したいの?

For Each shp In ActiveSheet.Shapes
If shp Is Selection Then
shp.Delete
Exit For
End If
Next

じゃ駄目?
2017/02/23(木) 15:08:21.72ID:Q2T7iSLN
選択されているセル範囲については最初のIf文でExit Subしてるから削除されないんじゃ?
処理がよく分からん。

選択されているShapeの下のRangeの内容を削除したいならshp=Selectionの場合に
Range(shp.TopLeftCell,shp.BottomRightCell).ClearContents
で良いんじゃ?
2017/02/23(木) 15:10:34.31ID:Q2T7iSLN
shp=Selectionの場合じゃなくてshp Is Selectionの場合だな。
shp.Deleteの前ね。
2017/02/23(木) 15:24:01.29ID:5OVH7aZj
>>265
質問者じゃないけど変わって説明するよ
・シート上に文字と図形が複数箇所に設定されている
・消す範囲を選択して、その範囲内の文字と図形を消すコードを書いた
・でもなぜか遅い

質問者に言えるのは、
・Selection.ClearContentsはfor eachの外でいい
・試しに100個のshapeを貼り付けて50個くらいが入る範囲を選択して消してみたら一瞬で終了(もちろんコードでだよ)
・遅いって具体的にどれくらいなの?
2017/02/23(木) 16:00:14.32ID:Q2T7iSLN
>>268
コード見りゃわかる。
でもコードがやってることは無駄な部分が多いから聞いてる。

最初のIf文を見ればRangeを選択した場合はExit Subしたいみたいだがら範囲選択した場合は処理して欲しく無いんだよな。
→じゃ、どんな時に処理して欲しいの?

For Each shp In ActiveSheet.Shapes
If shp Is Selection Then
Range(shp.TopLeftCell,shp.BottomRightCell).ClearContents
shp.Delete
Exit For
End If
Next

じゃ駄目なの?
2017/02/23(木) 16:07:14.86ID:xPy6pfR0
今までは長い時で1〜1.5秒程止まっていました
>>268さんの言われた通り、Selection.ClearContentsの位置を変えたらスムーズになりましたのでこれで行こうと思います
たくさんご意見頂きありがとうございました
2017/02/23(木) 16:14:41.52ID:5OVH7aZj
>>269
> If TypeName(Selection) <> "Range" Then Exit Sub
だよ
2017/02/26(日) 14:44:16.79ID:nMuhJunv
エクセルのマクロでも質問大丈夫でしょうか?
名前と同じファイル名の画像を名前セルの隣に貼り付けるプログラムなんですが
Sub ボタン1_Click()
Const n As Long = 2
Dim i As Long
Dim x As Double
Dim s As String
Dim t As FileDialog
Dim m As VbMsgBoxResult
With ActiveSheet
For i = 2 To .Cells(.Rows.Count, 2).End(xlUp).Row Step 6
Set r = .Cells(i, 3).MergeArea
s = "D:\画像\1\" & .Cells(i, 2).Value & ".jpg"
Dir Application.Path
With .Pictures.Insert(s).ShapeRange
.LockAspectRatio = msoTrue
x = Application.Min(r.Width / .Width, (r.Height - n) / .Height)
.Width = .Width * x
.Left = r.Left + (r.Width - .Width) / 2
.Top = r.Top + (r.Height - .Height) / 2
End With
Next
End With
End Sub
この"D:\画像\1\"の部分をフォルダ選択できるようにしたいので
Dim s As String
  Dim t As FileDialog
Set t = Application.FileDialog(msoFileDialogFolderPicker)
s = "t" & .Cells(i, 2).Value & ".jpg"
としたら「1004 PicturesクラスのInsertプロパティを取得できません。」と実行できません
どうしたら"D:\画像\1\"の部分をフォルダ選択できるようにできるのでしょうか?ご教示お願い致します。
2017/02/26(日) 16:00:22.84ID:nt1S72uw
>>272
Dim s As String
Dim t As String
With Application.FileDialog(msoFileDialogFolderPicker)
  If .Show = False Then Exit Sub
  t = .SelectedItems(1) & "\"
End With
'途中省略
s = t & .Cells(i, 2).Value & ".jpg"

じゃないかな?
あと
元コードもそうだけど
フォルダ内に その画像ファイルが存在してなかった時の対策も必要だと思うよ
同じエラーになるぞ それとも絶対 あるのが 確定してる?
2017/02/26(日) 16:45:49.33ID:nMuhJunv
>>273
大変ありがとうございます!
ただ、貼り付ける画像は複数あり、貼り付けるたびにフォルダ選択画面が出てしまいますので、一気に貼り付けられないものでしょうか?
ファイルが存在してない時の対策は、セルの状態を色変えて罫線で斜線を挿入したいと考えてますが、まだそこまで進む前段階がクリアできないので困ってます
よろしくお願いします
2017/02/26(日) 16:51:45.39ID:nt1S72uw
>>274
ん? そこは分ってるとおもたよ
フォルダ選択部分は Forループの外だよ
↓ここねw
With Application.FileDialog(msoFileDialogFolderPicker)
 If .Show = False Then Exit Sub
 t = .SelectedItems(1) & "\"
End With
2017/02/26(日) 16:57:59.74ID:nMuhJunv
>>275
あっ!できました!ありがとうございます!助かりました!
277デフォルトの名無しさん
垢版 |
2017/03/06(月) 23:29:36.96ID:QCgyLcj6
こんにちは。

パワーポイント2013のVBAについて分かる方教えて下さい。

やりたいことは、グラデーションの塗りつぶしがあるシェイプのGradientStopsのそれぞれの色を変化させるアニメーションの方法です。

2013ではできないけど2016ではできる等の情報もあればお願い致します。
2017/03/08(水) 21:50:45.20ID:DO0ivfK5
vbaだけでhttpサーバーって出来る?
2017/03/08(水) 23:04:04.36ID:Tpob7EG8
俺が手を下すまでもないな
答えてやれよ
>>280
2017/03/09(木) 01:39:01.40ID:UFk6xx1O
VBAだけってのが
外部コントロール使用禁止
API呼び出し禁止
なら不可能です
2017/04/09(日) 15:56:17.26ID:9WwYB+FH
VBAの変数の値を次回の処理を行う時まで記録しておくのにセルに書き込みをしたりしていますが、

セルにアクセスするのを減らすためにセルに記録しなくて処理終了時に変数値をVBA内で保存しておいてくれる一次記憶領域みたいな物はないのでしょうか?
2017/04/09(日) 16:02:56.39ID:9WwYB+FH
ちりも積もればの話ですが
足し算引き算割り算レベルの計算をセルに関数を割り当てて行うのと
同じ計算式を変数を用いてVBAで書いて実行するのとで、より処理速度が速いのはどちらでしょうか?
2017/04/09(日) 16:09:57.30ID:Lq/WJuQk
>>281
セルでいいんじゃないの?
ただそのIOは配列アクセスを使うべき
ループで1セルづつ読み込むとかがナンセンス
2017/04/09(日) 16:14:42.36ID:K8MFArI9
>>281
説明がいまいち分かりにくい。
次回ってのは何時のことを言ってる?
グローバルな変数じゃダメなの?
次にそのブックを開くまで保持したいならセルってのも分かるんだが。
で、その場合にセルの代わりに保持したいならCustomDocumetProperties使ったりするかな。
2017/04/09(日) 16:27:32.06ID:9WwYB+FH
>>283
ありがとうございます。
>配列アクセス
勉強してみます。

>>284
Bookを閉じずに他からデーターを取り込み再度VBA実行を繰り返します。
>グローバル変数
>CustomDocumetProperties
勉強してみます。

グローバル変数に代入した数値は処理を中断しても生き続けるのであればそれで解決しそうです。
2017/04/09(日) 16:44:07.10ID:9WwYB+FH
>>284
プロシージャの上に定義すると処理が終了しても最終定義された内容は残ったままなんですね!
今まで処理を中断する必要がある場合は変数をすべてセルに書き出していましたが大発見です。ありがとうございました。
2017/04/09(日) 19:39:59.08ID:9WwYB+FH
Public変数もしくは通常の変数の指定数の限界はあるのでしょうか?
問題なく動くレベルは何個ぐらいでしょうか?

50個
100個
1000個
10000個でも平気だっり?
実は
100000個以上でも問題ないとか?
2017/04/09(日) 19:51:50.86ID:0T9WQSVM
>>287
使えるメモリは決まってる
変数の個数じゃなくてそれぞれのバイト数の合計
2017/04/09(日) 23:55:43.90ID:K8MFArI9
>>287
グローバル変数(Public)は便利に見えるけどスコープを考えて必要無い所では使わない方が良い。
PublicかPrivateかプロシージャ内で宣言するかを意識して使った方が良いね。
2017/04/10(月) 02:47:06.39ID:AhmZ51rM
日曜の午後からずっとVBAを書いてるけどまだおわらね〜
てかやればやるほど選択肢が爆発的に増えてきて一生かかってもおわりそうにね〜!w
2017/04/10(月) 04:05:13.85ID:sRLMXvmn
>>287
しかもEndやErrorで抜けたら破棄されるという罠
2017/04/11(火) 00:40:18.97ID:egN7ZnVO
素数や組み合わせ爆発のような数学の迷宮的な問題に陥って
一生かかってもコードを完成させるのは無理ですよみたいな場合もあるのでしょうか?
2017/04/11(火) 10:41:22.79ID:Ei1BFwyD
>>292
数学的バックグラウンドがなければコードが書けないという類いの問題はあるね。
たとえばNP困難なやつ。
巡回セールスマンとかナップサック問題とか、ナーススケジューリング問題とか。
自力でなければ、それなりの回答が得られる解法(コード)が既に存在してるものもある。
2017/04/11(火) 11:01:45.96ID:o/k96Ri6
問題を解く方法を考案するのと、その方法をコンピューター言語に翻訳する作業は別ですわ
それぞれに異なった知識と才能が必要となりますので
2017/04/11(火) 11:03:15.94ID:6dnWkPrh
>>291
End Subの行にブレークポイント、これ
2017/04/12(水) 22:41:46.94ID:iuenojzm
パブリック変数で

1000個
10000個でも平気だっり?

とかどんな拷問なんだよw
2017/04/20(木) 23:26:11.80ID:92wBssf5
テストしてみたがパブリック変数500個は問題なく動いた。
もっと使ってる人いる?
2017/04/21(金) 19:40:41.67ID:TpPjDerb
いらない
2017/04/21(金) 21:22:06.10ID:BWuBR5xw
変数の一部を変数にする事は出来ないのでしょうか?(代入
とかではなく)
たとえば↓はイメージですが変数名の箇所を文字列をつなぎ合わせる時と
同じように変数をわりあてられないのでしょうか?(以下は動きませんがphpではこれができます。)
dim aaa1
dim aaa
dim no
dim bbb

aaa1=例文1
aaa=aaa
no=1

aaa & no = bbb

msgbox bbb

結果は「例文1」 と表示されますみたな、、 
2017/04/21(金) 21:28:31.62ID:BWuBR5xw
>>299
最終的には
aaa1=「例文1」
aaa2=「例文2」
aaa3=「例文3」


とし
aaa & no のno番号だけ差し替えて制御するみないな感じで使います。
ただしnoの番号は連続した数字ではなく他の集計結果からランダムに発生するため
ループ処理等では成り立たず変数のように扱う必要があります。
2017/04/21(金) 22:10:11.53ID:9tskJEPF
>>300
aaa1とかaaa2を変数として捉えず、文字列と数値を要素に持つ2次元配列と見れば良い
で、データ全体を制御するときは、aaa1,aaa2...の2次元配列全てを要素として持つコレクションオブジェクトを生成して操作する
2017/04/21(金) 22:18:30.36ID:TpPjDerb
>>300
Dictionaryのkeyにすれば良いんじゃね
2017/04/21(金) 22:25:23.50ID:9tskJEPF
CollectionよりDictionaryだな、確かに
2017/04/21(金) 23:24:44.93ID:3F+Ljh12
そういう質問、初心者によく聞かれるわ
普通は配列を使えと教えるもんだが
2017/04/22(土) 06:16:50.97ID:zUhE/Mll
>>302
>>301
ありがとうございます。Collection Dictionary 調べてみましたが
どちらも説明をざっと読んでも使い方が理解できませんでしたが挑戦してみます。

phpのように (aaa & no) =
と変数名自体を複数の変数で合成する事は出来ないのですね。
306299
垢版 |
2017/04/22(土) 08:27:20.54ID:zUhE/Mll
>>300
>>301
>>302
>>304

aaa1=「状況に応じて変化する数値1」
aaa2=「状況に応じて変化する数値2」
aaa3=「状況に応じて変化する数値3」


すみません説明を単純にするために「例文1」としてましたが
変数に格納されるのは状況に応じて変化する数値(他の集計の計算結果)でした。
固定された文言であればDictionary keyで処理できるというのはわかりましたが
格納されている物が変化する数値の場合かつ
変数名を数字で管理(他の集計から3という結果が出たら→aaa3が適応されるみたいな)
したい場合こういうことを実現する方法はありますでしょうか?
2017/04/22(土) 08:53:12.92ID:MM2jcjjz
>>306
変数名を数字だけで管理する方法はない。
VBAの仕様上、できない。

というか、その集計結果なるものがプログラム実行時に決定するのだとしたら、集計結果を格納する変数の名前に集計結果の数値をはじめから盛り込もうとするのは無理があるし、そもそも理由が分からない。
やりたいことを実現するにはもっと適切な他の方法があるんじゃないかな。
2017/04/22(土) 11:27:30.44ID:6RXuRSFv
>>306
Dictionaryのvalueは変更可能
309299
垢版 |
2017/04/22(土) 15:29:06.19ID:zUhE/Mll
>>308
>>307
理解するのにかなり時間がかかりましたがDictionaryなんとなくわかりました。
これって Dim とかPublicとかの変数とは別に存在できるんですね。
全く未知の分野ですが使ってみます。ありがとうございました。
2017/04/22(土) 20:43:48.30ID:zUhE/Mll
Dim dic As New Dictionary
Dim i As Integer

dic.Add "キー1", "アイテム1"
dic.Add "キー2", "アイテム2"
dic.Add "キー3", "アイテム3"

Dictionaryで指定した"キー"と "アイテム"は処理が終了するとリセットされるようですが、
グローバル変数のように処理が終了しても次実行されるまで記憶させておくようにする事は出来ないのでしょうか?
2017/04/22(土) 22:48:51.75ID:AOzJBbd9
>>310
プロシージャを跨いで値を保持させるなら、グローバルな配列変数、(アプリケーションがExcelならば)セル、シェイプ、カスタムドキュメントプロパティ、グローバルコレクション、自作のグローバルクラスのインスタンスなどに値を記憶させるしかない

でもそれならわざわざプロシージャ内でDictionaryを使って連想配列を操作するより、ExcelのセルにKeyと値を書き込んで配列アクセスして読み書きする処理の方が遥かに楽だと思う
2017/04/22(土) 23:30:15.48ID:zUhE/Mll
>>311
ありがとうございます。
今作っているコードでセルへのアクセスが膨大になってきて処理時間がどんどん長くなる傾向がみられまして
全操作をセルにアクセスせずに完結させようと色々考えていましたがなかなかそうはいかないようですね。
2017/04/23(日) 05:30:19.61ID:t5ve42Di
>>312
Dim dic As New Dictionary
の宣言を何処でしているかによるんじゃね?
2017/04/23(日) 10:16:09.39ID:wfwXXeKO
>>312
標準モジュールとかでDictionary型のオブジェクト変数をグローバルスコープ(Public)でNew宣言すれば、処理を抜けてもDictionaryのItemは初期化されないんじゃないのかな
ただ単なる配列の処理でデータが数千件程度なら、描画止めた状態でワークシート使った方が遥かに楽だと思うが。
2017/04/23(日) 16:51:51.75ID:fs201BJ1
>>311
引数に渡すってのを忘れてるぞ。
一番使われてるんじゃないか?
2017/04/23(日) 17:11:32.92ID:yvJyPXpi
>>315
何の引数に渡すことを指してるのかな?
2017/04/23(日) 18:02:04.26ID:fs201BJ1
>>316
プロシージャを跨ぐって話だろ。
別のプロシ−ジャに引数として渡せば形の上ではそれぞれのローカル変数でも値は保持されるだろ。
2017/04/23(日) 18:27:09.16ID:yvJyPXpi
>>317
>>310を読んでなんとなく、一個のルーチンのプロシージャ間の値の受け渡しの話ではなく、ルーチン内で一度AddしたDictionaryのKeyとItemを何らかの形で保存して、同じルーチンを再実行したときにKeyとItemを再利用することが出来るかどうかという話だと思ったんだが

まぁ、オブジェクトプロパティへの値の保存も実際はそのオブジェクトを定義してるクラスのメソッドに引数を渡してるのと同じだから、変わらないといえば変わらないけど
2017/04/28(金) 17:33:41.10ID:krqKI6DB
超既出FAQですな。

『Public 宣言された変数の有効期間』
https://support.microsoft.com/ja-jp/help/408871

簡単に言うと、メソッド実行中以外はいつでもpublic変数はクリアされうるから、値が残っていることを期待したマクロを書くなってこと。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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