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

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

■ このスレッドは過去ログ倉庫に格納されています
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/
0083デフォルトの名無しさん2015/12/10(木) 22:20:17.87ID:CRNEQuUV
Sub test()
k = 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
>>83
早速どうも。コードありがとうございます。

myArray(1,1) = 3
myArray(1,2) = 5
myArray(1,3) = 4

のとき、For文でしらみつぶしに調べることなく、
最大値となる(1,2)などを返す方法はないかなと思ったのです。
0085デフォルトの名無しさん2015/12/10(木) 22:48:15.01ID:CRNEQuUV
>>84
既にソートされているとか、そういう前提条件がない場合は虱潰し以外の方法はない。
素人くさいコードを書きたくないなら、VBAを見よう見まねで触る前に電子工学を学ぶ事をお勧めする。
0086デフォルトの名無しさん2015/12/10(木) 23:06:09.69ID:Ek2aQ7ct
>>85
端的な回答ありがとうございました。
前提条件はないので、シラミ潰しします。
素人なので素人臭くないスマートなコードに憧れます。
この発想が素人臭いのかもしれませんがw
0087デフォルトの名無しさん2015/12/11(金) 01:01:09.23ID:Gc5rivvs
WorksheetFunction.Matchを使えばいいんやよ
0088デフォルトの名無しさん2015/12/11(金) 12:01:23.27ID:e4IICcKi
>>76
http://officetanaka.net/excel/vba/tips/tips98.htm
0089デフォルトの名無しさん2015/12/11(金) 12:29:13.10ID:Wogf6bzX
>>88
MSDN見てみたが、これ使えるのかな?

ArrayList.Sort (IComparer)
指定した比較演算子を使用して、ArrayList 全体内の要素を並べ替えます。
0090デフォルトの名無しさん2015/12/11(金) 13:44:45.39ID:mI4o0uWv
配列要素の並び替えできたら便利だよなー。
帰って調べてみよ。
0091デフォルトの名無しさん2015/12/11(金) 14:19:39.54ID:UJeMV01i
>>87
>>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
>>92
もっと具体的でないとスマートな(効率的な)式が分からないけど、
例にしているものをコードにするなら

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:FuRVZgYl
素人でIE操作を試行錯誤しているのですが、どなたかアドバイスいただけますでしょうか。

1.表示されたページのAタグの中からキーワードを抽出してクリック
2.ページが表示されたら、そのままプルダウンなどを選択してクリック

と連続して操作させたいのですが、Aタグから抽出してクリックはできるものの、
その後デバッグになってしまい以降の処理が連続で行えません。

Set objA = objIE.Document.getElementsByTagName(
0095デフォルトの名無しさん2015/12/12(土) 01:49:15.80ID:FuRVZgYl
Set objA = objIE.Document.getElementsByTagName("A")
For 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
>>95
>>デバッグになってしまい
エラーになるって意味かな?

エラーになるコードはどれ?

もしかして
Set objA = Nothing
した後でobjAへオブジェクトをセットしないで
objA使ってたりしない?
0097デフォルトの名無しさん2015/12/12(土) 13:20:27.33ID:7OCEnpiZ
ttps://www.youtube.com/watch?v=M5MzENXybf0
これってどうやって作ってる?
0098デフォルトの名無しさん2015/12/12(土) 13:33:18.20ID:Yc8YF04u
>>97
作った本人に聞くべきだけど、たぶん普通のゲームの作り方そのままじゃないの。
0099デフォルトの名無しさん2015/12/12(土) 20:28:13.88ID:/A1wTFJW
>>93
回答ありがとうございます。
やってみます。
0100デフォルトの名無しさん2015/12/12(土) 22:56:55.45ID:rj6YNvj2
>>97
全く分からない。最初見たとき、エミュレータにExcelに見えるガワみたいなものを持たせたのかと思ったけど、
選択されたCellに対してのみBGが配色されているところ、BGの中でも木やブロックに配色の影響がないところを見ると、単純にエミュレータと言う訳でも無さそう。

ただ2面目でExcelの操作中にマリオが少し動くところを見ると、Excelとマリオは別スレッドで動いているのかもしれない。そうなると、
マリオはExcelの機能で動かしている訳ではないのではないかと思える。

でもここまできっちり作るには、もしエミュレータを利用していたとしても、少なくともファミコンのパレット機能を知っていなければならないし、
エデイト機能も持たせてあると言っていることから、
BGとその当たり判定のメモリへの展開も知っていることになる。

でも多分この人は自前で作ってるっぽい。何故ならCellの配色がBGの更に後ろにあって、Excelの機能と思しきものがファミコンの機能と思えるところの
更に奥に食い込んでいるように見えるから。

結論を言うとちょっと信じがたい話だけど、見よう見まねか、解析したか分からないけど、マリオをOpenGLみたいなものでキチンと作って
それをExcel上で動かしているのではと推測する。でもあくまで俺の推測だから本当のところは分からないよ。
0101デフォルトの名無しさん2015/12/19(土) 09:12:27.95ID:C2ZsZsZc
プログラマはMacを使ってるってマジ?
http://hayabusa3.2ch.net/test/read.cgi/news/1450395043/
0102デフォルトの名無しさん2015/12/19(土) 11:11:30.68ID:9nLc0qec
そんなんは業界によるし職場による
0103デフォルトの名無しさん2015/12/19(土) 17:17:12.17ID:t89iAcrU
>>89
IComparer インターフェイスが使えるかってこと?
よくわからないけど無理なんじゃないかな。
自分はArrayList知らなかったので比較演算子も含めてライブラリでほげふがしてる。
0104デフォルトの名無しさん2015/12/20(日) 00:57:16.89ID:zSz2t60X
>>103
試してないけど出来るんじゃないかな




.Netフレームワークインストールしてること前提だけど
0105デフォルトの名無しさん2015/12/20(日) 01:05:44.36ID:3zlmhSVS
>>104
出来るのなら可能性とし色々広がりそうだ。
ただソートや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
>>107
関数の戻り値の型がオブジェクトだから(Dictionaryオブジェクト)
0109デフォルトの名無しさん2015/12/21(月) 11:44:54.68ID:0jWvYEdM
Cells(r, 1) = Cells(r, 2) + Cells(r, 3) + Cells(r, 4) + Cells(r, 5)・・・
とやっていって最高いくつまで足せますか?
0110デフォルトの名無しさん2015/12/21(月) 11:53:17.32ID:dc09zofZ
>>109
VBEの文字数限界の話?やってみるしかないんじゃね?
0111デフォルトの名無しさん2015/12/21(月) 12:57:48.76ID:VBR60bJo
VBEでは1行は半角で65535文字まで
次の行に継続した場合の制限は非公開
0112デフォルトの名無しさん2015/12/21(月) 13:31:34.58ID:VBR60bJo
違った
物理行は1024バイト
論理行は65535バイト
0113デフォルトの名無しさん2015/12/21(月) 21:17:23.77ID:GVmX1WAG
?Join(repeat("a",1024),"")
aaaaaaaaaaaaaaaaaaaaaaaaaaaa・・・
a

となったから1023バイトまでだな
0114デフォルトの名無しさん2015/12/21(月) 22:31:21.13ID:ilnG5VR/
2010のVBEで試してみたけど、行末にアンダーバーが書けるのは連続で24行まで、つまり行の継続は25行までだった
行継続文字は2バイト消費するから、実際に使えるのは1021*24+1023=25527バイトってことになる

MSDNに書いてある「1行=65535バイト」ってのは到達できないと思われる
0115デフォルトの名無しさん2015/12/21(月) 23:10:27.03ID:ilnG5VR/
で、いくつまで足せるか実験しようとしてテキストエディタで書いたソースをVBEにコピペしようとしたらExcelが落ちた
こんな簡単な足し算一つで落とせるとは、意外だったわ

もしかして>>109は、このことをわかってて質問したのか?
0116デフォルトの名無しさん2015/12/21(月) 23:13:43.52ID:ilnG5VR/
再度実験中

とりあえずCells(r, 453)までは大丈夫
今んとこソースの計算式は1023文字×7行
0117デフォルトの名無しさん2015/12/21(月) 23:20:59.48ID:ilnG5VR/
513でエラーが出た
というわけで、1論理行の計算式で足せるのは512まで
つまり右辺に書けるRangeオブジェクトは511個まで

Cells(r, 1) = Cells(r, 2) + ・・・ + Cells(R, 512) まで

どうやら式が長すぎると一時的に作られるRangeオブジェクトがワークエリアを食い尽くすらしい
VBEの文字数の限界とはまったく関係ないところでひっかかるとは知らんかった
まだまだ勉強が足らんな
0118デフォルトの名無しさん2015/12/21(月) 23:34:01.24ID:ilnG5VR/
せっかく作ったんで512までのコード貼っとく
http://codepad.org/Dx6bniP1
0119デフォルトの名無しさん2015/12/21(月) 23:55:25.73ID:GVmX1WAG
好きだねアンタw
0120今日から俺は2015/12/22(火) 00:29:32.95ID:1Uckp5vQ
自作した画像を貼り付けるエクセルマクロです。
http://ww10.puny.jp/uploader/download/1450711580.zip
パスワード:abc


エラー処理に問題がないか、
アドバイス頂けませんでしょうか?

標準モジュールの
'<サブ処理(1)>
Sub 画像貼付〜
のエラー処理なんですが、

プログラマーの方のアドバイスを頂きたいです。
0121デフォルトの名無しさん2015/12/22(火) 11:18:45.06ID:1IjfeHrT
>>120
メイン関数が600行もあるので、内容は見る気まったくしない。

気づいた点:
・2行とか3行の連続した空行があるが、気持ち悪いのでやめて欲しい
・1個50行未満程度のFunction/Subに分けろ。そうすれば第三者も読む気になる

個人的な好み:
・変数宣言は必要になった場所で行え。そうすれば多少関数が長くなっても何十も変数宣言が続くことはなくなる
0122デフォルトの名無しさん2015/12/22(火) 11:30:47.44ID:71TpXAZk
平均10行未満、最長30行くらいで頼む。
0123デフォルトの名無しさん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:71TpXAZk
一般論だがローカル変数名なんてどうでもよくない?
Function/Sub名と引数名は重要だけど。
0125デフォルトの名無しさん2015/12/22(火) 12:29:08.69ID:eV+iF7ba
俺も見ようとしたけど空のウィンドウがいくつも開きっぱなしになってるのが気になった
仕事なら他人のソースでも必死に解読するけど、これは暇つぶしにできる範疇を超えてるは
0126デフォルトの名無しさん2015/12/22(火) 13:06:10.62ID:1IjfeHrT
>>124
Dnameは画像貼付()の第一引数。
引数名もひどいが、ローカル変数名もひどい。

> 一般論だがローカル変数名なんてどうでもよくない?
一般的にはどうだかわからないが、個人的にはどうでもよくない。
ネーミング超重要。
0127デフォルトの名無しさん2015/12/22(火) 13:28:33.58ID:71TpXAZk
>>126
そうなのか。
自分は逆だ。
名付けることが必要なローカル変数が発生すること自体避けたいタイプ。
0128デフォルトの名無しさん2015/12/22(火) 13:47:37.98ID:1IjfeHrT
>>127
一般論じゃないの?

それは一般的なのかみたいな不毛な議論したくないから曖昧な表現にしたが、
ローカル変数とはいえ、ネーミングに気を遣うのは良い習慣。
0129デフォルトの名無しさん2015/12/22(火) 14:15:48.13ID:6+FfHGxJ
むしろこれをどういう用途で使うのか気になった。
0130デフォルトの名無しさん2015/12/22(火) 14:25:32.96ID:toHtA+zz
VBAってIf文やFor文等のブロック内で変数宣言しても、そのブロック内だけのスコープにならないんだよね
結局1関数内に複数の処理があって、2箇所以上で使う変数は関数の先頭で宣言してる
0131デフォルトの名無しさん2015/12/22(火) 14:56:45.78ID:1IjfeHrT
>>130
ローカル変数のスコープとコードの読みやすさについては、「変数のスコープを小さくする」で
ググることをお勧めする。

ローカル変数宣言・定義を関数の先頭で行うのを強制される言語以外では、スコープを最小と
することが推奨される。
0132デフォルトの名無しさん2015/12/22(火) 15:12:03.64ID:71TpXAZk
>>130
確かにその点は困りものだ。
別な変数を使えばよいのだが、あまり綺麗ではない。
0133デフォルトの名無しさん2015/12/22(火) 17:04:33.32ID:EK9FZmu1
>>131
>ローカル変数宣言・定義を関数の先頭で行うのを強制される言語
べつにVBAは関数の先頭での宣言を「強制」なんてされないが、スコープは狭い方が良い
ただし、VBAにはブロックレベルのスコープがないだけ
関数の先頭での宣言が「薦められていた」のは
スコープの先頭で、そのスコープ内の変数まとめて宣言した方がわかりやすいよね、って言う事

つかローカル変数定義を関数の先頭で宣言する事を強制される言語ってたとえば何?

>>130,132
まあ、そういう時は関数分けろってのが一般的な解決法なんじゃね
0134デフォルトの名無しさん2015/12/22(火) 17:24:02.60ID:1IjfeHrT
>>133
VBAの「変数のスコープ」は、宣言・定義した位置から下だよ。
だから、関数の先頭じゃなくてもっと狭められる。
0135デフォルトの名無しさん2015/12/22(火) 17:48:13.32ID:nxtSgXHp
>>134
ブロックレベル、というのが通じてないのかな?
つまりひとつの関数の中で、

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
>>135
> ブロックレベル、というのが通じてないのかな?
いや、通じてるよ。

だからといって
> 結局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
>>134
厳密には、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+iF7ba
宣言しなくても使える、とはちょっと違うんだけどな
VBAの変数宣言は記述を省略できるだけで、変数を使った時点でVariant型として自動的に宣言される
コードに書かなかった場合はシステムが代わりに宣言しといてくれるんだよ
このソースを実行してみればわかる

Sub Macro1()
  a = 1  ' ← 変数を使おうとした時点で、書かなくても自動的に Dim a As Variant が実行される
  Dim a As Variant  '←宣言が重複するのでエラーになる
End Sub
0141デフォルトの名無しさん2015/12/22(火) 19:54:40.62ID:7wWwuT9q
>>138
> Option Explicitオフで

今時あり得ん
議論する価値もない
0142デフォルトの名無しさん2015/12/22(火) 19:57:05.43ID:EK9FZmu1
じゃあ言い方を変えてあげよう
スコープを狭めるとかいうのは間違いで、スコープは言語によって定義されていて
宣言位置や方法なんかによってどのスコープか決定されるだけだ
VBAで一番狭いスコープはプロシジャレベルなので、どこで宣言しようがそれよりスコープが狭まることはない
狭まるのは利用可能範囲だけ

まあ、利用可能範囲をスコープというならそれでも良いかという気がしてきたからもうどうでもいいやw
0143デフォルトの名無しさん2015/12/22(火) 20:04:19.43ID:nxtSgXHp
しかしVBAでタイプセーフとか言う気は起こらないのであった
0144デフォルトの名無しさん2015/12/22(火) 20:10:47.37ID:nxtSgXHp
ん、Option Explicitのことだったか。
ならそんなものほとんどつける意味ないし無駄。
0145デフォルトの名無しさん2015/12/23(水) 00:21:34.23ID:e7byjM9n
>>144
必要の根拠しめせないけど、
意味ないし無駄という根拠示せる?(Option Explicitを付けないメリット)
煽りじゃないですよ。
0146デフォルトの名無しさん2015/12/23(水) 00:41:23.47ID:M5GRmAfS
>>145
自分の経験上、一度も役立ったことがないというのが根拠。
付けないことにメリットがあるとまでは言ってない。
エディタの設定でOption Explicitはついているのだが、これまで一度も「変数が定義されていません」のエラーを出したことはない。
つまりDimし忘れることなんて普通は起こらないし、それへの保険なんて任意保険で十分。やらないのはあり得んみたいな言説はおかしい。
0147デフォルトの名無しさん2015/12/23(水) 05:36:21.78ID:zGgTg8AL
むしろ自分はOption Explicit付けないこと無かったから、
変数宣言しなくてもエラーにならないなんて忘れてたわ。

田中さんはこんな風に言ってるな。
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
>>148
つけて助かったことあるの?
結局Optiob Explicitなんてシートベルトの価値ではなくて、チャリンコの補助輪の価値しかないと思う。
デフォルトで付けいて放置してるけどさ。
0151デフォルトの名無しさん2015/12/23(水) 12:18:30.14ID:QfnO5T+O
なんだただのギャグか
0152デフォルトの名無しさん2015/12/23(水) 12:29:09.66ID:MZJ58G0+
スコープの話出てたけど、普通あるのにVBAになくて困るものとして定数(const)が欲しい。
VBAのConstは定数式を与えなきゃならないので使いにくい。
0153デフォルトの名無しさん2015/12/23(水) 19:56:05.25ID:M5GRmAfS
>>152
引数もByRef Const受けできればいい。
0154デフォルトの名無しさん2015/12/24(木) 10:15:31.90ID:+bsSlAyH
>>142
> 狭まるのは利用可能範囲だけ
それを一般には変数のスコープという。

「第3回 スコープを意識したプログラミング―その2 変数のスコープ」
http://gihyo.jp/dev/serial/01/code/000302
0155デフォルトの名無しさん2015/12/24(木) 10:17:46.35ID:+bsSlAyH
>>146
> エディタの設定でOption Explicitはついているのだが、これまで一度も「変数が定義されていません」のエラーを出したことはない。
> つまりDimし忘れることなんて普通は起こらないし、それへの保険なんて任意保険で十分。やらないのはあり得んみたいな言説はおかしい。
typoは検出できる。
これ重要。
0156デフォルトの名無しさん2015/12/24(木) 10:33:42.93ID:acHF714F
>>154
正しいが、スコープの始まりはコントロールできても終わりはプロシージャの最後までと決まってるのが惜しいところだね。
0157デフォルトの名無しさん2015/12/24(木) 10:59:36.15ID:+bsSlAyH
>>138
> MSがそう勧めてたこともあるので、VBAプログラマの多くは関数先頭宣言派だと思うぞ
これか。
「変数とメソッドのスコープ」
https://msdn.microsoft.com/ja-jp/library/ms973875.aspx

> プロシージャ レベル スコープ
>
> 変数を宣言するための最も一般的な場所は、プロシージャの先頭です。これらの変数は、
> プロシージャ全体で利用することができます。プロシージャの先頭に変数を置いておけば、
> どのプロシージャでも変数宣言を簡単に見つけることができます。すべての変数宣言を
> 先頭に置くという習慣を身に着けていないと、変数がどこで宣言されているかがわからず、
> 変数に関連するバグを追跡するのに余分な時間がかかる可能性があります。

2001年12月の記事だけど、今でもMSはこう思ってるんだろうか。
0158デフォルトの名無しさん2015/12/24(木) 11:34:44.56ID:acHF714F
>>152
そう思う

>>155
そう思う
自分はtypoはその場ですぐ見つけたいので、Option Explicitだけじゃなく他の方法も取ってる。

>>157
記憶がおぼろだけど、ずっと昔のVBEは先頭でのDimしかできなかったよね?
0159デフォルトの名無しさん2015/12/24(木) 15:57:20.63ID:ta6MMntY
>>157
VBAにおいて推奨するスタイルが変わったって記事は見たことが無いから
たぶん今でも一応そのスタイルが推奨なんじゃね

言語が変わればまた話は変わるけどな

VBAはVB6とほぼ同じスタイルが推奨されてたけど
VB6のスタイルはVB.NETでは推奨されてない奴も多いし

>>158
おれの記憶ではVBAは当初からずっと、先頭以外でもDim出来たが
0160デフォルトの名無しさん2015/12/24(木) 16:00:38.09ID:Xid/rDIR
言語仕様が変わってないから推奨される記述スタイルも変わってなさそう
0161デフォルトの名無しさん2015/12/24(木) 16:30:39.57ID:+bsSlAyH
まあ最近の流れは、どの言語でも使用する直前で変数宣言するのが推奨されてるから、
2001年の古い記事に従うこともないと思うがな。
0162デフォルトの名無しさん2015/12/24(木) 17:04:02.10ID:acHF714F
>>159
そうだっけ?なら自分の記憶違いかな。
使用直前の宣言はもちろんいいんだけど、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
Const、式もかけたはずだと思ってしらべたけど
>リテラル値、その他の定数、Is を除く算術演算子や論理演算子を組み合わせた式を指定します。
らしい
関数とか使わん単純な計算式しか書けないのね
まあ、定数なんだから関数とか呼ぶなってことか
0164デフォルトの名無しさん2015/12/24(木) 22:14:19.63ID:ZMYfZV7G
VBAはコンパイラじゃないから・・・
0165デフォルトの名無しさん2015/12/25(金) 00:23:24.10ID:H9I2iCjo
>>150

>結局Optiob Explicitなんてシートベルトの価値ではなくて、チャリンコの補助輪の価値しかないと思う。

Optiobなんて書き間違えるくらいだし
そっちにはチャリンコの補助輪程度でも必要なんじゃないの?
0166デフォルトの名無しさん2015/12/25(金) 00:55:16.56ID:QRbvg4rg
もうほっときなよ
「補助輪なんていらねーよ」と言いながら実際は補助輪を外したことがないというオチがもう付いてるじゃないかw
0167デフォルトの名無しさん2015/12/25(金) 01:04:21.93ID:VYJL9Hps
Dim camelCase As Long
って宣言をして、プロシージャ内でその変数を使うときは "camelcase" ってタイプする。
その直後に "camelCase" になったらtypoしてないし、でなきゃypoがある。
いつのまにやらそういう癖がついた。
0168デフォルトの名無しさん2015/12/25(金) 08:22:37.15ID:pG0WUl9G
ypoしてますね
0169デフォルトの名無しさん2015/12/25(金) 08:25:15.59ID:zlW/tpNm
シャレか
0170デフォルトの名無しさん2015/12/25(金) 16:52:37.89ID:WI9GtdKx
他人の書いたOption Explicitを使ってないコードをデバッグしてて、
変数名が間違っててそれぞれ別の変数として判別されてたのはみた事がある

コードが短かったからすぐ気がついたけど
長いコードだったら気付かず見過ごしてたかもしれない

後自分で書いたコードでは Option Explicit は必ず付けてるんだけど、
配列変数の宣言は
Dim Hoge() As Long
みたいに動的に宣言して、後から
Redim Hoge(5)
みたいに要素数を再定義してた

そしたら Redim の所で変数名間違えてて
最初の変数が要素数不定のままでエラーになってしまい、
原因が分らずに悩んだ事があった

Redimだけでも変数宣言として認められちゃうから
Option Explicit 使ってても
こういうパターンの間違いだとエラーにならんのよね
0171デフォルトの名無しさん2015/12/25(金) 19:17:09.01ID:zlW/tpNm
やっぱり赤い波線がほしいな
0172デフォルトの名無しさん2015/12/26(土) 07:11:55.98ID:4Qu0RrtJ
>>171
.Netのインテリセンスのこと?
.Net暫くやってて久しぶりにVBAでコーディングすると
余りの入力補助の利かなさにメモ帳に書いてるんじゃないかと錯覚するときあるよね。

特に打ち掛けのとき、変数名とか忘れて離れたところからコピーで取ってこようとすると
「ぷりん」とか音たててエラーメッセージが出て、元の行に飛ばされるのにはカチンとくる。
0173デフォルトの名無しさん2015/12/26(土) 07:39:57.84ID:c6cv0Mwc
自分も>>167のやり方は実践している。
Dim list_1 という宣言に対しては、liST_1 とか入力するの。
慣れると小指が勝手にシフトキーを押すようになるw
0174デフォルトの名無しさん2015/12/26(土) 18:14:13.26ID:0Oe8t7C6
>>172
自動構文チェック外せよ
0175デフォルトの名無しさん2015/12/28(月) 09:45:36.91ID:6hjtvMur
処理が終わったらPCをスリープ状態にする方法を教えてください。
0176デフォルトの名無しさん2015/12/28(月) 10:05:26.91ID:aQp7bRaK
まだか?
処理が終わったらPCをスリープ状態にする方法を教えたまえ
0177デフォルトの名無しさん2015/12/28(月) 10:39:16.43ID:FcSlXts6
>>175
    1         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
>>177
やってみましたがうまくいきません
0179デフォルトの名無しさん2015/12/28(月) 12:15:06.34ID:ylUAFX7e
ちょっと調べてみたが SetSuspendStateって使えるのかな?
0180デフォルトの名無しさん2015/12/28(月) 13:10:18.21ID:ehrXe3tW
>>179
Declare定義してやれば 使えたよ
ちなみに(Windows8.1 + Excel2013)
0181デフォルトの名無しさん2015/12/28(月) 13:16:09.60ID:ylUAFX7e
>>178
じゃあSetSuspendstate使ってみれば?
仮想環境とかだと上手くいかないかもしれないが。
01821802015/12/28(月) 14:13:12.83ID:ehrXe3tW
>>175,178
専ブラスレの騒動に見舞われたので詳しく書けないけど

https://msdn.microsoft.com/en-us/library/aa373201(VS.85).aspx
あたりが参考にならないかな?(VBAじゃないけどね)

あとは ぐぐって
■ このスレッドは過去ログ倉庫に格納されています