Excel VBA 質問スレ Part39 [転載禁止]©5ch.io
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2015/11/27(金) 20:36:45.35ID:9HV+ag/s___
___ /____ヽ ____
/____\ | |´・ω・`| | /___ヽ
.l |´・ω・`| ニX二 . ̄ ̄ ̄ 二X二 |´・ω・`| l 俺たちに任せろ
!、 ̄ ̄ ̄ ヽ | | /  ̄ ̄ ̄/
ヽ_/ヽ、 ヽ__) \__/\_/. /_/ ノヽ_/
 ̄  ̄ ̄
このスレはコード書き込みOKです。
作成依頼もOKですが、作成依頼限定ではありません。
コードが嫌な人・作成依頼が嫌な人は別スレ建ててください。
※前スレ
Excel VBA 質問スレ Part38 [転載禁止]2ch.net
http://peace.2ch.net/test/read.cgi/tech/1441619979/
0083デフォルトの名無しさん
2015/12/10(木) 22:20:17.87ID:CRNEQuUVk = 1
For i = 1 To 10
If myArray(5, k) < myArray(5, i) Then k = i
Next
Debug.Print k
End Sub
よく分からんがこういう事か?
0084デフォルトの名無しさん
2015/12/10(木) 22:39:25.36ID:Ek2aQ7ct早速どうも。コードありがとうございます。
myArray(1,1) = 3
myArray(1,2) = 5
myArray(1,3) = 4
のとき、For文でしらみつぶしに調べることなく、
最大値となる(1,2)などを返す方法はないかなと思ったのです。
0085デフォルトの名無しさん
2015/12/10(木) 22:48:15.01ID:CRNEQuUV既にソートされているとか、そういう前提条件がない場合は虱潰し以外の方法はない。
素人くさいコードを書きたくないなら、VBAを見よう見まねで触る前に電子工学を学ぶ事をお勧めする。
0086デフォルトの名無しさん
2015/12/10(木) 23:06:09.69ID:Ek2aQ7ct端的な回答ありがとうございました。
前提条件はないので、シラミ潰しします。
素人なので素人臭くないスマートなコードに憧れます。
この発想が素人臭いのかもしれませんがw
0087デフォルトの名無しさん
2015/12/11(金) 01:01:09.23ID:Gc5rivvs0088デフォルトの名無しさん
2015/12/11(金) 12:01:23.27ID:e4IICcKihttp://officetanaka.net/excel/vba/tips/tips98.htm
0089デフォルトの名無しさん
2015/12/11(金) 12:29:13.10ID:Wogf6bzXMSDN見てみたが、これ使えるのかな?
ArrayList.Sort (IComparer)
指定した比較演算子を使用して、ArrayList 全体内の要素を並べ替えます。
0090デフォルトの名無しさん
2015/12/11(金) 13:44:45.39ID:mI4o0uWv帰って調べてみよ。
0091デフォルトの名無しさん
2015/12/11(金) 14:19:39.54ID:UJeMV01i>>82です。Match引数を配列とすることもできるんですね。
でもあるサイトで配列を引数とするとちょっと遅いみたいな記述がありちょっと心配ですが。
>>88
横からですが便利そうですね。
0092デフォルトの名無しさん
2015/12/11(金) 22:44:49.09ID:fIX9Jv1V式は適当です
条件1の時
if cells(1,1) = cells(2,1) then
条件2の時
if cells(1,1) = cells(2,1) and cells(1,2) = cells(2,2) then
条件3の時
if cells(1,1) = cells(2,1) and cells(1,2) = cells(2,2) and cells(1,3) = cells(2,3) then
条件nの時
if cells(1,1) = cells(2,1) and cells(1,2) = cells(2,2) and ... and cells(1,n) = cells(2,n) then
てな具合に、判断する項目が増減する時、
スマートな条件式を記述する方法ってありませんか?
0093デフォルトの名無しさん
2015/12/11(金) 23:03:48.59ID:Kp08ZeACもっと具体的でないとスマートな(効率的な)式が分からないけど、
例にしているものをコードにするなら
Function Test() as Boolean
For Each x In Range(Cells(1, 1), Cells(1, Columns.Count).End(xlToLeft))
If x <> x.Offset(1, 0) Then Exit Function
Next
Test = True
End Function
か
Function Test(cond As Long) As Boolean
For i = 1 To cond
If Cells(1, i) <> Cells(2, i) Then Exit Function
Next
Test = True
End Function
かな。
0094デフォルトの名無しさん
2015/12/12(土) 01:48:04.85ID:FuRVZgYl1.表示されたページのAタグの中からキーワードを抽出してクリック
2.ページが表示されたら、そのままプルダウンなどを選択してクリック
と連続して操作させたいのですが、Aタグから抽出してクリックはできるものの、
その後デバッグになってしまい以降の処理が連続で行えません。
Set objA = objIE.Document.getElementsByTagName(
0095デフォルトの名無しさん
2015/12/12(土) 01:49:15.80ID:FuRVZgYlFor n = 0 To objA.Length - 1
If InStr(objA(n).OuterHTML, "キーワード") > 0 Then
objA(n).Click
Exit For
End If
Next
Set objA = Nothing
このあとにデバックしてしまいます…
0096デフォルトの名無しさん
2015/12/12(土) 02:09:55.86ID:D2WGnzzU>>デバッグになってしまい
エラーになるって意味かな?
エラーになるコードはどれ?
もしかして
Set objA = Nothing
した後でobjAへオブジェクトをセットしないで
objA使ってたりしない?
0097デフォルトの名無しさん
2015/12/12(土) 13:20:27.33ID:7OCEnpiZこれってどうやって作ってる?
0098デフォルトの名無しさん
2015/12/12(土) 13:33:18.20ID:Yc8YF04u作った本人に聞くべきだけど、たぶん普通のゲームの作り方そのままじゃないの。
0099デフォルトの名無しさん
2015/12/12(土) 20:28:13.88ID:/A1wTFJW回答ありがとうございます。
やってみます。
0100デフォルトの名無しさん
2015/12/12(土) 22:56:55.45ID:rj6YNvj2全く分からない。最初見たとき、エミュレータにExcelに見えるガワみたいなものを持たせたのかと思ったけど、
選択されたCellに対してのみBGが配色されているところ、BGの中でも木やブロックに配色の影響がないところを見ると、単純にエミュレータと言う訳でも無さそう。
ただ2面目でExcelの操作中にマリオが少し動くところを見ると、Excelとマリオは別スレッドで動いているのかもしれない。そうなると、
マリオはExcelの機能で動かしている訳ではないのではないかと思える。
でもここまできっちり作るには、もしエミュレータを利用していたとしても、少なくともファミコンのパレット機能を知っていなければならないし、
エデイト機能も持たせてあると言っていることから、
BGとその当たり判定のメモリへの展開も知っていることになる。
でも多分この人は自前で作ってるっぽい。何故ならCellの配色がBGの更に後ろにあって、Excelの機能と思しきものがファミコンの機能と思えるところの
更に奥に食い込んでいるように見えるから。
結論を言うとちょっと信じがたい話だけど、見よう見まねか、解析したか分からないけど、マリオをOpenGLみたいなものでキチンと作って
それをExcel上で動かしているのではと推測する。でもあくまで俺の推測だから本当のところは分からないよ。
0101デフォルトの名無しさん
2015/12/19(土) 09:12:27.95ID:C2ZsZsZchttp://hayabusa3.2ch.net/test/read.cgi/news/1450395043/
0102デフォルトの名無しさん
2015/12/19(土) 11:11:30.68ID:9nLc0qec0103デフォルトの名無しさん
2015/12/19(土) 17:17:12.17ID:t89iAcrUIComparer インターフェイスが使えるかってこと?
よくわからないけど無理なんじゃないかな。
自分はArrayList知らなかったので比較演算子も含めてライブラリでほげふがしてる。
0104デフォルトの名無しさん
2015/12/20(日) 00:57:16.89ID:zSz2t60X試してないけど出来るんじゃないかな
.Netフレームワークインストールしてること前提だけど
0105デフォルトの名無しさん
2015/12/20(日) 01:05:44.36ID:3zlmhSVS出来るのなら可能性とし色々広がりそうだ。
ただソートやreverseするため(だけ)にデータ構造としてArrayListクラスを使うのを強いられるのはちょっといやだな。
0106デフォルトの名無しさん
2015/12/20(日) 14:32:56.31ID:JRgauTa2エラーが出て困っています
エラー内容は引数は省略できません
というものなのですが
引数は特に指定していないので間違っていないと思うのですが
何がまちがっているのでしょうか?
-呼び出し側
Dim myDic As Dictionary
myDic = CreateDictionary()
-関数
Function CreateDictionary() As Dictionary
Dim aDictionary As Dictionary
Set aDictionary = New Dictionary
With aDictionary
.Add Key:="key1", Item:="value1"
.Add Key:="key2", Item:="value2"
End With
Set CreateDictionary = aDictionary
End Function
0107デフォルトの名無しさん
2015/12/20(日) 14:35:48.69ID:JRgauTa2呼び出し側にsetって書いたらエラーが消えました
でも理由がわかりません
functionの場合は常にsetで代入しないといけないんでしょうか?
0108デフォルトの名無しさん
2015/12/20(日) 15:42:29.15ID:g0mIqi7V関数の戻り値の型がオブジェクトだから(Dictionaryオブジェクト)
0109デフォルトの名無しさん
2015/12/21(月) 11:44:54.68ID:0jWvYEdMとやっていって最高いくつまで足せますか?
0110デフォルトの名無しさん
2015/12/21(月) 11:53:17.32ID:dc09zofZVBEの文字数限界の話?やってみるしかないんじゃね?
0111デフォルトの名無しさん
2015/12/21(月) 12:57:48.76ID:VBR60bJo次の行に継続した場合の制限は非公開
0112デフォルトの名無しさん
2015/12/21(月) 13:31:34.58ID:VBR60bJo物理行は1024バイト
論理行は65535バイト
0113デフォルトの名無しさん
2015/12/21(月) 21:17:23.77ID:GVmX1WAGaaaaaaaaaaaaaaaaaaaaaaaaaaaa・・・
a
となったから1023バイトまでだな
0114デフォルトの名無しさん
2015/12/21(月) 22:31:21.13ID:ilnG5VR/行継続文字は2バイト消費するから、実際に使えるのは1021*24+1023=25527バイトってことになる
MSDNに書いてある「1行=65535バイト」ってのは到達できないと思われる
0115デフォルトの名無しさん
2015/12/21(月) 23:10:27.03ID:ilnG5VR/こんな簡単な足し算一つで落とせるとは、意外だったわ
もしかして>>109は、このことをわかってて質問したのか?
0116デフォルトの名無しさん
2015/12/21(月) 23:13:43.52ID:ilnG5VR/とりあえずCells(r, 453)までは大丈夫
今んとこソースの計算式は1023文字×7行
0117デフォルトの名無しさん
2015/12/21(月) 23:20:59.48ID:ilnG5VR/というわけで、1論理行の計算式で足せるのは512まで
つまり右辺に書けるRangeオブジェクトは511個まで
Cells(r, 1) = Cells(r, 2) + ・・・ + Cells(R, 512) まで
どうやら式が長すぎると一時的に作られるRangeオブジェクトがワークエリアを食い尽くすらしい
VBEの文字数の限界とはまったく関係ないところでひっかかるとは知らんかった
まだまだ勉強が足らんな
0118デフォルトの名無しさん
2015/12/21(月) 23:34:01.24ID:ilnG5VR/http://codepad.org/Dx6bniP1
0119デフォルトの名無しさん
2015/12/21(月) 23:55:25.73ID:GVmX1WAG0120今日から俺は
2015/12/22(火) 00:29:32.95ID:1Uckp5vQhttp://ww10.puny.jp/uploader/download/1450711580.zip
パスワード:abc
エラー処理に問題がないか、
アドバイス頂けませんでしょうか?
標準モジュールの
'<サブ処理(1)>
Sub 画像貼付〜
のエラー処理なんですが、
プログラマーの方のアドバイスを頂きたいです。
0121デフォルトの名無しさん
2015/12/22(火) 11:18:45.06ID:1IjfeHrTメイン関数が600行もあるので、内容は見る気まったくしない。
気づいた点:
・2行とか3行の連続した空行があるが、気持ち悪いのでやめて欲しい
・1個50行未満程度のFunction/Subに分けろ。そうすれば第三者も読む気になる
個人的な好み:
・変数宣言は必要になった場所で行え。そうすれば多少関数が長くなっても何十も変数宣言が続くことはなくなる
0122デフォルトの名無しさん
2015/12/22(火) 11:30:47.44ID:71TpXAZk0123デフォルトの名無しさん
2015/12/22(火) 11:37:34.62ID:1IjfeHrT・Tabキーでインデントしろ(普通は4つのスペースでインデントされる)
・不明な変数名(いきなりDnameって何?となって読む気かなりダウン)
→ コメントを入れるより、適切なネーミングで
・Dim CellWidth, CellHeight As Long
CellWidthはLongにならない
・SheetをActivateする必要があるか?(RangeをSelectする必要があるか?)
・コメントされたコードは削除しろ
・「一旦画像をシートに貼り付け」とか書いてるが、なぜそうするのか意図不明
内容を全く知らないコードを読むのは、100行あたり10分から1時間程度かかる。
人に見てもらいたいなら、見てもらえるように努力しろ。
0124デフォルトの名無しさん
2015/12/22(火) 12:08:50.62ID:71TpXAZkFunction/Sub名と引数名は重要だけど。
0125デフォルトの名無しさん
2015/12/22(火) 12:29:08.69ID:eV+iF7ba仕事なら他人のソースでも必死に解読するけど、これは暇つぶしにできる範疇を超えてるは
0126デフォルトの名無しさん
2015/12/22(火) 13:06:10.62ID:1IjfeHrTDnameは画像貼付()の第一引数。
引数名もひどいが、ローカル変数名もひどい。
> 一般論だがローカル変数名なんてどうでもよくない?
一般的にはどうだかわからないが、個人的にはどうでもよくない。
ネーミング超重要。
0127デフォルトの名無しさん
2015/12/22(火) 13:28:33.58ID:71TpXAZkそうなのか。
自分は逆だ。
名付けることが必要なローカル変数が発生すること自体避けたいタイプ。
0128デフォルトの名無しさん
2015/12/22(火) 13:47:37.98ID:1IjfeHrT一般論じゃないの?
それは一般的なのかみたいな不毛な議論したくないから曖昧な表現にしたが、
ローカル変数とはいえ、ネーミングに気を遣うのは良い習慣。
0129デフォルトの名無しさん
2015/12/22(火) 14:15:48.13ID:6+FfHGxJ0130デフォルトの名無しさん
2015/12/22(火) 14:25:32.96ID:toHtA+zz結局1関数内に複数の処理があって、2箇所以上で使う変数は関数の先頭で宣言してる
0131デフォルトの名無しさん
2015/12/22(火) 14:56:45.78ID:1IjfeHrTローカル変数のスコープとコードの読みやすさについては、「変数のスコープを小さくする」で
ググることをお勧めする。
ローカル変数宣言・定義を関数の先頭で行うのを強制される言語以外では、スコープを最小と
することが推奨される。
0132デフォルトの名無しさん
2015/12/22(火) 15:12:03.64ID:71TpXAZk確かにその点は困りものだ。
別な変数を使えばよいのだが、あまり綺麗ではない。
0133デフォルトの名無しさん
2015/12/22(火) 17:04:33.32ID:EK9FZmu1>ローカル変数宣言・定義を関数の先頭で行うのを強制される言語
べつにVBAは関数の先頭での宣言を「強制」なんてされないが、スコープは狭い方が良い
ただし、VBAにはブロックレベルのスコープがないだけ
関数の先頭での宣言が「薦められていた」のは
スコープの先頭で、そのスコープ内の変数まとめて宣言した方がわかりやすいよね、って言う事
つかローカル変数定義を関数の先頭で宣言する事を強制される言語ってたとえば何?
>>130,132
まあ、そういう時は関数分けろってのが一般的な解決法なんじゃね
0134デフォルトの名無しさん
2015/12/22(火) 17:24:02.60ID:1IjfeHrTVBAの「変数のスコープ」は、宣言・定義した位置から下だよ。
だから、関数の先頭じゃなくてもっと狭められる。
0135デフォルトの名無しさん
2015/12/22(火) 17:48:13.32ID:nxtSgXHpブロックレベル、というのが通じてないのかな?
つまりひとつの関数の中で、
For Each z ・・・
Dim tmp As Variant
・・・
Next z
For Each z ・・・
Dim tmp As String
・・・
Next z
というように変数tmpが2回宣言出来ればいいのに、それが出来ないことを嘆いている。
0136デフォルトの名無しさん
2015/12/22(火) 17:50:28.23ID:1IjfeHrT> ブロックレベル、というのが通じてないのかな?
いや、通じてるよ。
だからといって
> 結局1関数内に複数の処理があって、2箇所以上で使う変数は関数の先頭で宣言してる
とするのではなくて、もっと変数のスコープを狭めた方が良いといってるんだけど。
0137デフォルトの名無しさん
2015/12/22(火) 17:57:48.82ID:1IjfeHrTローカル変数定義を関数の先頭で宣言する事を強制される言語(*1)は
しかたがないので変数の宣言は関数の先頭でするしかない。
*1) Ada由来言語とか。PL/SQLとか。
そうではない言語では、なるべく変数のスコープを狭めるのが良い。
・関数ブロック内のどこででも変数定義できるのなら、なるべく利用する直前で宣言する
・ブロックスコープが存在する言語では(C系とか)は、そのブロック内で宣言する
VBAはブロックスコープが存在しないが、関数ブロック内のどこででも変数定義できるので、
なるべく利用する直前で宣言するのが良い。
例外はJavascriptで、ホイスティングによりブロックスコープ内で宣言した変数のスコープは
関数スコープにまで拡大する。
それにより
・それでも利用する直前で宣言するよ派
・知らない人がいるかもしれないので、関数の先頭でまとめてするよ派
が存在する。
0138デフォルトの名無しさん
2015/12/22(火) 18:50:23.05ID:EK9FZmu1厳密には、VBAでは変数宣言(定義)は必須ではないので
変数定義の位置によってスコープが変更されるようなことはないだろう
Option Explicitオフで宣言前に変数を使用してた場合、エラーになるのは変数宣言の方
つまり変数宣言以前にそのスコープにその変数が存在している
まあ、Option Explicitはオンで使うべきではあるんだが
>>137
VBAではブロックスコープは存在しないので
「関数ブロック内のどこででも変数定義できる」(ただし利用は定義後のみ)
が
「なるべく利用する直前で宣言する」のではなく、関数の先頭で宣言する事が薦められていた
MSがそう勧めてたこともあるので、VBAプログラマの多くは関数先頭宣言派だと思うぞ
まあ俺は最近は使う直前宣言に改宗したがw
0139デフォルトの名無しさん
2015/12/22(火) 19:27:38.21ID:nxtSgXHpというかプロシージャの長さによるね。10行越えたらちょっと考える。
0140デフォルトの名無しさん
2015/12/22(火) 19:41:14.20ID:eV+iF7baVBAの変数宣言は記述を省略できるだけで、変数を使った時点でVariant型として自動的に宣言される
コードに書かなかった場合はシステムが代わりに宣言しといてくれるんだよ
このソースを実行してみればわかる
Sub Macro1()
a = 1 ' ← 変数を使おうとした時点で、書かなくても自動的に Dim a As Variant が実行される
Dim a As Variant '←宣言が重複するのでエラーになる
End Sub
0141デフォルトの名無しさん
2015/12/22(火) 19:54:40.62ID:7wWwuT9q> Option Explicitオフで
今時あり得ん
議論する価値もない
0142デフォルトの名無しさん
2015/12/22(火) 19:57:05.43ID:EK9FZmu1スコープを狭めるとかいうのは間違いで、スコープは言語によって定義されていて
宣言位置や方法なんかによってどのスコープか決定されるだけだ
VBAで一番狭いスコープはプロシジャレベルなので、どこで宣言しようがそれよりスコープが狭まることはない
狭まるのは利用可能範囲だけ
まあ、利用可能範囲をスコープというならそれでも良いかという気がしてきたからもうどうでもいいやw
0143デフォルトの名無しさん
2015/12/22(火) 20:04:19.43ID:nxtSgXHp0144デフォルトの名無しさん
2015/12/22(火) 20:10:47.37ID:nxtSgXHpならそんなものほとんどつける意味ないし無駄。
0145デフォルトの名無しさん
2015/12/23(水) 00:21:34.23ID:e7byjM9n必要の根拠しめせないけど、
意味ないし無駄という根拠示せる?(Option Explicitを付けないメリット)
煽りじゃないですよ。
0146デフォルトの名無しさん
2015/12/23(水) 00:41:23.47ID:M5GRmAfS自分の経験上、一度も役立ったことがないというのが根拠。
付けないことにメリットがあるとまでは言ってない。
エディタの設定でOption Explicitはついているのだが、これまで一度も「変数が定義されていません」のエラーを出したことはない。
つまりDimし忘れることなんて普通は起こらないし、それへの保険なんて任意保険で十分。やらないのはあり得んみたいな言説はおかしい。
0147デフォルトの名無しさん
2015/12/23(水) 05:36:21.78ID:zGgTg8AL変数宣言しなくてもエラーにならないなんて忘れてたわ。
田中さんはこんな風に言ってるな。
http://officetanaka.net/excel/vba/beginner/11.htm
因みに余談だけど、.NetになるとOption Strictと言うのがあって、Option Explicitと一緒に書かれることが多い。
これは実行時バインディングで型が決まるものや、暗黙の変換を許可するかしないかを決めるものだけど、
型推論によって実行時バインディングで型を決めざるを得ないときもあるので、基本、付けると言うスタンスに留まることが多いかな。つまり、絶対ではない。
ただ、VBAであれ.Netであれ、Option Explicitに関しては今まで付けておいて困ったことはないな。
変数宣言も型も、明示的に設定していることが前提なら付けておいた方がいいだろな。
大丈夫な人は大丈夫なんだろうけど、それは「俺は今まで簡単なロジックでバグを出したことが無いから、
簡単なロジック部分のテストケースは作らない」と言ってるのと同じだな。
その人の信用性も有るんだろうけど、Option Explicitが付いていれば「ちゃんと変数宣言してますよ」と言うことの担保にもなる。
それでも、「いや、俺は絶対そんなミスは犯さないから付けない」と言うのであれば、もうそれ以上言うこと無いし。
最も大概の仕事場のコーディングルールでは付けることになっていると思うけどね。
0148デフォルトの名無しさん
2015/12/23(水) 09:46:21.95ID:QfnO5T+O若いっていいなあ
0149デフォルトの名無しさん
2015/12/23(水) 10:49:34.08ID:e7byjM9nみなさんレスどうもです。
俺はつける派かなOption Explicit
0150デフォルトの名無しさん
2015/12/23(水) 10:54:12.55ID:M5GRmAfSつけて助かったことあるの?
結局Optiob Explicitなんてシートベルトの価値ではなくて、チャリンコの補助輪の価値しかないと思う。
デフォルトで付けいて放置してるけどさ。
0151デフォルトの名無しさん
2015/12/23(水) 12:18:30.14ID:QfnO5T+O0152デフォルトの名無しさん
2015/12/23(水) 12:29:09.66ID:MZJ58G0+VBAのConstは定数式を与えなきゃならないので使いにくい。
0153デフォルトの名無しさん
2015/12/23(水) 19:56:05.25ID:M5GRmAfS引数もByRef Const受けできればいい。
0154デフォルトの名無しさん
2015/12/24(木) 10:15:31.90ID:+bsSlAyH> 狭まるのは利用可能範囲だけ
それを一般には変数のスコープという。
「第3回 スコープを意識したプログラミング―その2 変数のスコープ」
http://gihyo.jp/dev/serial/01/code/000302
0155デフォルトの名無しさん
2015/12/24(木) 10:17:46.35ID:+bsSlAyH> エディタの設定でOption Explicitはついているのだが、これまで一度も「変数が定義されていません」のエラーを出したことはない。
> つまりDimし忘れることなんて普通は起こらないし、それへの保険なんて任意保険で十分。やらないのはあり得んみたいな言説はおかしい。
typoは検出できる。
これ重要。
0156デフォルトの名無しさん
2015/12/24(木) 10:33:42.93ID:acHF714F正しいが、スコープの始まりはコントロールできても終わりはプロシージャの最後までと決まってるのが惜しいところだね。
0157デフォルトの名無しさん
2015/12/24(木) 10:59:36.15ID:+bsSlAyH> MSがそう勧めてたこともあるので、VBAプログラマの多くは関数先頭宣言派だと思うぞ
これか。
「変数とメソッドのスコープ」
https://msdn.microsoft.com/ja-jp/library/ms973875.aspx
> プロシージャ レベル スコープ
>
> 変数を宣言するための最も一般的な場所は、プロシージャの先頭です。これらの変数は、
> プロシージャ全体で利用することができます。プロシージャの先頭に変数を置いておけば、
> どのプロシージャでも変数宣言を簡単に見つけることができます。すべての変数宣言を
> 先頭に置くという習慣を身に着けていないと、変数がどこで宣言されているかがわからず、
> 変数に関連するバグを追跡するのに余分な時間がかかる可能性があります。
2001年12月の記事だけど、今でもMSはこう思ってるんだろうか。
0158デフォルトの名無しさん
2015/12/24(木) 11:34:44.56ID:acHF714Fそう思う
>>155
そう思う
自分はtypoはその場ですぐ見つけたいので、Option Explicitだけじゃなく他の方法も取ってる。
>>157
記憶がおぼろだけど、ずっと昔のVBEは先頭でのDimしかできなかったよね?
0159デフォルトの名無しさん
2015/12/24(木) 15:57:20.63ID:ta6MMntYVBAにおいて推奨するスタイルが変わったって記事は見たことが無いから
たぶん今でも一応そのスタイルが推奨なんじゃね
言語が変わればまた話は変わるけどな
VBAはVB6とほぼ同じスタイルが推奨されてたけど
VB6のスタイルはVB.NETでは推奨されてない奴も多いし
>>158
おれの記憶ではVBAは当初からずっと、先頭以外でもDim出来たが
0160デフォルトの名無しさん
2015/12/24(木) 16:00:38.09ID:Xid/rDIR0161デフォルトの名無しさん
2015/12/24(木) 16:30:39.57ID:+bsSlAyH2001年の古い記事に従うこともないと思うがな。
0162デフォルトの名無しさん
2015/12/24(木) 17:04:02.10ID:acHF714Fそうだっけ?なら自分の記憶違いかな。
使用直前の宣言はもちろんいいんだけど、VBAって初期化を同時にできないのがすごく残念だと思う。
Dim rootPai As Double = 2 * Atn(1#) ^ 0.5
って書きたいし、もっと言えば
Const rootPai As Double = 2 * Atn(1#) ^ 0.5
としたい。
0163デフォルトの名無しさん
2015/12/24(木) 21:25:39.16ID:ta6MMntY>リテラル値、その他の定数、Is を除く算術演算子や論理演算子を組み合わせた式を指定します。
らしい
関数とか使わん単純な計算式しか書けないのね
まあ、定数なんだから関数とか呼ぶなってことか
0164デフォルトの名無しさん
2015/12/24(木) 22:14:19.63ID:ZMYfZV7G0165デフォルトの名無しさん
2015/12/25(金) 00:23:24.10ID:H9I2iCjo>結局Optiob Explicitなんてシートベルトの価値ではなくて、チャリンコの補助輪の価値しかないと思う。
Optiobなんて書き間違えるくらいだし
そっちにはチャリンコの補助輪程度でも必要なんじゃないの?
0166デフォルトの名無しさん
2015/12/25(金) 00:55:16.56ID:QRbvg4rg「補助輪なんていらねーよ」と言いながら実際は補助輪を外したことがないというオチがもう付いてるじゃないかw
0167デフォルトの名無しさん
2015/12/25(金) 01:04:21.93ID:VYJL9Hpsって宣言をして、プロシージャ内でその変数を使うときは "camelcase" ってタイプする。
その直後に "camelCase" になったらtypoしてないし、でなきゃypoがある。
いつのまにやらそういう癖がついた。
0168デフォルトの名無しさん
2015/12/25(金) 08:22:37.15ID:pG0WUl9G0169デフォルトの名無しさん
2015/12/25(金) 08:25:15.59ID:zlW/tpNm0170デフォルトの名無しさん
2015/12/25(金) 16:52:37.89ID:WI9GtdKx変数名が間違っててそれぞれ別の変数として判別されてたのはみた事がある
コードが短かったからすぐ気がついたけど
長いコードだったら気付かず見過ごしてたかもしれない
後自分で書いたコードでは Option Explicit は必ず付けてるんだけど、
配列変数の宣言は
Dim Hoge() As Long
みたいに動的に宣言して、後から
Redim Hoge(5)
みたいに要素数を再定義してた
そしたら Redim の所で変数名間違えてて
最初の変数が要素数不定のままでエラーになってしまい、
原因が分らずに悩んだ事があった
Redimだけでも変数宣言として認められちゃうから
Option Explicit 使ってても
こういうパターンの間違いだとエラーにならんのよね
0171デフォルトの名無しさん
2015/12/25(金) 19:17:09.01ID:zlW/tpNm0172デフォルトの名無しさん
2015/12/26(土) 07:11:55.98ID:4Qu0RrtJ.Netのインテリセンスのこと?
.Net暫くやってて久しぶりにVBAでコーディングすると
余りの入力補助の利かなさにメモ帳に書いてるんじゃないかと錯覚するときあるよね。
特に打ち掛けのとき、変数名とか忘れて離れたところからコピーで取ってこようとすると
「ぷりん」とか音たててエラーメッセージが出て、元の行に飛ばされるのにはカチンとくる。
0173デフォルトの名無しさん
2015/12/26(土) 07:39:57.84ID:c6cv0MwcDim list_1 という宣言に対しては、liST_1 とか入力するの。
慣れると小指が勝手にシフトキーを押すようになるw
0174デフォルトの名無しさん
2015/12/26(土) 18:14:13.26ID:0Oe8t7C6自動構文チェック外せよ
0175デフォルトの名無しさん
2015/12/28(月) 09:45:36.91ID:6hjtvMur0176デフォルトの名無しさん
2015/12/28(月) 10:05:26.91ID:aQp7bRaK処理が終わったらPCをスリープ状態にする方法を教えたまえ
0177デフォルトの名無しさん
2015/12/28(月) 10:39:16.43ID:FcSlXts61 2 3 4
. __ __ _
,i,_,i_ ,-,_ ,-i,_,l 、 :.. :. ≡=-i'__l,
| `i /'-' `i //l l iコ==ラ`'i ti
| lヽi li, → | lヽl li → l i,,l l | → ./ /l/
| l-'l |,l | | // l `"|iコ='' / /
. 'Fヲ|,H E三l_l_A | .i .| / /
,i_| .| | | || | i' /l .l,
-'‐' | || |_ l l .ヽ,ヽ,
‐' ' `‐' -'-' -'-'
脱ぐ たたむ コーヒーを 砂糖と塩を
つくる まちがえる。
0178デフォルトの名無しさん
2015/12/28(月) 12:05:07.13ID:6hjtvMurやってみましたがうまくいきません
0179デフォルトの名無しさん
2015/12/28(月) 12:15:06.34ID:ylUAFX7e0180デフォルトの名無しさん
2015/12/28(月) 13:10:18.21ID:ehrXe3tWDeclare定義してやれば 使えたよ
ちなみに(Windows8.1 + Excel2013)
0181デフォルトの名無しさん
2015/12/28(月) 13:16:09.60ID:ylUAFX7eじゃあSetSuspendstate使ってみれば?
仮想環境とかだと上手くいかないかもしれないが。
0182180
2015/12/28(月) 14:13:12.83ID:ehrXe3tW専ブラスレの騒動に見舞われたので詳しく書けないけど
https://msdn.microsoft.com/en-us/library/aa373201(VS.85).aspx
あたりが参考にならないかな?(VBAじゃないけどね)
あとは ぐぐって
■ このスレッドは過去ログ倉庫に格納されています