Excel VBA 質問スレ Part39at TECH
Excel VBA 質問スレ Part39 - 暇つぶし2ch1:デフォルトの名無しさん
15/11/27 20:36:45.35 9HV+ag/s.net
ExcelのVBAに関する質問スレです
                   ___
       ___      /____ヽ      ____
      /____\    | |´・ω・`| |    /___ヽ
      .l |´・ω・`|  ニX二 . ̄ ̄ ̄  二X二  |´・ω・`| l 俺たちに任せろ
      !、 ̄ ̄ ̄  ヽ   |       |    /    ̄ ̄ ̄/
       ヽ_/ヽ、  ヽ__)  \__/\_/.   /_/  ノヽ_/
             ̄                ̄ ̄
このスレはコード書き込みOKです。
作成依頼もOKですが、作成依頼限定ではありません。
コードが嫌な人・作成依頼が嫌な人は別スレ建ててください。
※前スレ
Excel VBA 質問スレ Part38 [転載禁止]2ch.net
スレリンク(tech板)

2:デフォルトの名無しさん
15/11/30 19:06:16.48 zHM+I8Nt.net
Sub 1_Otsu()

3:デフォルトの名無しさん
15/11/30 21:18:18.94 QHANvkhd.net
変数宣言を強制するほうが先だろうが

4:デフォルトの名無しさん
15/12/01 19:27:05.42 m+Ed34Zj.net
最近、vbaを学んだ者ですが、配列の有り難みがよくわかりません。
前スレで大量のセルを処理するときは配列に入れろみたいな書きこみを見ましたが、配列が役に立つ局面を教えていただけないでしょうか。
よろしくお願いします

5:デフォルトの名無しさん
15/12/01 20:28:12.95 eT3ZeD+F.net
>>4
配列処理はワークシートのレイアウトとかと無関係に独立したライブラリにしやすい。

6:デフォルトの名無しさん
15/12/01 21:07:28.65 3m4PeF6r.net
配列の有効性が分からないってVBAを学んだって言えないレベルだろ。
Z80エミュレータからやり直せ。

7:デフォルトの名無しさん
15/12/01 21:20:20.66 bdqEzHLJ.net
>>4
そもそもエクセルのセル自体が広義の意味では2次元配列そのものなので
エクセルを使うという事はすなわち配列を使うことに他ならないわけです。
(A1セル一個しか使わないというなら話は別ですが、そんな人はまず居ないでしょうし。)
貴方の言う「配列」がVBAにおける「配列変数」の事であれば、
連続したデータを順に扱う、
複数のデータに対して繰り返し同じ処理をする、
といったような操作をする際には
配列変数は非常に便利(というか無しではお話にならない)です。

8:デフォルトの名無しさん
15/12/01 23:23:09.59 DoIn4zBF.net
初心者の質問ですが
例えばワークシートに値を入力するときに
Worksheets(1).Name = "2ちゃん"
でシート1のシート名が変更されますよね。でもオブジェクト名のsheet1を使っても変更できますよね。
オブジェクト名を変えた場合にWorksheets(1)かどうか確認するのはどうやったらいいんでしょうか。
シートのプロパティウィンドウみてもオブジェクト名は書いてるけどWorksheets(1)かどうか載ってない

9:デフォルトの名無しさん
15/12/01 23:41:37.98 VMDnA6sJ.net
>>8
Debug.Print Worksheets("sheet1").Index
ちなみに index値は シートタブの左から 1 2 3 ・・・・
となりますので シートオブジェクトと index値は常に 一致するとは限りませんよ

10:デフォルトの名無しさん
15/12/01 23:44:42.53 6iNC03K1.net
年と月をそれぞれB1とD1に入力するだけで日と曜日を自動出力するマクロを作りたいのですが
(たとえば、2015と12と入れればその下に
 1
 火
 2
 水
 といったぐあいに31日まで出力してくれるようなのを目指してます)
自分なりに組んでみたのですが、なかなかうまくいきません
Offsetが悪いのかな、とも思うのですが代替案が浮かびません、どうか助言をお願いします
Excel2013です
Sub Sample()
Dim a As Range
Dim b As Variant
Dim u As Integer
Dim v As Integer
Dim w As Integer
Dim x As Integer
Dim y As Integer
Dim z As Integer
v = 0
w = Range(

11:デフォルトの名無しさん
15/12/01 23:48:55.25 DoIn4zBF.net
>>9
それではWorksheets(1)というのはシートタブの1番左という意味でいいのでしょうか?

12:デフォルトの名無しさん
15/12/01 23:49:02.31 6iNC03K1.net
あれ、切れてる
w = Range("B1")
z = Range("D1")
If z = 2 And Day(Dateserial(w,2,29)) = 29 Then
y = 29
Else: y = 28
If z = 4 Or 6 Or 9 Or 11 Then
y = 30
Else: y = 31
End If
End If
For x = 1 To y
w = v * 2
Range("B3").Offset(0,w) = x
b = "Weekday(w,z,x)"
u = w + 1
Range("B3").Offset(0,u) = b
Next x
End Sub

13:デフォルトの名無しさん
15/12/01 23:52:23.38 VMDnA6sJ.net
>>11
そゆこと
ちなみにこれで確かめてみればどうかな?
Debug.Print Worksheets(1).Name
シート名が返ります

14:デフォルトの名無しさん
15/12/01 23:57:05.93 DoIn4zBF.net
>>13
なるるー
イミディエイトで確認できました!ありがと

15:デフォルトの名無しさん
15/12/02 00:19:38.80 iA4P55nL.net
>>12
こんなかんじ?
日と曜日は別の列のほうが良い気もするけど(セルの書式が違っちゃうから)
Sub test()
Dim yr As Long
Dim mo As Long
Dim dy As Long
With ThisWorkbook.Sheets(1)
 .Cells(3, 2).CurrentRegion.Clear
 yr = .Range("B1")
 mo = .Range("D1")
 For dy = 1 To Day(DateSerial(yr, mo + 1, 0))
  .Cells(dy * 2 + 1, 2) = dy
  .Cells(dy * 2 + 2, 2) = DateSerial(yr, mo, dy)
  .Cells(dy * 2 + 2, 2).NumberFormatLocal = "aaa"
 Next dy
 End With
End Sub

16:デフォルトの名無しさん
15/12/02 00:29:46.76 YKAbvKrp.net
>>15
ありがとうございます
こんなに簡素化できるものなんですね……精進します

17:デフォルトの名無しさん
15/12/02 00:33:35.11 BpyWczK7.net
>>11
添削してみた
変数はわかりやすい名前にした方が良いと思うぞ

If z = 2 And Day(DateSerial(w, 2, 29)) = 29 Then
y = 29
Else: y = 28
If z = 4 Or z = 6 Or z = 9 Or z = 11 Then '変更
y = 30
Else: y = 31
End If
End If
For x = 1 To y
v = x * 2            '変更
Range("B3").Offset(0, v) = x
b = Weekday(DateSerial(w, z, x)) '変更
u = v + 1
Range("B3").Offset(0, u) = WeekdayName(b) '変更
Next x

18:17
15/12/02 00:34:44.42 BpyWczK7.net
アンカ間違えた
>>12 さんへね

19:デフォルトの名無しさん
15/12/02 00:38:55.45 iA4P55nL.net
>>16
とりあえず年(仮にyrとする)と月(仮にmoとする)が定まれば
Day(DateSerial(yr, mo + 1, 0))
つまり、翌月のゼロ日(1日の前の日)を求める事で、
その月の日数をエクセルが自動的に出してくれるんですよ
あと、セルの書式設定も日と曜日が別の列なら
曜日の列だけをNumberFormatLocal = "aaa"でいっぺんに設定できます
例えば曜日をC列にするなら
.Columns(3).NumberFormatLocal = "aaa"
だけで済むわけです
>>15みたいにループの中で1セルずつ変更するってのは
あまり格好良いもんじゃないですよね?

20:デフォルトの名無しさん
15/12/02 10:37:37.63 CO7jH6lO.net
4です、ご返事ありがとうございます。
叩かれること覚悟で書きますが、同じ処理の繰り返しなら配列変数ではなくても、for next
とかfor eachステートメントでは、望ましくないのでしょうか?

21:7
15/12/02 11:33:14.55 ZeoaW+75.net
for each はともかく、 for next は処理対象を番号で指定するじゃないですか。
番号で指定すると言うことは
配列変数との親和性が高いと思いませんか?
既に言及したとおり、
エクセルのセルは2次元の配列ですから、
セルに対してfor next で繰り返し処理をするというのは
まさしく配列操作そのものなのです。
もし、広義の配列そのものではなく、
redimで宣言する狭義の配列変数のみについて
有効性を論じたいと言うのであれば、
セルに代入するよりも速度が速いとか
メモリの消費量が少ないとか、
3次元以上の配列を扱いたいケース
(まぁ、多次元配列は遅いらしいですけど)
とか、そんな理由があげられますね。
とはいえ、配列など不要だと思うならば
無理に使う必要は無いですし、
その辺は使う人の自由ですよね。

22:デフォルトの名無しさん
15/12/02 11:50:42.44 tBPWNP4P.net
>>20
配列を使わず for next とはどのようなものを想定しているんですか?

23:4
15/12/02 12:15:32.57 IdfHYqnb.net
For nextも配列立ったのですか、知らなかったです。
てっきり、配列とは
Dim i(5) as long
みたいなものだけを指すと考えており、上手い使い方がよくわかっていませんでした

24:デフォルトの名無しさん
15/12/02 12:32:59.22 1aVlPH12.net
>>23
そういう固定長配列とReDimで作る可変長配列がある。>>21氏の言うところの狭義の配列ですね。
「For Nextも配列だっのですか」という文は意味不明ですが、何かを勘違いしてる?。

25:デフォルトの名無しさん
15/12/02 13:35:58.72 ES2jo2hu.net
質問お願いします!
演算子を変数に格納することはできませんか?
b = ”<=”
If n & b & 10 then
みたいに使いたいのですが、型が一致しませんというエラーとなります。

26:7
15/12/02 14:29:54.99 xdo22nBP.net
If Evaluate(n & b & 10) then
でいけます

27:デフォルトの名無しさん
15/12/02 15:59:46.36 IdfHYqnb.net
24さんへ
自分にとって配列とは狭義のものと、(A1:C5)みたいなものだけをだけだと思ってました。
Fornextは、配列と関係ないと考えてました

28:デフォルトの名無しさん
15/12/02 17:50:57.38 megPAB6I.net
>>26
ありがとうございました!

29:デフォルトの名無しさん
15/12/02 18:37:30.73 l3wtZpWO.net
もう一つお願いします!
配列を別の変数に格納するときは、次のようなコードで大丈夫でしょうか?一応テストでは成功していますが、なんとなく作って出来てしまったもので、、使い方が危ない場合、ご指摘お願いします。
dim varA as variant
redim a(10,0)
redim b(10,0)
if n = 0 then
varA = a()
else
varA = b()
end if

30:デフォルトの名無しさん
15/12/02 19:04:11.72 1aVlPH12.net
>>29
varA = a、varA = bでいい。後ろの()は不要。varAはVariantだからそれでいける。
代入したものは元の配列のコピーであって別物だよ。コピーする意味はあまりないと思うけど?

31:デフォルトの名無しさん
15/12/02 19:26:54.23 UPwzPe+L.net
>>30
ありがとうございます。助かりました!
a.bは既に要素が入ってる配列のつもりでした。
後に場合分けで参照するときにコード短縮の為に変数格納しました。
少し書き方が悪かったですね。すいません。

32:デフォルトの名無しさん
15/12/04 14:58:36.71 R21wXbu/.net
みんなが今まで読んだVBAの本の中で1番良かった本またはベスト3あったら教えてくれ

33:デフォルトの名無しさん
15/12/04 17:23:30.92 gPECvyso.net
入門書を一冊しか読まなかった
できるシリーズのヤツ
お勧めはしないけど

34:デフォルトの名無しさん
15/12/04 18:25:37.86 R21wXbu/.net
オススメしないんかーいw

35:デフォルトの名無しさん
15/12/04 19:42:49.81 otf7riqF.net
マイコンBASICマガジンで覚えた

36:デフォルトの名無しさん
15/12/04 19:59:12.15 sb8rC8Nq.net
初学は自動記録とネットの情報で事足りた
ある程度使える様になってから逆引き辞典買ったけど余り役には立ってない

37:デフォルトの名無しさん
15/12/05 04:12:41.80 CzoZcA89.net
俺もVBA関連の書籍は読んだことないな
ネットが今ほど充実してなかった大昔ならいざ知らず
ほとんどマクロの記録とネットでの検索で十分だしね
ま、構文の文法すら分らない超初心者なら
適当な入門書は読んだ方が良いとは思うけど

38:デフォルトの名無しさん
15/12/05 07:09:21.83 r4Zj1qpg.net
>>32
入門書なら最近でたVBAの神様オススメ
小説仕立てで楽しく読み進められる

39:デフォルトの名無しさん
15/12/05 09:12:30.30 R3VpKF0E.net
ネットの情報で十分なんだけど、第三者に見られる事を考えたら
やはり一度はしっかりとした言語仕様とリファレンスの本読みたいね
自分も知らずにEvaluateとか自作してしまったし

40:デフォルトの名無しさん
15/12/05 18:36:02.45 kpxGhXzN.net
>>39
スゲー
どうやったら出来るのかソーゾーも出来ない。
俺だったら精々不等号のパターン4つかそこらの場合分けで条件分岐させるのが関の山で、evaluateみたいに文字列で自由に式評価させるなんてとても無理だ。

41:デフォルトの名無しさん
15/12/05 19:51:10.55 xfTuOD8g.net
>>39
第三者に見られる環境ならば逆に他人のコードも見れるって事じゃないか、見て盗め

42:デフォルトの名無しさん
15/12/05 22:14:54.16 2rD0PXa4.net
>>40
Evaluate自作なんて無理でしょ。というか目指すべきことじゃないよ実行時に意味が確定するなんて。

43:デフォルトの名無しさん
15/12/06 01:02:05.80 RRzw5NLa.net
実行時評価(計算)なんて普通は使うもんじゃないけど、
乗算の度に小数点以下の切り上げを行う(しない場合もある)必要があって、
しかも計算式をユーザーが入力するというツールを作る際に使った

44:デフォルトの名無しさん
15/12/06 01:19:20.97 Rb3lVfqw.net
使える演算子が乗算一種類なら、まあ簡単だな

45:デフォルトの名無しさん
15/12/07 09:13:19.44 jD12UvhK.net
その程度でevaluate自作とか言われるのって、
寿司奢るって言われて
コンビニの納豆巻き一本渡されるぐらいのガッカリ感だな

46:デフォルトの名無しさん
15/12/07 21:09:19.70 6aFt31sh.net
自作Evaluateと乗算のみの実行時評価は別だよ
四則計算のみ(括弧対応)のEvaluate
URLリンク(ideone.com)
あまり使ってないから正しく動くかどうかは保証しない

47:デフォルトの名無しさん
15/12/08 11:48:40.10 W1o0a1vT.net
やめようよ

48:デフォルトの名無しさん
15/12/08 19:21:03.28 ZPfyD2ax.net
エクセルに詳しい人いたらこれに答えて~
URLリンク(i.imgur.com)

49:デフォルトの名無しさん
15/12/08 19:24:33.40 eOnXmxYQ.net
嫌です

50:デフォルトの名無しさん
15/12/08 19:45:20.81 WQt5IVqj.net
>>48
3 とか -3 をそのまま打てばいいやん w

51:デフォルトの名無しさん
15/12/08 19:52:00.68 8bkF9KCf.net
VBAとセル計算ってどっちが速いの?
例えばVBAで
A1に○○代入(数値)
A2に○○代入(数値)

A20に○○代入(数値)
B1セルの値をB2に代入
みたいなVBAがあるとして
ここでB1セルにはA1~A20を使ってifとか色々な関数使った長い式があるとする
この場合にB1セルの計算が終わる前にVBAが追い越して数値を代入することってありえるの?

52:デフォルトの名無しさん
15/12/08 19:55:43.49 ZPfyD2ax.net
誰か>>48頼む!
=if(a3>a2,3,-3)を入力しても無理だった・・・

53:デフォルトの名無しさん
15/12/08 19:57:18.42 J4OFLa1h.net
>>51
同時には実行されないから、関数よりもマクロが先に実行される仕組みならマクロが先に代入する。
>>52
VBAの話題ではない。

54:デフォルトの名無しさん
15/12/08 20:50:48.64 4cJ0X+3R.net
>>52
無理って何だよ?それでいけるだろ

55:デフォルトの名無しさん
15/12/08 21:36:53.02 KvNJeD9m.net
>>52
セルの書式が文字列とかじゃね

56:デフォルトの名無しさん
15/12/08 21:49:08.87 46EuwWyR.net
>>51
計算方法が自動なら
> A1に○○代入(数値)
で再計算が行なわれる
以下
> A20に○○代入(数値)
まで、20回計算される
なので
> この場合にB1セルの計算が終わる前にVBAが追い越して数値を代入することってありえるの?
なんてことはない
20回も計算するのは時間がかかってしょうがないと言う時は、最初に Application.Calculation = xlCalculationManual とかして計算しない様にしておいて、A20 に代入したあとで、Application.Calculate とか実行しすると計算は1回ですむ

57:デフォルトの名無しさん
15/12/09 01:33:16.84 bb4JBp1r.net
>>53>>56
なるほどなー
要するに、VBAでセルに数値が代入される→数値が変わった時点でセル内の再計算→またVBAに戻る
って感じか。なるほどなるほど。ありがと

58:デフォルトの名無しさん
15/12/09 01:56:13.57 A8KFlPn0.net
全てセミコロンに変えたら解決できました
=if(c3>c2;3;-3)
どうもありがとう

59:デフォルトの名無しさん
15/12/09 02:02:30.52 ZB9BGZbY.net
なりすまし

60:デフォルトの名無しさん
15/12/09 11:36:59.80 NOtadkaS.net
エクセルにcsvファイルのデータを貼り付けて一部の列にvlookupの数式を上書きしたいんですけど
どうすればよいですか?
マクロにしたいのは数式の上書き部分だけです

61:デフォルトの名無しさん
15/12/09 12:25:31.08 ZB9BGZbY.net
>>60
例えばC列に数式を入れたいときは
Range("C1").Formula = "=VLOOKUP(B1,A:A,1)"
みたいに数式を文字列にしてセルのFormulaに入れればいい

62:デフォルトの名無しさん
15/12/09 16:22:59.08 NOtadkaS.net
>>61
ありがとうございます。

63:デフォルトの名無しさん
15/12/09 16:59:02.21 bb4JBp1r.net
学生でVBAとSQL使って競馬のソフト作ったりして遊んでるけど、就活の時にそういうのアピールしてもいいかな

64:デフォルトの名無しさん
15/12/09 17:09:37.89 h+7RpR46.net
>>63
マジレスすると、ギャンブルするような学生はいらんってことになるな

65:デフォルトの名無しさん
15/12/09 17:21:13.51 bb4JBp1r.net
>>64
やっぱり印象悪いかな
データ集めて統計使って指数出したりするの好きなんだよな

66:デフォルトの名無しさん
15/12/09 17:57:02.43 h+7RpR46.net
>>65
さらにマジレスすると、独創的なアルゴリズムを使った予想をしているならそのアルゴリズム
その、実装がむずかしいとされているものを既存のアルゴリズムを用いて実装したり(遺伝的
アルゴリズムでNSPを解決するなど)があるなら、アピールポイントになると思うよ

67:デフォルトの名無しさん
15/12/09 22:32:23.05 ulePTNdz.net
素人にはプログラムなんてよく分からないからね
自分も入社時に現場叩き上げの人直々に面接されたが、WindowsのGUIアプリをフロッピーで持っていった所、
結局何が書いてあるのか分からなかったのか見てもらえなかったし
Unixの知識についてはあれこれ聞かれたが
IT業界以外ならVBAを使いこなせます、アプリ作ったことありますってだけで十分アピールポイントになると思うよ
VBAって何?SQLって何?ってことになる可能性があるからそこら辺はしっかり予習した方がいいと思うけど

68:デフォルトの名無しさん
15/12/10 04:22:52.80 LKPBxMee.net
どういうところに修飾したいかもわからんのにまともなレスが返せるわけもなく
人生相談ならよそでやってくれ

69:デフォルトの名無しさん
15/12/10 05:00:47.29 00S+xOQk.net
面接で見られてるのは技術じゃなくて人柄なんだってば
技術的なことなら筆記試験や小論文で判断できる
重要なのは「何をやったか」という内容じゃなくて、それをどう説明するかっていう、プレゼンまでは行かなくても話し方が見られてる

70:デフォルトの名無しさん
15/12/10 07:11:06.38 DygANkW8.net
>>69
できる新人なんてほんと稀
できますって入ってきた奴が作ったものはバグだらけ
未経験のほうがよっぽどバグが少ない
まあこんなこともあるから経験の有無なんてほとんど誤差

71:デフォルトの名無しさん
15/12/10 08:00:18.24 +sdtvmJJ.net
面接官も同じような面接質問ばっかしてるだろうから
面白がってはくれるだろうね。
採用につながるかは分からんが。

72:デフォルトの名無しさん
15/12/10 13:03:32.27 uuSHmo9z.net
VBAにおけるIE11の制御において、普段は大丈夫なのに、
画面ロック中(スリープ後など)だけ、なぜかSELECT要素が参照できなくなります
他のINPUT要素などは問題なく参照できます
IE8からIE11に変えてから起きるようになった気がします
できるだけIE11で行いたいのですが、何が原因でこのようなことが起きるのでしょうか

73:デフォルトの名無しさん
15/12/10 16:23:47.48 vMPjIzZK.net
URLリンク(xxx.com)
セルにコピペした、上記のようなラベルを含むハイパーリンクを正常に機能させたいのですが、
「#」が「-」に置き換わっているような挙動をして意図したページが開けません。
ハイパーリンクの編集で確認しても上記の通り入力されています。改善方法はあるでしょうか?

74:デフォルトの名無しさん
15/12/10 16:26:05.28 kl2q0NOf.net
>>73
このリンクはクリックするなよ

75:73
15/12/10 16:30:40.32 vMPjIzZK.net
書き込み後ためしに自分もクリッコしたんですが、変なサイトに飛びました・・不適切な例を使って申し訳ないです

76:デフォルトの名無しさん
15/12/10 20:33:09.52 GTbd/bMS.net
VBAでCreateObject("Scripting.Dictionary")とすると
連想配列が使えることを知ったのだけど
動的配列(要素を放り込むと勝手に伸びていく配列)はないですかね
普通の配列は、要素数を決めてDimなりReDimなりしてからでないと
使えなくて不便で…

77:デフォルトの名無しさん
15/12/10 20:37:45.04 m24vGLCh.net
>>76
ないと思うけどDictinaryではダメなポイントは何?

78:デフォルトの名無しさん
15/12/10 20:39:24.26 CRNEQuUV.net
>>76
標準で使えるのはCollectionかな。
動的配列はByRefで渡した先で要素数を変更出来るので、
これを利用して自分で配列伸ばす関数作る事も出来るけど。

79:デフォルトの名無しさん
15/12/10 21:02:59.81 GTbd/bMS.net
>>77
Dictionaryは要素の格納順が保証されないというのがネックです
例を挙げると、印刷すべきシート名を条件判断で選別しながら配列に放り込んでいき
最後にFor Eachで格納順に印刷する、というような処理があります
>>78
Collectionを調べてみます
ありがとうございます

80:デフォルトの名無しさん
15/12/10 21:11:34.59 CRNEQuUV.net
格納順を保証したいならキーを1~nにすればいいのに。

81:デフォルトの名無しさん
15/12/10 21:50:20.75 LgWPhvQB.net
>>79
なんだ、その程度の配列サイズと頻度か。
だったら (配列, 追加する要素) を引数にとって、要素がひとつだけ大きい配列を返す関数を作ればいい。
効率なんか考えなくてOK。

82:デフォルトの名無しさん
15/12/10 22:14:34.44 Ek2aQ7ct.net
配列myArray(1 to 10, 1 to 10)で
myArray(5, i), myArray(5, i+1), myArray(5, i+2) の最大値を求めるのはworksheetfunction.Maxを使えばいいですが、
最大値の i を求めるスマートな方法ってありますか?
例えば、myArray(5, 2), myArray(5, 3), myArray(5, 4)の最大値となる(5,?)を求めたい時、
i=2
dblMax=WorksheetFunction.Max(myArray(5, i), myArray(5, i+1), myArray(5, i+2))
for j=i to i+2
if dblMax=myArray(5, i) then
debug.print i '最大値をとるときのi
EndIf
Next j
って書くのもなんか泥臭いというか素人っぽいというか・・・

83:デフォルトの名無しさん
15/12/10 22:20:17.87 CRNEQuUV.net
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
よく分からんがこういう事か?

84:デフォルトの名無しさん
15/12/10 22:39:25.36 Ek2aQ7ct.net
>>83
早速どうも。コードありがとうございます。
myArray(1,1) = 3
myArray(1,2) = 5
myArray(1,3) = 4
のとき、For文でしらみつぶしに調べることなく、
最大値となる(1,2)などを返す方法はないかなと思ったのです。

85:デフォルトの名無しさん
15/12/10 22:48:15.01 CRNEQuUV.net
>>84
既にソートされているとか、そういう前提条件がない場合は虱潰し以外の方法はない。
素人くさいコードを書きたくないなら、VBAを見よう見まねで触る前に電子工学を学ぶ事をお勧めする。

86:デフォルトの名無しさん
15/12/10 23:06:09.69 Ek2aQ7ct.net
>>85
端的な回答ありがとうございました。
前提条件はないので、シラミ潰しします。
素人なので素人臭くないスマートなコードに憧れます。
この発想が素人臭いのかもしれませんがw

87:デフォルトの名無しさん
15/12/11 01:01:09.23 Gc5rivvs.net
WorksheetFunction.Matchを使えばいいんやよ

88:デフォルトの名無しさん
15/12/11 12:01:23.27 e4IICcKi.net
>>76
URLリンク(officetanaka.net)

89:デフォルトの名無しさん
15/12/11 12:29:13.10 Wogf6bzX.net
>>88
MSDN見てみたが、これ使えるのかな?
ArrayList.Sort (IComparer)
指定した比較演算子を使用して、ArrayList 全体内の要素を並べ替えます。

90:デフォルトの名無しさん
15/12/11 13:44:45.39 mI4o0uWv.net
配列要素の並び替えできたら便利だよなー。
帰って調べてみよ。

91:デフォルトの名無しさん
15/12/11 14:19:39.54 UJeMV01i.net
>>87
>>82です。Match引数を配列とすることもできるんですね。
でもあるサイトで配列を引数とするとちょっと遅いみたいな記述がありちょっと心配ですが。
>>88
横からですが便利そうですね。

92:デフォルトの名無しさん
15/12/11 22:44:49.09 fIX9Jv1V.net
質問です
式は適当です
条件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
てな具合に、判断する項目が増減する時、
スマートな条件式を記述する方法ってありませんか?

93:デフォルトの名無しさん
15/12/11 23:03:48.59 Kp08ZeAC.net
>>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
かな。

94:デフォルトの名無しさん
15/12/12 01:48:04.85 FuRVZgYl.net
素人でIE操作を試行錯誤しているのですが、どなたかアドバイスいただけますでしょうか。
1.表示されたページのAタグの中からキーワードを抽出してクリック
2.ページが表示されたら、そのままプルダウンなどを選択してクリック
と連続して操作させたいのですが、Aタグから抽出してクリックはできるものの、
その後デバッグになってしまい以降の処理が連続で行えません。
Set objA = objIE.Document.getElementsByTagName(

95:デフォルトの名無しさん
15/12/12 01:49:15.80 FuRVZgYl.net
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
このあとにデバックしてしまいます…

96:デフォルトの名無しさん
15/12/12 02:09:55.86 D2WGnzzU.net
>>95
>>デバッグになってしまい
エラーになるって意味かな?
エラーになるコードはどれ?
もしかして
Set objA = Nothing
した後でobjAへオブジェクトをセットしないで
objA使ってたりしない?

97:デフォルトの名無しさん
15/12/12 13:20:27.33 7OCEnpiZ.net
URLリンク(www.youtube.com)
これってどうやって作ってる?

98:デフォルトの名無しさん
15/12/12 13:33:18.20 Yc8YF04u.net
>>97
作った本人に聞くべきだけど、たぶん普通のゲームの作り方そのままじゃないの。

99:デフォルトの名無しさん
15/12/12 20:28:13.88 /A1wTFJW.net
>>93
回答ありがとうございます。
やってみます。

100:デフォルトの名無しさん
15/12/12 22:56:55.45 rj6YNvj2.net
>>97
全く分からない。最初見たとき、エミュレータにExcelに見えるガワみたいなものを持たせたのかと思ったけど、
選択されたCellに対してのみBGが配色されているところ、BGの中でも木やブロックに配色の影響がないところを見ると、単純にエミュレータと言う訳でも無さそう。
ただ2面目でExcelの操作中にマリオが少し動くところを見ると、Excelとマリオは別スレッドで動いているのかもしれない。そうなると、
マリオはExcelの機能で動かしている訳ではないのではないかと思える。
でもここまできっちり作るには、もしエミュレータを利用していたとしても、少なくともファミコンのパレット機能を知っていなければならないし、
エデイト機能も持たせてあると言っていることから、
BGとその当たり判定のメモリへの展開も知っていることになる。
でも多分この人は自前で作ってるっぽい。何故ならCellの配色がBGの更に後ろにあって、Excelの機能と思しきものがファミコンの機能と思えるところの
更に奥に食い込んでいるように見えるから。
結論を言うとちょっと信じがたい話だけど、見よう見まねか、解析したか分からないけど、マリオをOpenGLみたいなものでキチンと作って
それをExcel上で動かしているのではと推測する。でもあくまで俺の推測だから本当のところは分からないよ。

101:デフォルトの名無しさん
15/12/19 09:12:27.95 C2ZsZsZc.net
プログラマはMacを使ってるってマジ?
スレリンク(news板)

102:デフォルトの名無しさん
15/12/19 11:11:30.68 9nLc0qec.net
そんなんは業界によるし職場による

103:デフォルトの名無しさん
15/12/19 17:17:12.17 t89iAcrU.net
>>89
IComparer インターフェイスが使えるかってこと?
よくわからないけど無理なんじゃないかな。
自分はArrayList知らなかったので比較演算子も含めてライブラリでほげふがしてる。

104:デフォルトの名無しさん
15/12/20 00:57:16.89 zSz2t60X.net
>>103
試してないけど出来るんじゃないかな


.Netフレームワークインストールしてること前提だけど

105:デフォルトの名無しさん
15/12/20 01:05:44.36 3zlmhSVS.net
>>104
出来るのなら可能性とし色々広がりそうだ。
ただソートやreverseするため(だけ)にデータ構造としてArrayListクラスを使うのを強いられるのはちょっといやだな。

106:デフォルトの名無しさん
15/12/20 14:32:56.31 JRgauTa2.net
エクセルマクロで辞書を使用した関数を作成したいんですが
エラーが出て困っています
エラー内容は引数は省略できません
というものなのですが
引数は特に指定していないので間違っていないと思うのですが
何がまちがっているのでしょうか?
-呼び出し側
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

107:デフォルトの名無しさん
15/12/20 14:35:48.69 JRgauTa2.net
事故解決しました
呼び出し側にsetって書いたらエラーが消えました
でも理由がわかりません
functionの場合は常にsetで代入しないといけないんでしょうか?

108:デフォルトの名無しさん
15/12/20 15:42:29.15 g0mIqi7V.net
>>107
関数の戻り値の型がオブジェクトだから(Dictionaryオブジェクト)

109:デフォルトの名無しさん
15/12/21 11:44:54.68 0jWvYEdM.net
Cells(r, 1) = Cells(r, 2) + Cells(r, 3) + Cells(r, 4) + Cells(r, 5)・・・
とやっていって最高いくつまで足せますか?

110:デフォルトの名無しさん
15/12/21 11:53:17.32 dc09zofZ.net
>>109
VBEの文字数限界の話?やってみるしかないんじゃね?

111:デフォルトの名無しさん
15/12/21 12:57:48.76 VBR60bJo.net
VBEでは1行は半角で65535文字まで
次の行に継続した場合の制限は非公開

112:デフォルトの名無しさん
15/12/21 13:31:34.58 VBR60bJo.net
違った
物理行は1024バイト
論理行は65535バイト

113:デフォルトの名無しさん
15/12/21 21:17:23.77 GVmX1WAG.net
?Join(repeat("a",1024),"")
aaaaaaaaaaaaaaaaaaaaaaaaaaaa・・・
a
となったから1023バイトまでだな

114:デフォルトの名無しさん
15/12/21 22:31:21.13 ilnG5VR/.net
2010のVBEで試してみたけど、行末にアンダーバーが書けるのは連続で24行まで、つまり行の継続は25行までだった
行継続文字は2バイト消費するから、実際に使えるのは1021*24+1023=25527バイトってことになる
MSDNに書いてある「1行=65535バイト」ってのは到達できないと思われる

115:デフォルトの名無しさん
15/12/21 23:10:27.03 ilnG5VR/.net
で、いくつまで足せるか実験しようとしてテキストエディタで書いたソースをVBEにコピペしようとしたらExcelが落ちた
こんな簡単な足し算一つで落とせるとは、意外だったわ
もしかして>>109は、このことをわかってて質問したのか?

116:デフォルトの名無しさん
15/12/21 23:13:43.52 ilnG5VR/.net
再度実験中
とりあえずCells(r, 453)までは大丈夫
今んとこソースの計算式は1023文字×7行

117:デフォルトの名無しさん
15/12/21 23:20:59.48 ilnG5VR/.net
513でエラーが出た
というわけで、1論理行の計算式で足せるのは512まで
つまり右辺に書けるRangeオブジェクトは511個まで
Cells(r, 1) = Cells(r, 2) + ・・・ + Cells(R, 512) まで
どうやら式が長すぎると一時的に作られるRangeオブジェクトがワークエリアを食い尽くすらしい
VBEの文字数の限界とはまったく関係ないところでひっかかるとは知らんかった
まだまだ勉強が足らんな

118:デフォルトの名無しさん
15/12/21 23:34:01.24 ilnG5VR/.net
せっかく作ったんで512までのコード貼っとく
URLリンク(codepad.org)

119:デフォルトの名無しさん
15/12/21 23:55:25.73 GVmX1WAG.net
好きだねアンタw

120:今日から俺は
15/12/22 00:29:32.95 1Uckp5vQ.net
自作した画像を貼り付けるエクセルマクロです。
URLリンク(ww10.puny.jp)
パスワード:abc

エラー処理に問題がないか、
アドバイス頂けませんでしょうか?
標準モジュールの
'<�


121:Tブ処理(1)> Sub 画像貼付~ のエラー処理なんですが、 プログラマーの方のアドバイスを頂きたいです。



122:デフォルトの名無しさん
15/12/22 01:34:40.61 13vnNcVD7
頓珍漢な質問をしてるかもしれませんがお許しください

エクセルのシート上にドロップダウンリストを作りました。
入力規則でリスト入力しました。

ドロップダウンの選択が終わった時に何らかの処理がしたいのですがよくわかりません。

ぐぐったらOnTextChangedだとかComboCloseUpだとか、いろいろ出てきましたが、
handleとか出てきて全く意味わかりません。

入門書読んだだけだと、この辺の事全く載ってないですよね?
難しいことやろうとしてるんでしょうか?簡単にできますか?

123:デフォルトの名無しさん
15/12/22 11:18:45.06 1IjfeHrT.net
>>120
メイン関数が600行もあるので、内容は見る気まったくしない。
気づいた点:
・2行とか3行の連続した空行があるが、気持ち悪いのでやめて欲しい
・1個50行未満程度のFunction/Subに分けろ。そうすれば第三者も読む気になる
個人的な好み:
・変数宣言は必要になった場所で行え。そうすれば多少関数が長くなっても何十も変数宣言が続くことはなくなる

124:デフォルトの名無しさん
15/12/22 11:30:47.44 71TpXAZk.net
平均10行未満、最長30行くらいで頼む。

125:デフォルトの名無しさん
15/12/22 11:37:34.62 1IjfeHrT.net
画像貼付()で気づいた点(内容はほぼ見ていない)
・Tabキーでインデントしろ(普通は4つのスペースでインデントされる)
・不明な変数名(いきなりDnameって何?となって読む気かなりダウン)
 → コメントを入れるより、適切なネーミングで
・Dim CellWidth, CellHeight As Long
 CellWidthはLongにならない
・SheetをActivateする必要があるか?(RangeをSelectする必要があるか?)
・コメントされたコードは削除しろ
・「一旦画像をシートに貼り付け」とか書いてるが、なぜそうするのか意図不明
内容を全く知らないコードを読むのは、100行あたり10分から1時間程度かかる。
人に見てもらいたいなら、見てもらえるように努力しろ。

126:デフォルトの名無しさん
15/12/22 12:08:50.62 71TpXAZk.net
一般論だがローカル変数名なんてどうでもよくない?
Function/Sub名と引数名は重要だけど。

127:デフォルトの名無しさん
15/12/22 12:29:08.69 eV+iF7ba.net
俺も見ようとしたけど空のウィンドウがいくつも開きっぱなしになってるのが気になった
仕事なら他人のソースでも必死に解読するけど、これは暇つぶしにできる範疇を超えてるは

128:デフォルトの名無しさん
15/12/22 13:06:10.62 1IjfeHrT.net
>>125
Dnameは画像貼付()の第一引数。
引数名もひどいが、ローカル変数名もひどい。
> 一般論だがローカル変数名なんてどうでもよくない?
一般的にはどうだかわからないが、個人的にはどうでもよくない。
ネーミング超重要。

129:デフォルトの名無しさん
15/12/22 13:28:33.58 71TpXAZk.net
>>127
そうなのか。
自分は逆だ。
名付けることが必要なローカル変数が発生すること自体避けたいタイプ。

130:デフォルトの名無しさん
15/12/22 13:47:37.98 1IjfeHrT.net
>>128
一般論じゃないの?
それは一般的なのかみたいな不毛な議論したくないから曖昧な表現にしたが、
ローカル変数とはいえ、ネーミングに気を遣うのは良い習慣。

131:デフォルトの名無しさん
15/12/22 14:15:48.13 6+FfHGxJ.net
むしろこれをどういう用途で使うのか気になった。

132:デフォルトの名無しさん
15/12/22 14:25:32.96 toHtA+zz.net
VBAってIf文やFor文等のブロック内で変数宣言しても、そのブロック内だけのスコープにならないんだよね
結局1関数内に複数の処理があって、2箇所以上で


133:使う変数は関数の先頭で宣言してる



134:デフォルトの名無しさん
15/12/22 14:56:45.78 1IjfeHrT.net
>>131
ローカル変数のスコープとコードの読みやすさについては、「変数のスコープを小さくする」で
ググることをお勧めする。
ローカル変数宣言・定義を関数の先頭で行うのを強制される言語以外では、スコープを最小と
することが推奨される。

135:デフォルトの名無しさん
15/12/22 15:12:03.64 71TpXAZk.net
>>131
確かにその点は困りものだ。
別な変数を使えばよいのだが、あまり綺麗ではない。

136:デフォルトの名無しさん
15/12/22 17:04:33.32 EK9FZmu1.net
>>132
>ローカル変数宣言・定義を関数の先頭で行うのを強制される言語
べつにVBAは関数の先頭での宣言を「強制」なんてされないが、スコープは狭い方が良い
ただし、VBAにはブロックレベルのスコープがないだけ
関数の先頭での宣言が「薦められていた」のは
スコープの先頭で、そのスコープ内の変数まとめて宣言した方がわかりやすいよね、って言う事
つかローカル変数定義を関数の先頭で宣言する事を強制される言語ってたとえば何?
>>131,132
まあ、そういう時は関数分けろってのが一般的な解決法なんじゃね

137:デフォルトの名無しさん
15/12/22 17:24:02.60 1IjfeHrT.net
>>134
VBAの「変数のスコープ」は、宣言・定義した位置から下だよ。
だから、関数の先頭じゃなくてもっと狭められる。

138:デフォルトの名無しさん
15/12/22 17:48:13.32 nxtSgXHp.net
>>135
ブロックレベル、というのが通じてないのかな?
つまりひとつの関数の中で、
For Each z ・・・
Dim tmp As Variant
・・・
Next z
For Each z ・・・
Dim tmp As String
・・・
Next z
というように変数tmpが2回宣言出来ればいいのに、それが出来ないことを嘆いている。

139:デフォルトの名無しさん
15/12/22 17:50:28.23 1IjfeHrT.net
>>136
> ブロックレベル、というのが通じてないのかな?
いや、通じてるよ。
だからといって
> 結局1関数内に複数の処理があって、2箇所以上で使う変数は関数の先頭で宣言してる
とするのではなくて、もっと変数のスコープを狭めた方が良いといってるんだけど。

140:デフォルトの名無しさん
15/12/22 17:57:48.82 1IjfeHrT.net
まとめると、
ローカル変数定義を関数の先頭で宣言する事を強制される言語(*1)は
しかたがないので変数の宣言は関数の先頭でするしかない。
*1) Ada由来言語とか。PL/SQLとか。
そうではない言語では、なるべく変数のスコープを狭めるのが良い。
・関数ブロック内のどこででも変数定義できるのなら、なるべく利用する直前で宣言する
・ブロックスコープが存在する言語では(C系とか)は、そのブロック内で宣言する
VBAはブロックスコープが存在しないが、関数ブロック内のどこででも変数定義できるので、
なるべく利用する直前で宣言するのが良い。
例外はJavascriptで、ホイスティングによりブロックスコープ内で宣言した変数のスコープは
関数スコープにまで拡大する。
それにより
・それでも利用する直前で宣言するよ派
・知らない人がいるかもしれないので、関数の先頭でまとめてするよ派
が存在する。

141:デフォルトの名無しさん
15/12/22 18:50:23.05 EK9FZmu1.net
>>135
厳密には、VBAでは変数宣言(定義)は必須ではないので
変数定義の位置によってスコープが変更されるようなことはないだろう
Option Explicitオフで宣言前に変数を使用してた場合、エラーになるのは変数宣言の方
つまり変数宣言以前にそのスコープにその変数が存在している
まあ、Option Explicitはオンで使うべきではあるんだが
>>138
VBAではブロックスコープは存在しないので
「関数ブロック内のどこででも変数定義できる」(ただし利用は定義後のみ)

「なるべく利用する直前で宣言する」のではなく、関数の先頭で宣言する事が薦められていた
MSがそう勧めてたこともあるので、VBAプログラマの多くは関数先頭宣言派だと思うぞ
まあ俺は最近は使う直前宣言に改宗したがw

142:デフォルトの名無しさん
15/12/22 19:27:38.21 nxtSgXHp.net
スコープを狭めたことには全然なってないので、俺はだいたい先頭で宣言するけど例外もある。
というかプロシージャの長さによるね。10行越えたらちょっと考える。

143:デフォルトの名無しさん
15/12/22 19:41:14.20 eV+iF7ba.net
宣言しなくても使える、とはちょっと違うんだけどな
VBAの変数宣言は記述を省略できるだけで、変数を使った時点でVariant型として自動的に宣言される
コードに書かなかった場合はシステムが代わりに宣言しといてくれるんだよ
このソースを実行してみればわかる
Sub Macro1()
  a = 1  ' ← 変数を使おうとした時点で、書かなくても自動的に Dim a As Variant が実行される
  Dim a As Variant  '←宣言が重複するのでエラーになる
End Sub

144:デフォルトの名無しさん
15/12/22 19:54:40.62 7wWwuT9q.net
>>139
> Option Explicitオフで
今時あり得ん
議論する価値もない

145:デフォルトの名無しさん
15/12/22 19:57:05.43 EK9FZmu1.net
じゃあ言い方を変えてあげよう
スコープを狭めるとかいうのは間違いで、スコープは言語によって定義されていて
宣言位置や方法なんかによってどのスコープか決定されるだけだ
VBAで一番狭いスコープはプロシジャレベルなので、どこで宣言しようがそれよりスコープが狭まることはない
狭まるのは利用可能範囲だけ
まあ、利用可能範囲をスコープというならそれでも良いかという気がしてきたからもうどうでもいいやw

146:デフォルトの名無しさん
15/12/22 20:04:19.43 nxtSgXHp.net
しかしVBAでタイプセーフとか言う気は起こらないのであった

147:デフォルトの名無しさん
15/12/22 20:10:47.37 nxtSgXHp.net
ん、Option Explicitのことだったか。
ならそんなものほとんどつける意味ないし無駄。

148:デフォルトの名無しさん
15/12/22 22:13:41.07 13vnNcVD7
>>121
これに何かレスください

149:デフォルトの名無しさん
15/12/23 00:21:34.23 e7byjM9n.net
>>145
必要の根拠しめせないけど、
意味ないし無駄という根拠示せる?(Option Explicitを付けないメリット)
煽りじゃないですよ。

150:デフォルトの名無しさん
15/12/23 00:41:23.47 M5GRmAfS.net
>>147
自分の経験上、一度も役立ったことがないというのが根拠。
付けないことにメリットがあるとまでは言ってない。
エディタの設定でOption Explicitはついているのだが、これまで一度も「変数が定義されていません」のエラーを出したことはない。
つまりDimし忘れることなんて普通は起こらないし、それへの保険なんて任意保険で十分。やらないのはあり得んみたいな言説はおかしい。

151:デフォルトの名無しさん
15/12/23 05:36:21.78 zGgTg8AL.net
むしろ自分はOption Explicit付けないこと無かったから、
変数宣言しなくてもエラーにならないなんて忘れてたわ。
田中さんはこんな風に言ってるな。
URLリンク(officetanaka.net)
因みに余談だけど、.NetになるとOption Strictと言うのがあって、Option Explicitと一緒に書かれることが多い。
これは実行時バインディングで型が決まるものや、暗黙の変換を許可するかしないかを決めるものだけど、
型推論によって実行時バインディングで型を決めざるを得ないときもあるので、基本、付けると言うスタンスに留まることが多いかな。つまり、絶対ではない。
ただ、VBAであれ.Netであれ、Option Explicitに関しては今まで付けておいて困ったことはないな。
変数宣言も型も、明示的に設定していることが前提なら付けておいた方がいいだろな。
大丈夫な人は大丈夫なんだろうけど、それは「俺は今まで簡単なロジックでバグを出したことが無いから、
簡単なロジック部分のテストケースは作らない」と言ってるのと同じだな。
その人の信用性も有るんだろうけど、Option Explicitが付いていれば「ちゃんと変数宣言してますよ」と言うことの担保にもなる。
それでも、「いや、俺は絶対そんなミスは犯さないから付けない」と言うのであれば、もうそれ以上言うこと無いし。
最も大概の仕事場のコーディングルールでは付けることになっていると思うけどね。

152:デフォルトの名無しさん
15/12/23 09:46:21.95 QfnO5T+O.net
「俺は忘れないから大丈夫」
若いっていいなあ

153:デフォルトの名無しさん
15/12/23 10:49:34.08 e7byjM9n.net
んーいろいろ参考になった。
みなさんレスどうもです。
俺はつける派かなOption Explicit

154:デフォルトの名無しさん
15/12/23 10:54:12.55 M5GRmAfS.net
>>150
つけて助かったことあるの?
結局Optiob Explicitなんてシートベルトの価値ではなくて、チャリンコの補助輪の価値しかないと思う。
デフォルトで付けいて放置してるけどさ。

155:デフォルトの名無しさん
15/12/23 12:18:30.14 QfnO5T+O.net
なんだただのギャグか

156:デフォルトの名無しさん
15/12/23 12:29:09.66 MZJ58G0+.net
スコープの話出てたけど、普通あるのにVBAになくて困るものとして定数(const)が欲しい。
VBAのConstは定数式を与えなきゃならないので使いにくい。

157:デフォルトの名無しさん
15/12/23 19:56:05.25 M5GRmAfS.net
>>154
引数もByRef Const受けできればいい。

158:デフォルトの名無しさん
15/12/24 10:15:31.90 +bsSlAyH.net
>>143
> 狭まるのは利用可能範囲だけ
それを一般には変数のスコープという。
「第3回 スコープを意識したプログラミング―その2 変数のスコープ」
URLリンク(gihyo.jp)

159:デフォルトの名無しさん
15/12/24 10:17:46.35 +bsSlAyH.net
>>148
> エディタの設定でOption Explicitはついているのだが、これまで一度も「変数が定義されていません」のエラーを出したことはない。
> つまりDimし忘れることなんて普通は起こらないし、それへの保険なんて任意保険で十分。やらないのはあり得んみたいな言説はおかしい。
typoは検出できる。
これ重要。

160:デフォルトの名無しさん
15/12/24 10:33:42.93 acHF714F.net
>>156
正しいが、スコープの始まりはコントロールできても終わりはプロシージャの最後までと決まってるのが惜しいところだね。

161:デフォルトの名無しさん
15/12/24 10:59:36.15 +bsSlAyH.net
>>139
> MSがそう勧めてたこともあるので、VBAプログラマの多くは関数先頭宣言派だと思うぞ
これか。
「変数とメソッドのスコープ」
URLリンク(msdn.microsoft.com)
> プロシージャ レベル スコープ
>
> 変数を宣言するための最も一般的な場所は、プロシージャの先頭です。これらの変数は、
> プロシージャ全体で利用することができます。プロシージャの先頭に変数を置いておけば、
> どのプロシージャでも変数宣言を簡単に見つけることができます。すべての変数宣言を
> 先頭に置くという習慣を身に着けていないと、変数がどこで宣言されているかがわからず、
> 変数に関連するバグを追跡するのに余分な時間がかかる可能性があります。
2001年12月の記事だけど、今でもMSはこう思ってるんだろうか。

162:デフォルトの名無しさん
15/12/24 11:34:44.56 acHF714F.net
>>154
そう思う
>>157
そう思う
自分はtypoはその場ですぐ見つけたいので、Option Explicitだけじゃなく他の方法も取ってる。
>>159
記憶がおぼろだけど、ずっと昔のVBEは先頭でのDimしかできなかったよね?

163:デフォルトの名無しさん
15/12/24 15:57:20.63 ta6MMntY.net
>>159
VBAにおいて推奨するスタイルが変わったって記事は見たことが無いから
たぶん今でも一応そのスタイルが推奨なんじゃね
言語が変わればまた話は変わるけどな
VBAはVB6とほぼ同じスタイルが推奨されてたけど
VB6のスタイルはVB.NETでは推奨されてない奴も多いし
>>160
おれの記憶ではVBAは当初からずっと、先頭以外でもDim出来たが

164:デフォルトの名無しさん
15/12/24 16:00:38.09 Xid/rDIR.net
言語仕様が変わってないから推奨される記述スタイルも変わってなさそう

165:デフォルトの名無しさん
15/12/24 16:30:39.57 +bsSlAyH.net
まあ最近の流れは、どの言語でも使用する直前で変数宣言するのが推奨されてるから、
2001年の古い記事に従うこともないと思うがな。

166:デフォルトの名無しさん
15/12/24 17:04:02.10 acHF714F.net
>>161
そうだっけ?なら自分の記憶違いかな。
使用直前の宣言はもちろんいいんだけど、VBAって初期化を同時にできないのがすごく残念だと思う。
Dim rootPai As Double = 2 * Atn(1#) ^ 0.5
って書きたいし、もっと言えば
Const rootPai As Double = 2 * Atn(1#) ^ 0.5
としたい。

167:デフォルトの名無しさん
15/12/24 21:25:39.16 ta6MMntY.net
Const、式もかけたはずだと思ってしらべたけど
>リテラル値、その他の定数、Is を除く算術演算子や論理演算子を組み合わせた式を指定します。
らしい
関数とか使わん単純な計算式しか書けないのね
まあ、定数なんだから関数とか呼ぶなってことか

168:デフォルトの名無しさん
15/12/24 22:14:19.63 ZMYfZV7G.net
VBAはコンパイラじゃないから・・・

169:デフォルトの名無しさん
15/12/25 00:23:24.10 H9I2iCjo.net
>>152
>結局Optiob Explicitなんてシートベルトの価値ではなくて、チャリンコの補助輪の価値しかないと思う。
Optiobなんて書き間違えるくらいだし
そっちにはチャリンコの補助輪程度でも必要なんじゃないの?

170:デフォルトの名無しさん
15/12/25 00:55:16.56 QRbvg4rg.net
もうほっときなよ
「補助輪なんていらねーよ」と言いながら実際は補助輪を外したことがないというオチがもう付いてるじゃないかw

171:デフォルトの名無しさん
15/12/25 01:04:21.93 VYJL9Hps.net
Dim camelCase As Long
って宣言をして、プロシージャ内でその変数を使うときは "camelcase" ってタイプする。
その直後に "camelCase" になったらtypoしてないし、でなきゃypoがある。
いつのまにやらそういう癖がついた。

172:デフォルトの名無しさん
15/12/25 08:22:37.15 pG0WUl9G.net
ypoしてますね

173:デフォルトの名無しさん
15/12/25 08:25:15.59 zlW/tpNm.net
シャレか

174:デフォルトの名無しさん
15/12/25 16:52:37.89 WI9GtdKx.net
他人の書いたOption Explicitを使ってないコードをデバッグしてて、
変数名が間違っててそれぞれ別の変数として判別されてたのはみた事がある
コードが短かったからすぐ気がついたけど
長いコードだったら気付かず見過ごしてたかもしれない
後自分で書いたコードでは Option Explicit は必ず付けてるんだけど、
配列変数の宣言は
Dim Hoge() As Long
みたいに動的に宣言して、後から
Redim Hoge(5)
みたいに要素数を再定義してた
そしたら Redim の所で変数名間違えてて
最初の変数が要素数不定のままでエラーになってしまい、
原因が分らずに悩んだ事があった
Redimだけでも変数宣言として認められちゃうから
Option Explicit 使ってても
こういうパターンの間違いだとエラーにならんのよね

175:デフォルトの名無しさん
15/12/25 19:17:09.01 zlW/tpNm.net
やっぱり赤い波線がほしいな

176:デフォルトの名無しさん
15/12/26 07:11:55.98 4Qu0RrtJ.net
>>173
.Netのインテリセンスのこと?
.Net暫くやってて久しぶりにVBAでコーディングすると
余りの入力補助の利かなさにメモ帳に書いてるんじゃないかと錯覚するときあるよね。
特に打ち掛けのとき、変数名とか忘れて離れたところからコピーで取ってこようとすると
「ぷりん」とか音たててエラーメッセージが出て、元の行に飛ばされるのにはカチンとくる。

177:デフォルトの名無しさん
15/12/26 07:39:57.84 c6cv0Mwc.net
自分も>>169のやり方は実践している。
Dim list_1 という宣言に対しては、liST_1 とか入力するの。
慣れると小指が勝手にシフトキーを押すようになるw

178:デフォルトの名無しさん
15/12/26 18:14:13.26 0Oe8t7C6.net
>>174
自動構文チェック外せよ

179:デフォルトの名無しさん
15/12/28 09:45:36.91 6hjtvMur.net
処理が終わったらPCをスリープ状態にする方法を教えてください。

180:デフォルトの名無しさん
15/12/28 10:05:26.91 aQp7bRaK.net
まだか?
処理が終わったらPCをスリープ状態にする方法を教えたまえ

181:デフォルトの名無しさん
15/12/28 10:39:16.43 FcSlXts6.net
>>177
    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 .ヽ,ヽ,
                          ‐' ' `‐'       -'-'  -'-'
    脱ぐ       たたむ      コーヒーを     砂糖と塩を
                         つくる      まちがえる。

182:デフォルトの名無しさん
15/12/28 12:05:07.13 6hjtvMur.net
>>179
やってみましたがうまくいきません

183:デフォルトの名無しさん
15/12/28 12:15:06.34 ylUAFX7e.net
ちょっと調べてみたが SetSuspendStateって使えるのかな?

184:デフォルトの名無しさん
15/12/28 13:10:18.21 ehrXe3tW.net
>>181
Declare定義してやれば 使えたよ
ちなみに(Windows8.1 + Excel2013)

185:デフォルトの名無しさん
15/12/28 13:16:09.60 ylUAFX7e.net
>>180
じゃあSetSuspendstate使ってみれば?
仮想環境とかだと上手くいかないかもしれないが。

186:180
15/12/28 14:13:12.83 ehrXe3tW.net
>>177,178
専ブラスレの騒動に見舞われたので詳しく書けないけど
URLリンク(msdn.microsoft.com)(VS.85).aspx
あたりが参考にならないかな?(VBAじゃないけどね)
あとは ぐぐって

187:デフォルトの名無しさん
15/12/29 10:58:22.65 u34Ypxab.net
プロシージャ名/関数名はすべてラクダ型の文字列にしたいのですが
その夢がかなわない単語1つのときはどうしたらいいですか?
[通常]
createSheet
fillData
[問題]
initialize

188:デフォルトの名無しさん
15/12/29 11:42:28.29 WJw28H2b.net
>>185
単語2つ目をひねり出すか…
そのままでも問題なさそうだけど

189:デフォルトの名無しさん
15/12/29 15:31:29.70 fz57zrCL.net
>>185
ふと思ったんだけど
[通常] の方は "どうする"+"何を" になってるけど
[問題] の方は "どうする" だけなんよね
だったらこっちも "どうする" + "何を"にすればよくね?
initializeData
initializeCell
とかとか
こう出来ない理由とかあるの?

190:デフォルトの名無しさん
15/12/30 14:22:33.58 WC2i3iyl.net
For each構文でループを回すとき、
一番最初のループだけ特別なコードを1行書きたいのですが
その判別はどうします?
ノーマルなFor i=1 to構文では、If i=1 Thenと単純ですが。

191:デフォルトの名無しさん
15/12/30 14:34:26.62 PBmz2gbU.net
foldl1を使う。

192:デフォルトの名無しさん
15/12/30 14:43:38.04 JPIixvGP.net
扱う物によって色々やり方があるだろ。
だいたい同一処理を分かりやすくする為にEachがあるのであって、違う処理するならEachに含めちゃダメだろ。

193:デフォルトの名無しさん
15/12/30 15:23:36.66 yH9ydeBO.net
>>188
forでやらない理由は?

194:デフォルトの名無しさん
15/12/30 15:37:44.87 WC2i3iyl.net
>>189
なにそれ?
>>190
For eachがわかりやすいので可能な限り絶対この構文を使っています(For i=1は古い)。
でもそんなときでも最初のループだけ実行したいステートメントがあるというのはVBAの経験の浅い人じゃなければよくあると思うのですが。
>>191
Forでやると言ってるのですが

195:デフォルトの名無しさん
15/12/30 15:42:53.87 WC2i3iyl.net
オブジェクト変数で
Set objTest = Nothing
という解放処理をするべきかどうかの議論がときどきありますが、
そもそもメモリ使用に関してこのSet objTest = Nothingはなにをやっているのでしょうか?
これがはっきり分かっていないままで議論しても意味がないと思うのですが。
基本的にオブジェクト変数の場合でもプロシージャ内の変数はプロシージャを抜けると役目を終えたということで消えますが
その参照先であるオブジェクトの実体はメモリに残ったままですよね?
Javaのガベージコレクションの機能があるという話はこのVBAで聞いたことが無いので
もしその実体をSet objTest = Nothingで消せるということなら
いかなるオブジェクト変数を使ったあとは必ずSet objTest = Nothingを書くべき、というのが(もし上の仮定が正しい場合)わたしの見解なのですが。

196:183
15/12/30 15:47:44.59 WC2i3iyl.net
わたしは183でもありました。
>>186
>>187
それはinitializeという英単語が引数を2つとる動詞、つまり1つ目の引数は「実行する主体」、2つ目の引数が「初期化される物」でうまくいきますが
例えば引数を1つしか取らない英単語、例えばrunだとかdieだとかappearの場合どうしたらいいのですか?

197:デフォルトの名無しさん
15/12/30 15:50:40.47 WC2i3iyl.net
>>186
initializeの場合は、うんこをひねり出すかのごとく
initiializeDataやinitializeCellのようにDataやCellをひねり出すことができましたが
先にも書いたrunやdieやappearなどのときはどうしますか?

198:185
15/12/30 16:18:23.99 0l8puLjU.net
>>194
全部英文で考えれば "何を"の君のゆう所の 実行主体 が付けれると思うが
・・・をrun   何を実行?(runProcess)
・・・をdie   何を殺す(が死ぬ)? (dieProcess)
・・・をappear  何が出る?(appearBigin)

※英単語の訳等の間違いはスルーして下さいね
これ以上 君に付き合うつもりは無いので あしからず(年末なんで)

199:デフォルトの名無しさん
15/12/30 16:27:23.62 Y9esFwyM.net
>>188
FirstTime とかのフラグかな

200:デフォルトの名無しさん
15/12/30 18:39:36.91 PBmz2gbU.net
>>192
For i = 1 は古いって言われても、
m(i) = m1(i) + m2(i)
をどう実装するんですか?

201:デフォルトの名無しさん
15/12/30 18:58:26.89 JPIixvGP.net
>>192
別の処理を施したいなら、別のForEach文なり、Do文なりを利用すべき。
そもそもForEachはオブジェクト型を扱わない場合は処理が重いので必要が無い限り極力使わない方がいい。
別の処理なら別のループとして分けられるはず。変なこだわりを持っているせいでややこしい事になっているだけ。

202:デフォルトの名無しさん
15/12/30 19:05:08.95 yH9ydeBO.net
パフォーマンス的にはfor>foreachなんだけどね。あと、flag使うとかやりようはいくらでもある。少し捻りが足りないんじゃないかな

203:デフォルトの名無しさん
15/12/30 20:02:26.27 bRclVw7x.net
他言語だと、For Each的なループであっても
何回目の処理かをループ内で知ることの出来る機能を持ったものがある
VBAは残念ながらそれがないから、自分でカウンタ変数を用意するか
一個目のデータに特有の項目があるならそれを判定するか、だろうね

204:デフォルトの名無しさん
15/12/30 22:00:46.01 yDP/mW46.net
>>188
最初の時だけ何らかの値を計算してとっておくということであれば
Dim val As Variant として、ループの中で
If IsEmpty(val) Then val = ...
とやればいい。
余計なフラグなしにできるl。

205:デフォルトの名無しさん
15/12/30 23:44:51.92 RDoNJfse.net
Application.OnTime TimeSerial(Hour(Now()) + 1, 0, 0), "更新"

マクロ"更新"の最後にまた上のコード

以前教えてもらった1時間毎にマクロを起動するコードですが
23時になると狂って連続で"更新"マクロを繰り返してしまいます
23時から0時へは跨げないということでしょうか? 対策をお願いします

206:デフォルトの名無しさん
15/12/31 00:00:57.74 yJLj8/Bn.net
>>203
対策をお願いします(キリッ
上から目線だなオイ

207:デフォルトの名無しさん
15/12/31 00:47:01.17 2YFGdsnl.net
>>188
Dim user_list As Collection
Dim user As Collection
Set user_list = New Collection
Set user = New Collection
user.Add Ke


208:y:="SEQ_NO", Item:=user_list.Count + 1 user.Add Key:="NAME", Item:="aaa" user.Add Key:="PASSWORD", Item:="xxx" user_list.Add user Set user = New Collection user.Add Key:="SEQ_NO", Item:=user_list.Count + 1 user.Add Key:="NAME", Item:="bbb" user.Add Key:="PASSWORD", Item:="yyy" user_list.Add user Dim msg As String For Each user In user_list If user("SEQ_NO") <> 1 Then msg = msg & "," End If msg = msg & user("NAME") & ":" & user("PASSWORD") Next MsgBox msg



209:デフォルトの名無しさん
15/12/31 06:18:32.30 EUZydMuq.net
>>203
Hourは、0~23を返す。最後には、
23 + 1 = 24
これで値を見てみれば?
Debug.Print TimeSerial(24, 0, 0)

210:191
15/12/31 08:06:51.15 D5b/7JR8.net
みなさん不正解。がんばった人もいるけど残念!
答は、For eachループに入る直前にその1回目の書きたかったコードを書けばいいだけでした。

211:186 (=191)
15/12/31 08:07:43.82 D5b/7JR8.net
上は>>188でした。

212:デフォルトの名無しさん
15/12/31 08:13:13.18 xcpAmXWK.net
>>207
ひとつ目の値を使うんじゃないのか?それをどうやって取得するんだよ?

213:デフォルトの名無しさん
15/12/31 09:43:58.89 18DEmBMj.net
残念も何もそう指摘されてるだろうに。
もしかして「僕はVBAにとても詳しいんだ」ってプライドを崩されてへそ曲げたのか。

214:デフォルトの名無しさん
15/12/31 11:11:22.46 xcpAmXWK.net
パフォーマンスに関しては他の人も言ってるけど、
For Each z in M 構文での z と、For i = 0 To ~ での M(i) の違いとして、
z はM(i)のコピーでしかないという点がある。(Mが配列の場合)
M がジャグ配列で要素が再び大きな配列だったりしたら重い処理になりえるな。
それに、コピーだから z に何か代入しても M には反映されない。
For i = 1は古い、なんて決めつけてると(以下略

215:デフォルトの名無しさん
15/12/31 12:11:06.57 3FCNx6UT.net
For i ~の構文内での話なのですが・・・
1.iやjの変数の宣言がされてないとエラーが出ます。
2.下記の記述をしていますが、自分が想定したのと違う動きになります。
   For i = 1 To 9
For j = 1 To 9 - i
      If IsNumeric("TextBox" & (2 * (i - 1) + 2 * j + 7)) = False Then
テキストボックスを順にチェックしていきたかったのですが
なにか記述方法が間違っているのでしょうか?
ご指導のほど、よろしくお願いたします。

216:デフォルトの名無しさん
15/12/31 12:21:48.92 e/tEw3yP.net
>>210
もうその通りだろうね。稚拙すぎて笑える

217:デフォルトの名無しさん
15/12/31 14:10:55.55 KhBichDl.net
>>212
こんなかんじで指定するんじゃなかったっけ
Controls("TextBox" & i).Value

218:デフォルトの名無しさん
15/12/31 15:23:07.54 18DEmBMj.net
>>212
For i = 1 to 9
For j = 1 to 9 - i
Next
Next
だけならエラー吐かないのでテキストボックスの問題だなぁ。
それ以上はどういう形か分からない以上調べようがないから何とも。
全部のテキストボックスを調べて良いなら
For Each x In Me.Cotrols
   If TypeName(x) = "TextBox" then
     ...
   End If
Next
とやると簡単。Tag使って判定すれば特定のものだけ除外できるし。

219:210
15/12/31 17:47:16.72 3FCNx6UT.net
いろいろ試したのですが、やはりテキストボックスの表記の問題のようです。
順番にチェックしていく関係でこのような記述をしました。
最初にテキストボックスの7-9、7-11、7-13、・・・・7-23、9と-11、9-13のようにしたかったのです。
For i = 1 To 9
For j = 1 To 9 - i
If Abs(("TextBox" & 2 * i + 5) - ("TextBox" & 2 * (i - 1) + 2 * j + 7)) <= 100 Then
          【処理内容】
End If
Next j
Next i
の記述をしたのですが・・・テキストボックスの記述方法がダメなのでしょうか?

220:デフォルトの名無しさん
15/12/31 18:21:50.17 xcpAmXWK.net
ActiveSheet.OLEObjects("TextBox" & 1).Object.Value
のように指定すればいいみたいだけど?

221:デフォルトの名無しさん
16/01/01 08:16:43.96 sVrrx3Fu.net
On Error Resume Nextってそれを実行した行のあとも
プログラムが終了するまでずっと有効ですか?
ある区間だけ有効にしたい、あるいはずっと有効しておきたい、のように使い分けたいこともこれから出てくると思うのです。

222:デフォルトの名無しさん
16/01/01 08:18:12.65 sVrrx3Fu.net
Application.DisplayAlerts = Falseも、(以下同文)

223:デフォルトの名無しさん
16/01/01 09:06:31.31 HVUfaNaT.net
>>218-219
あけおめ
On Error はプロシージャ内のみ有効
Application.DisplayAlertsは Excel終了するまで継続のハズ
ちなみに
On Error Resume Next
は短い範囲でかつどうしても実行時エラーの可能性が排除できない
時のみ使う方が良いとおもうよ
ステートメント毎に Errオブジェクトを見てればいいけど
不具合発生してもスルーされるからどこでどんなエラーが発生したか分らなくなる
せめて
On Error Goto ラベル
でトラップ処理するなら別だけど

224:デフォルトの名無しさん
16/01/01 10:06:58.64 sVrrx3Fu.net
>>220
どもあり、ことよろ。
そうなんですか、スッキリしました。これでこれから使い分けができそうです。

225:デフォルトの名無しさん
16/01/01 10:17:22.33 NO+H6ZMg.net
>>218
> ある区間だけ有効にしたい、あるいはずっと有効しておきたい
On Error Goto 0

226:デフォルトの名無しさん
16/01/01 19:56:00.98 xpOY3CWT.net
手元にExcelがないから試せないけど、確かOn Errorは呼び出し先の関数内でも有効になるんだよね
個人的にはErr.Raiseをthrowのように使いたいんだけどね

227:デフォルトの名無しさん
16/01/01 20:52:55.76 sVrrx3Fu.net
>>222-223
なるへそありがとう。

228:デフォルトの名無しさん
16/01/01 20:55:39.83 sVrrx3Fu.net
自分で作った列挙型(Enum)ってその全体のマクロでどこででも参照して利用できるようにするには
どこに書けばいいとか注意点はありますか?
自分で作ったクラスの中ででもその列挙型定数は使いたいです。

229:デフォルトの名無しさん
16/01/01 21:04:54.88 +cD+YD5u.net
イミディエイトウィンドウに出力された内容を取得する方法ってありませんでしょうか

230:デフォルトの名無しさん
16/01/01 23:06:06.65 +cD+YD5u.net
あとマクロ開始時にイミディエイトウィンドウをクリアする記述ってありますでしょうか

231:デフォルトの名無しさん
16/01/02 01:20:56.54 jWkoNf5r.net
>>225
>自分で作ったクラスの中ででもその列挙型定数は使いたいです。
やめたほうがいいです。
ライブラリとして再利用する為なんじゃないの?
むしろ、そのクラスで使うならそのクラスに実装すべきで、他でも使いたいなら
公開すればいいだけ。
クラス以外で実装した列挙型をクラス内で使いたい場合は、クラスの中で再定義
するか、橋渡しするようなプロシージャを用意する必要があるかな。
めんどくさいけどね。
>>226
コピペしかないと思うけど、
そもそもイミディエイトに出力ってDebug.Print使ってるって
ことなんだろうけど、そろそろテキストファイルに出力する方法も
覚えたらどう?

232:デフォルトの名無しさん
16/01/02 09:24:31.29 Dnf2flaM.net
イミディエイトをシェルとして使って作業の大部分を完結させている自分としては、イミディエイト内での
「もとに戻す」と「繰り返し」をショートカットでできるようにしてほしい。
ついでに「繰り返し」はctrl + yに統一してくれ。

233:デフォルトの名無しさん
16/01/02 09:44:03.17 Nffz1P8X.net
文字列をためこんどいて
マクロ終了直前にメモ帳を起動してその文字列をそこに入力させておくためのコードは
どう書けばいいですか?

234:デフォルトの名無しさん
16/01/02 09:51:29.48 sxcdtv6m.net
>>230
素直にテキストに落としてみては?

235:デフォルトの名無しさん
16/01/02 09:58:15.99 vN/+lOC5.net
>>225
確かクラスでパブリックな列挙体を指定すると、クラス.列挙体.列挙値の記述が出来ないはず。
そもそも列挙体はそのクラスから生成したインスタンスで挙動が変わるものでないので、クラスに記述すること自体が微妙。
VBAは.Netと違ってSheardがないので、標準モジュールに記述して使うのが変な挙動をしなくていいと思う。
VBAでクラスを使おうとすると、まだ考え方が確立され切れていないときの状態を引きずった言語だから使い方に戸惑うことが多いよね。
ユーザー定義型なんてもっと顕著にそう言うことが起こるよ。

236:デフォルトの名無しさん
16/01/02 21:54:01.64 MhjWcLlU.net
ライブラリ作ってるけどユーザー定義クラス(型)は全然使ってない。
どういう使いどころあるかな?

237:デフォルトの名無しさん
16/01/04 06:20:47.61 D+zYtfMV.net
vbsと相互に使うからわざわざ定義型なんて使ってないなあ
まとめて管理するとかもVariantの配列に突っ込めばいいし
もうちょと互換性があれば使ったかもしれないけど

238:デフォルトの名無しさん
16/01/05 00:10:29.99 USCQ6V11.net
ユーザフォームをActiveにしたときにコードを書きたいのですが
Activeってどうやって判断しますか?
UserForm_Click()だとボタンをクリックしたときにはそれが発動されないし。

239:デフォルトの名無しさん
16/01/05 02:05:35.42 Kvov8i6k.net
どう?

240:デフォルトの名無しさん
16/01/05 02:25:02.47 Kvov8i6k.net
ユーザーフォームを使った場合、
コードはそのフォームモジュールだけにに書いて
標準モジュールは作りさえしないというやり方で良いでしょうか?
いまのところ標準モジュールを作る意図が見いだせないのですが。

241:デフォルトの名無しさん
16/01/05 02:34:32.38 LNU3ZziC.net
そんな事 人に聞かなくても
作らなくても 動作上問題ないなら 作らんでいいんじゃね?

242:デフォルトの名無しさん
16/01/05 03:15:29.83 mStzs5Tn.net
>>235
普通はそのまんまのActivateイベント使うんじゃないかね
>>237
じゃあそれでいいんじゃない

243:デフォルトの名無しさん
16/01/05 03:22:29.47 cUCC3uaz.net
>>239
2013だとイベント拾えないなActivateイベント
フォームロード時には発生するんだが…

244:233
16/01/05 03:30:01.47 Kvov8i6k.net
>>239
そのActivateがくせもので
フォームが複数あったときにそのフォームがActivateになったときはそのイベントをひろうけど
フォームが1つだとmodelessで開いたとき普通のExcelワークシートからそのフォームにActiveが移動しても
Acticateに書いたコードは実行してくれず無反応なんですよ。

245:デフォルトの名無しさん
16/01/05 12:34:15.92 Kvov8i6k.net
Javaに慣れてると
他のSub(例えば名前をAdditionの2つの引数を取るとします)を呼ぶときに
Addition(5 , 8)
が構文エラーとなるのが気持ち悪くてしかたがありません。
正しくは
Addition 5 , 8
Call Addition(5 , 8)
のいずれかにしなければなりません。
でもどうにかしてJavaのように
Addition(5 , 8)
のようにできる方法はありませんかね?

246:デフォルトの名無しさん
16/01/05 12:36:58.68 LntnFA7d.net
>>242
無理だと思う。
Functionにはしたくないんだよね?

247:デフォルトの名無しさん
16/01/05 12:41:34.28 Kvov8i6k.net
>>243
Functionにしてもいいですよ。
でも同様にできなそうです。

248:デフォルトの名無しさん
16/01/05 12:45:32.43 33a1opJu.net
プログラマーとは多様性を受け入れるものだ

249:デフォルトの名無しさん
16/01/05 12:51:11.49 Kvov8i6k.net
受け入れたら負けだと思っている。

250:デフォルトの名無しさん
16/01/05 13:01:18.99 LntnFA7d.net
>>244
ああ、戻り値を捨てるってことか。それも無理だと思う。
Functionにして繋げてしまえば?
result = Func1(Func2(Func3(...Addition(5, 8))))
どこにも副作用がなく、無駄な戻り値も無いようにすればいい。

251:デフォルトの名無しさん
16/01/05 13:02:44.78 LntnFA7d.net
>>244
Javaを捨てて関数型に移行するのだ。VBAならそれができる。

252:デフォルトの名無しさん
16/01/05 13:16:48.58 YLBFKxeK.net
>>242
気持ち悪いのは君の勝手
言語には言語の流儀がある。それが嫌ならやらなきゃいいだけ。逆に、JavaでVBAっぽく
やりたいとかアホ抜かせって話。
そして、普通みなそういう言語毎に流儀は慣れる。気持ち悪いなんて言ってるような奴は
プログラマーとしては三流。

253:デフォルトの名無しさん
16/01/05 13:56:27.25 LntnFA7d.net
Subの呼び出し方がFunctionと違うことのメリットがなにかひとつあったような気がするんだが、忘れてしまった。
>>249ってプログラマなの?

254:デフォルトの名無しさん
16/01/05 16:31:17.21 mlWeSkma.net
>>250
非常にレアなケースでしかメリットが出てこないが、消費するヒープがSubの方が少ないから再帰の回数が多くできる
厳密には戻り値の変数エリアを初期化する手間がなくなるので実行速度も誤差程度には速い、はず

255:デフォルトの名無しさん
16/01/05 19:25:18.04 LntnFA7d.net
>>251
なるほど
s/ヒープ/スタック/
だよね?

256:デフォルトの名無しさん
16/01/05 20:12:50.80 KIPOXvA0.net
>>242
・プリプロセッサを作って変換する
・MSに入社してVBAの言語仕様書を書き換える
・MSを買い取ってVBJをサボートさせる
・…
ただ、こう言う本質的でないところに突っかかる奴はたいてい適性がないので、素直にマをやめた方が本人も周りも幸せになれる

257:デフォルトの名無しさん
16/01/06 03:05:54.21 IHMGmJSj.net
たぶんだけど「いやぁ、おれJava使えるんすよぉ。皆さんは出来ないでしょ?」的な自慢なんじゃないの。
プログラムの覚え始めってインプリンティングみたいな愛着が湧くから、そんな時期なんでしょ。

258:デフォルトの名無しさん
16/01/06 06:08:03.77 wTjSz+NM.net
>>254
逆を言えばそれしか出来ないんでしょ?wwwこんな程度で気持ち悪いとか吐いてる程度だから、Java自体のレベルも知れてる。

259:デフォルトの名無しさん
16/01/06 09:24:36.49 qs2eqDcn.net
あけましておめでとうございます
Excel VBA(windows7 Excel2010 VBA7,0)で パソコンがミュート状態かどうかを
判定したいのですが・・・
ミュート状態だと if ~ Else で処理(ミュート解除)させようと思っていますが
ミュートかどうかを判定する方法がわかりません
みなさんのお力をお借りしたく書き込みさせて
頂きました。
よろしくお願いします 22歳OL

260:デフォルトの名無しさん
16/01/06 10:01:38.51 nVjV76XE.net
>>256
mixerGetControlDetailsを使う

261:デフォルトの名無しさん
16/01/06 10:04:22.66 /XlzX9bH.net
>>256
MMDevice API とかでぐぐってみる

262:デフォルトの名無しさん
16/01/06 10:36:47.15 qs2eqDcn.net
>>257
>>258
早速の返信ありがとうございます
質問する前にgoogle先生に質問して
mixerGetControlDetails や
API などを使うと出来そうな感じの事が書いてあったのですが・・・
最近VBAを独学で勉強しだした私には難しくどうしたらいいか
よくわからず・・・ここで質問させていただきました
また、お時間ある時でいいのでアドバイスお願いします
まだどうしtらいいかわからないです
22歳OL

263:デフォルトの名無しさん
16/01/06 10:49:05.08 f2GjMEVM.net
>>259
最後の1行 なんかバカにされてる気がするぞ

264:デフォルトの名無しさん
16/01/06 11:47:08.51 /XlzX9bH.net
久しく制服を着たOLというものを見掛けなくなったな

265:デフォルトの名無しさん
16/01/06 11:48:38.02 /XlzX9bH.net
>>259
独学はよくない。
明日からavivaに行きなさい。

266:デフォルトの名無しさん
16/01/06 11:51:57.78 nVjV76XE.net
>>259
だったらこれからも独学でやれや
俺はグーグル先生みたいに甘くねーぞ

267:デフォルトの名無しさん
16/01/06 11:57:47.28 9dwHBHIu.net
>>259
喧嘩売ってんの?

268:デフォルトの名無しさん
16/01/06 12:48:37.88 uGhm1id+.net
ExcelVBAをオリジナルのExcelのない環境で実行することって不可能かな?

269:デフォルトの名無しさん
16/01/06 12:54:07.42 IHMGmJSj.net
>>265
オートメーションと呼ばれる手法で、たとえばAccessでCreateObject("Excel.Application")して、
そこで得られたエクセルオブジェクトを利用するっていうんじゃなきゃ不可能じゃないの。
あとはVBSにでもするしか。

270:デフォルトの名無しさん
16/01/06 13:12:52.54 YDWhVPVu.net
>>259
まずは誠意を見せたまえ。
おっ○いうp

271:デフォルトの名無しさん
16/01/06 16:16:54.72 uGhm1id+.net
>>266
やはり普通には使えないようですね、残念
ブラウザ上で動くサーバーサイドExcelみたいなのがあれば便利だったのですが

272:デフォルトの名無しさん
16/01/06 16:26:44.21 uGhm1id+.net
Private Function Reset(ByRef ls As Collection, ByVal k As String, ByVal v As Variant)
ls.Remove k
ls.Add Item:=v, Key:=k
End Function
Public Sub Test()
Dim list As New Collection
list.Add New Collection
list(1).Add New Collection
list(1)(1).Add Item:=123, Key:="key"
Reset list(1)(1), "key", 456
' Dim list_sub As Collection
' Set list_sub = list(1)
' Reset list_sub(1), "key", 456
MsgBox list(1)(1)("key")
End Sub
これが関数呼び出し時にエラーになるのは何故でしょう?
コメントアウト部の方を有効にするか、ByRefをByValにすると正しく動くので構わないんですが
もしかしてコレクションはByValで渡すのが当然とか?

273:デフォルトの名無しさん
16/01/06 16:47:03.10 9dwHBHIu.net
>>268
Google Spreadsheetでも使って下さい。

274:デフォルトの名無しさん
16/01/06 18:33:10.74 jZfE0I4k.net
>>269
Reset list(1).Item(1), "key", 456
とかなら呼び出せるっぽい
デフォルトプロパティの評価あたりでおかしな事になってるのかもしれん
実はItemは真のデフォルトプロパティじゃないし

275:デフォルトの名無しさん
16/01/06 20:01:54.35 uGhm1id+.net
>>271
そういう方法がありましたか
ありがとう

276:初心者A
16/01/06 20:04:38.71 tBMwYmRt.net
初歩的な質問で、すいません。配列とかFor~Nextのとこなんですが、
うまくいかなくて、悩んでます。
■■■■質問
'SH2のE列に、次のように出力するためには、どのようにコードしたら
いいか教えてもらえませんでしょうか?

277:初心者A
16/01/06 20:05:11.36 tBMwYmRt.net
-----
2
3
4
5
-----
1
3
4
5
-----
1
2
4
5
-----
1
2
3
5
-----
1
2
3
4
-----

278:初心者A
16/01/06 20:06:39.51 tBMwYmRt.net
■■■■前置き(その1)
No(1)=1
No(2)=2
No(3)=3
No(4)=4
No(5)=5
の配列を、違うシート(シート名:sheet2name)に出力したい。
動的配列ですが、NUM1=5として考えやすくしてみました。
計算結果を出力するシートを、
Set SH2 = Worksheets(sheet2name)とする。

279:初心者A
16/01/06 20:07:07.71 tBMwYmRt.net
■■■■前置き(その2)
1
1
1
1
-----
2
2
2
2
-----
3
3
3
3
-----
4
4
4
4
-----
5
5
5
5
-----

280:初心者A
16/01/06 20:07:24.26 tBMwYmRt.net
■■■■前置き(その3)
と出力するために、次のようにコードしました。
--------------------------------------------------
r = 0
t = 1
For s = 1 To NUM1
For q = r + 1 To r + NUM1 - 1
SH2.Cells(q + 2, 4).Value = No(t) 'SH2のD列にデータ出力
r = r + 1
Next q
t = t + 1
Next s
--------------------------------------------------

281:デフォルトの名無しさん
16/01/06 20:30:41.31 5UG3hvjQ.net
動的配列のLBoundの値を変更するのにRedim Preserveを2回使うテクニックがあるけど、
真っ当な技と言えるんでしょうか?

282:デフォルトの名無しさん
16/01/06 20:37:10.97 cINiOzEy.net
>>273
質問がとっちらかっててよくわからん
とりあえず>>274のコード
Sheets("SH2").Activate
num = 5
r = 1
For i = 1 To num
  For j = 1 To 5
    If i <> j Then
      Cells(r, 5) = j
      r = r + 1
    End If
  Next
  Cells(r, 5) = "-----"
  r = r + 1
Next

283:デフォルトの名無しさん
16/01/06 20:38:10.90 cINiOzEy.net
For j = 1 To 5

For j = 1 To num
の間違い

284:初心者A
16/01/06 21:15:55.49 tBMwYmRt.net
>279
やってみます。ありがとうございます。

URLリンク(ww10.puny.jp)

パスワード:abc
Module1で試行錯誤中です。
SH2(シート名:計算結果)の【F列】
SH2.Cells(u + 2, 6).Value=
にデータ出力したいです。
初心者なんで難しいです(>_<)
時間かかりそうです。

285:初心者A
16/01/06 21:30:56.38 tBMwYmRt.net
おかげさまで、できました(^^)/ありがとうございます
下記のコード
r = 1
For i = 1 To NUM1
For j = 1 To NUM1
If i <> j Then
SH2.Cells(r + 2, 6).Value = No(j)
r = r + 1
End If
Next j
Next i

286:デフォルトの名無しさん
16/01/07 00:21:58.78 GoyK1MG8.net
>>279みたいにシートをActivateやSelectして
Cellsの親を省略するみたいな書き方って気持ち悪いと思いませんか
扱うシートが増えたりしたらどうするんですか

287:デフォルトの名無しさん
16/01/07 01:36:13.89 w0ujcVRl.net
シートが増えれば大変なのはどちらも同じ
好きな方を使えばよい

288:デフォルトの名無しさん
16/01/07 08:35:20.93 bWvRU875.net
サンプルの書き方は本当の書き方と多少違うだろう。

289:デフォルトの名無しさん
16/01/07 09:09:34.45 QNCWlpNp.net
>>284
どちらでもよくない。
処理中にシートが切り替わると副作用があるので、必ずsheet1.cellのように指定する。
個人で作って使うなら何してもいいが、人に渡す時はそんな舐めたことすんじゃねーぞ

290:デフォルトの名無しさん
16/01/07 09:29:17.60 bWvRU875.net
>>286
人に渡すってどういう意味?

291:初心者A
16/01/07 12:18:16.88 pq62efvo.net
■やりたいこと
下記のURL先のエクセルファイル
(ファイル名:2点間距離の差011)の
計算結果シートにて、
●D値が多い順の表を完成させたい。
●D値の合計が大きい順の表を完成させたい。
どうコーディングすればいいか、アドバイス
頂けると幸いですm(_ _)mぺこり
URLリンク(ww10.puny.jp)
パスワード;abc

292:初心者A
16/01/07 12:19:39.64 pq62efvo.net
2つの座標系を用いて、
点間距離の差を計算結果シートのO列に表示しています。
座標入力シートのG2セルにて、
点間距離の差がある値より大きいものをD値としています。
計算結果シートのO列で、そのD値より大きい値を赤くしています。
-----------------------------------------------------------
例えば、
点名A1 点名B1では、D値が多い順の個数は、
2個です(赤くなっている文字が2つ)
例えば、
点名A1 点名B1では、D値の合計が大きい順の合計(mm)は、
51.5です。

293:デフォルトの名無しさん
16/01/07 17:52:38.68 2nH+0Iqy.net
単純に考えて
a1-b1
a2-b2
a3-b3
の表完成させて並び変えたら

294:初心者A
16/01/07 18:17:44.40 pq62efvo.net
>>290 たしかに、並び替えは後ですね。
ここまで、できました。
現状で満足してますが
できれば、VBAを用いて、ソートしたい。
URLリンク(ww10.puny.jp)
パスワード:abc
上記URL先のエクセルファイル(2点間距離の差016.xls)
の計算結果シートにおいて、
(表:D値の個数)個数をキー(多い順)として、ソートしたい。
(表:D値の合計)合計をキー(大きい順)としてソートしたい。
■これ勉強しなきゃいけないんかな?
VBAでクイックソート
URLリンク(howto-it.com)
URLリンク(excel-ubara.com)

295:初心者A
16/01/07 18:24:25.57 pq62efvo.net
エクセルの標準機能で、いっかな(´・ω・`)
ホーム→
→並び替えとフィルター
→ユーザー設定の並べ替え
→列にて、優先されるキーで、個数または合計を選択
→順序で降順
→OKボタン

296:デフォルトの名無しさん
16/01/07 18:33:25.91 2nH+0Iqy.net
並び替えする前に新しいマクロの記録コマンド
並び替え終わったら終了コマンド
すると操作が記録されたVBAプロシージャが取得できる

297:デフォルトの名無しさん
16/01/07 19:09:08.14 v5mg4Nrt.net
OFFICE次バージョンからVBAが廃止されるかもとネットで見た。ウチの会社オワタ

298:デフォルトの名無しさん
16/01/07 19:11:08.03 bWvRU875.net
>>294
どこのソース?
一般企業での利用者の存在数から考えて無理だと思う。

299:デフォルトの名無しさん
16/01/07 19:37:43.86 2nH+0Iqy.net
というか基本的にOFFICEのバージョンアップは不要
しかしエクセルでマイナンバーとか管理されたら
それに近いところでVBAが動いてたらまずいでしょ
だから時代についていくためにVBAを切り捨てる必要がある

300:デフォルトの名無しさん
16/01/07 19:47:50.85 bWvRU875.net
そんな日本だけの事情でマイクロソフトが動くのか?

301:初心者A
16/01/07 19:54:26.63 pq62efvo.net
エクセル2007以降のバージョンなら、どのバージョンでもいい。

302:初心者A
16/01/07 19:57:16.31 pq62efvo.net
>>293
そうでした。マクロの記録がありましたね。
やってみます。2行~最終行を選択ればいいのかな?

303:デフォルトの名無しさん
16/01/07 19:58:23.02 2nH+0Iqy.net
>>297
サポートじゃなくてセールス文句だから
ネットにつないでも安全なエクセルって感じかな

304:初心者A
16/01/07 23:46:18.98 pq62efvo.net
Const sheet2name =

305:初心者A
16/01/07 23:47:38.29 pq62efvo.net
Const sheet2name = 計算結果(※ダブルクオテーション略)
Sub 並べ替え()
Dim SH2 As Worksheet
Dim GYO4 As Long, NUM4 As Long, x As Long
Set SH2 = Worksheets(sheet2name)
'R行の3行目から最終行までリサーチ
'NUM4は、並び替えるデータの個数
For GYO4 = 3 To SH2.Range("R65536").End(xlUp).Row
NUM4 = GYO4 - 2
Next GYO4
SH2.Sort.SortFields.Clear
Range(SH2.Cells(2, 18), SH2.Cells(NUM4 + 2, 21)) _
.Sort Key1:=SH2.Cells(3, 21), order1:=xlDescending, Header:=xlYes
End Sub

306:初心者A
16/01/07 23:49:14.75 pq62efvo.net
並べ替えって基本的にこれだけなんだ(´・ω・`)ほ~
SH2.Sort.SortFields.Clear
Range(SH2.Cells(2, 18), SH2.Cells(NUM4 + 2, 21)) _
.Sort Key1:=SH2.Cells(3, 21), order1:=xlDescending, Header:=xlYes

307:デフォルトの名無しさん
16/01/08 00:32:14.62 AwkBQm6q.net
シート上のソートはどこかにキー列がないと機能しないのがちょっと不便だけど、
簡単ではある。

308:デフォルトの名無しさん
16/01/08 06:38:04.99 ZpBAcVz8.net
VBAの求人117件の平均最低月給224,500円
URLリンク(jobinjapan.jp)

309:デフォルトの名無しさん
16/01/08 15:12:20.20 9Hdlf+du.net
>>278
そのテクニックというもの自体知らないので、
よろしかったらもっと詳しく教えてください

310:デフォルトの名無しさん
16/01/08 16:51:24.45 VkXSxnl8.net
>>306
Dim v As Variant
'LBound=0 : 長さ3の配列
ReDim v(0 to 2)
v(0) = 0: v(1) = 1: v(2) = 2
' LBoundを1に変えたい
' LBound=1 : 長さ4に拡張
ReDim Preserve v(1 to 4)
'長さ3に戻す
ReDim Preserve v(1 to 3)
こうするとLBoundの値は確かに変わるし、巨大な配列でも一瞬で終わる。
これが仕様的に正しいと言えるのか不明。ループでやると仕様的な不安はないけど時間は掛かる。

311:デフォルトの名無しさん
16/01/08 18:00:56.80 1fL2vwQ7.net
> ReDim Preserve v(1 to 3)
これ一回じゃあかんのか

312:デフォルトの名無しさん
16/01/08 18:07:13.41 VkXSxnl8.net
>>308
なぜかダメ。
長さが変わらないからやる意味なしと判断されるのか...は不明。

313:デフォルトの名無しさん
16/01/08 18:20:31.18 u+GM9q1y.net
>>307
意味がよくわからない。
Sub foo()
  Dim a As Variant
  ReDim a(0 To 2)
  Debug.Print LBound(a) & " To " & UBound(a)
  ' Lowerのみ変更
  ReDim Preserve a(1 To 2)
  Debug.Print LBound(a) & " To " & UBound(a)
End Sub
結果:Lowerは変わっている
0 To 2
1 To 2
Sub foo()
  Dim a As Variant
  ReDim a(0 To 2)
  Debug.Print LBound(a) & " To " & UBound(a)
  ' 両方変更
  ReDim Preserve a(1 To 3)
  Debug.Print LBound(a) & " To " & UBound(a)
End Sub
結果:両方変わっている
0 To 2
1 To 3

314:デフォルトの名無しさん
16/01/08 18:37:10.31 VkXSxnl8.net
>>310
えー?
下のfoo は自分の環境では
0 To 2
0 To 2
と出るんだけど?
Office 2010 Excel 14.0.7163.500(64bit)
Visual Basic for Applications 7.0

315:デフォルトの名無しさん
16/01/08 18:45:54.37 ujpdqUME.net
>>307
ヘルプ(2007)には
>キーワード Preserve を使用した場合、動的配列のサイズを変更するために変えられるのは、添字の上限だけです。添字の下限を変更しようとすると、エラーが発生します。
って書いてあるな
>これが仕様的に正しいと言えるのか
やってみたが2007では出来てるみたいだが、ヘルプには出来ないと書いてあるのだから
仕様的に正しいとは言えないと思うが
過去のバージョンではホントにエラー出てたような気もするんだが
いつの間にかこっそり拡張されたのかねぇ

316:デフォルトの名無しさん
16/01/08 18:53:30.77 ujpdqUME.net
>>311
2007の32ビットなら、>>307>>310も出来るっぽい
下限を変えたときに、要素がずれるのか下限側の要素が切り捨てられる(または
初期化された要素が追加される)のかは確認してない
この辺も明示されていないから、ReDimで下限変えるのは
環境依存で危険な方法だと思った方が良いんじゃない

317:デフォルトの名無しさん
16/01/08 18:55:30.64 VkXSxnl8.net
レスくれた皆さんありがとう。
これを使ってLBoundを変更する機能、急にいらなくなりました。
なんでこんな質問をしたかというと、ワークシートから取得した配列(Range(範囲).Valueで取れるやつ)のLBoundを手っ取り早く0にしたかったからです。
だけどその場合は2次元配列となり、1次元目のReDim Preserveはどうやってもダメだと気づきました。
どうもすいません。

318:デフォルトの名無しさん
16/01/08 18:58:01.58 1fL2vwQ7.net
>>312
検索するとこんなのがあったけど
a)キーワード Preserve を指定した場合、変更できるのは、動的配列の最後の次元のサイズに限られます。
また、次元数は変更できません。
b)つまり、キーワード Preserve を使用した場合、動的配列のサイズを変更するために変えられるのは、添字の上限だけです。
添字の下限を変更しようとすると、エラーが発生します。
つまりだからbはaの2以上の次元配列の話
v(3,5)
の3は変えられなくて5は変えられる
添え字の上限とは5(数値じゃなく一番右にあるって意味)のこと

319:デフォルトの名無しさん
16/01/08 19:09:45.61 ujpdqUME.net
>>315
もし2次元以上の配列に限る話だったとしても、その意味は
(3, 1 To 5)を(3, 0 To 5)に出来ませんって事
次元と添字の上限下限は別の話。上限下限は次元ごとに存在んするんだよ

320:デフォルトの名無しさん
16/01/08 23:46:16.59 EVmIpiZQ.net
>>294
アホな

321:デフォルトの名無しさん
16/01/09 09:51:48.56 eE0tOkYT.net
アホな話かも知れないけど無くなるかも知れないってよ
Excelの自動操作をしたければ外部からやれってことらしいね
ついでにワードみたいに1アプリケーション1ブックしか開けなくなるかもってよ

322:デフォルトの名無しさん
16/01/09 10:03:01.20 ba2w/O62.net
ワードはマルチドキュメントじゃなくなっただけだろう。
アプリケーションで複数のブックを開けなくなるなんて退化はあり得ない。

323:デフォルトの名無しさん
16/01/09 10:31:05.76 c5DKVMyA.net
ないってよ



324:らしいね かもってよ www



325:デフォルトの名無しさん
16/01/09 19:46:58.98 DEcEG5aT.net
ソースもださずにネットで見たとか言う話の信頼性をどうこう言っても

326:デフォルトの名無しさん
16/01/09 20:11:29.37 h3R10OzO.net
グローバル変数や、Public Subの名前を変更したいとき、
それを確実にすべて変更する方法ってありますか?
置換は確実じゃないのでダメです。
例えば、manという変数をmaleに置換しようとしてまちがってwomanという変化をwomaleにしてしまう可能性があるからです。

327:デフォルトの名無しさん
16/01/09 20:19:58.68 3Mphd1W9.net
正規表現
単語で検索
" man "を" male "に変換
3通りの可能性思いつきました


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch