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

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

レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん2015/11/27(金) 20:36:45.35ID:9HV+ag/s
ExcelのVBAに関する質問スレです

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

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

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

※前スレ
Excel VBA 質問スレ Part38 [転載禁止]2ch.net
http://peace.2ch.net/test/read.cgi/tech/1441619979/
0002デフォルトの名無しさん2015/11/30(月) 19:06:16.48ID:zHM+I8Nt
Sub 1_Otsu()
0003デフォルトの名無しさん2015/11/30(月) 21:18:18.94ID:QHANvkhd
変数宣言を強制するほうが先だろうが
0004デフォルトの名無しさん2015/12/01(火) 19:27:05.42ID:m+Ed34Zj
最近、vbaを学んだ者ですが、配列の有り難みがよくわかりません。
前スレで大量のセルを処理するときは配列に入れろみたいな書きこみを見ましたが、配列が役に立つ局面を教えていただけないでしょうか。
よろしくお願いします
0005デフォルトの名無しさん2015/12/01(火) 20:28:12.95ID:eT3ZeD+F
>>4
配列処理はワークシートのレイアウトとかと無関係に独立したライブラリにしやすい。
0006デフォルトの名無しさん2015/12/01(火) 21:07:28.65ID:3m4PeF6r
配列の有効性が分からないってVBAを学んだって言えないレベルだろ。
Z80エミュレータからやり直せ。
0007デフォルトの名無しさん2015/12/01(火) 21:20:20.66ID:bdqEzHLJ
>>4
そもそもエクセルのセル自体が広義の意味では2次元配列そのものなので
エクセルを使うという事はすなわち配列を使うことに他ならないわけです。
(A1セル一個しか使わないというなら話は別ですが、そんな人はまず居ないでしょうし。)

貴方の言う「配列」がVBAにおける「配列変数」の事であれば、
連続したデータを順に扱う、
複数のデータに対して繰り返し同じ処理をする、
といったような操作をする際には
配列変数は非常に便利(というか無しではお話にならない)です。
0008デフォルトの名無しさん2015/12/01(火) 23:23:09.59ID:DoIn4zBF
初心者の質問ですが
例えばワークシートに値を入力するときに

Worksheets(1).Name = "2ちゃん"

でシート1のシート名が変更されますよね。でもオブジェクト名のsheet1を使っても変更できますよね。
オブジェクト名を変えた場合にWorksheets(1)かどうか確認するのはどうやったらいいんでしょうか。
シートのプロパティウィンドウみてもオブジェクト名は書いてるけどWorksheets(1)かどうか載ってない
0009デフォルトの名無しさん2015/12/01(火) 23:41:37.98ID:VMDnA6sJ
>>8
Debug.Print Worksheets("sheet1").Index

ちなみに index値は シートタブの左から 1 2 3 ・・・・
となりますので シートオブジェクトと index値は常に 一致するとは限りませんよ
0010デフォルトの名無しさん2015/12/01(火) 23:44:42.53ID:6iNC03K1
年と月をそれぞれ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(
0011デフォルトの名無しさん2015/12/01(火) 23:48:55.25ID:DoIn4zBF
>>9
それではWorksheets(1)というのはシートタブの1番左という意味でいいのでしょうか?
0012デフォルトの名無しさん2015/12/01(火) 23:49:02.31ID:6iNC03K1
あれ、切れてる

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
0013デフォルトの名無しさん2015/12/01(火) 23:52:23.38ID:VMDnA6sJ
>>11
そゆこと
ちなみにこれで確かめてみればどうかな?

Debug.Print Worksheets(1).Name
シート名が返ります
0014デフォルトの名無しさん2015/12/01(火) 23:57:05.93ID:DoIn4zBF
>>13
なるるー
イミディエイトで確認できました!ありがと
0015デフォルトの名無しさん2015/12/02(水) 00:19:38.80ID:iA4P55nL
>>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
0016デフォルトの名無しさん2015/12/02(水) 00:29:46.76ID:YKAbvKrp
>>15
ありがとうございます
こんなに簡素化できるものなんですね……精進します
0017デフォルトの名無しさん2015/12/02(水) 00:33:35.11ID:BpyWczK7
>>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
0018172015/12/02(水) 00:34:44.42ID:BpyWczK7
アンカ間違えた
>>12 さんへね
0019デフォルトの名無しさん2015/12/02(水) 00:38:55.45ID:iA4P55nL
>>16

とりあえず年(仮にyrとする)と月(仮にmoとする)が定まれば
Day(DateSerial(yr, mo + 1, 0))
つまり、翌月のゼロ日(1日の前の日)を求める事で、
その月の日数をエクセルが自動的に出してくれるんですよ

あと、セルの書式設定も日と曜日が別の列なら
曜日の列だけをNumberFormatLocal = "aaa"でいっぺんに設定できます
例えば曜日をC列にするなら
.Columns(3).NumberFormatLocal = "aaa"
だけで済むわけです

>>15みたいにループの中で1セルずつ変更するってのは
あまり格好良いもんじゃないですよね?
0020デフォルトの名無しさん2015/12/02(水) 10:37:37.63ID:CO7jH6lO
4です、ご返事ありがとうございます。
叩かれること覚悟で書きますが、同じ処理の繰り返しなら配列変数ではなくても、for next
とかfor eachステートメントでは、望ましくないのでしょうか?
002172015/12/02(水) 11:33:14.55ID:ZeoaW+75
for each はともかく、 for next は処理対象を番号で指定するじゃないですか。
番号で指定すると言うことは
配列変数との親和性が高いと思いませんか?
既に言及したとおり、
エクセルのセルは2次元の配列ですから、
セルに対してfor next で繰り返し処理をするというのは
まさしく配列操作そのものなのです。

もし、広義の配列そのものではなく、
redimで宣言する狭義の配列変数のみについて
有効性を論じたいと言うのであれば、
セルに代入するよりも速度が速いとか
メモリの消費量が少ないとか、
3次元以上の配列を扱いたいケース
(まぁ、多次元配列は遅いらしいですけど)
とか、そんな理由があげられますね。

とはいえ、配列など不要だと思うならば
無理に使う必要は無いですし、
その辺は使う人の自由ですよね。
0022デフォルトの名無しさん2015/12/02(水) 11:50:42.44ID:tBPWNP4P
>>20
配列を使わず for next とはどのようなものを想定しているんですか?
002342015/12/02(水) 12:15:32.57ID:IdfHYqnb
For nextも配列立ったのですか、知らなかったです。
てっきり、配列とは
Dim i(5) as long
みたいなものだけを指すと考えており、上手い使い方がよくわかっていませんでした
0024デフォルトの名無しさん2015/12/02(水) 12:32:59.22ID:1aVlPH12
>>23
そういう固定長配列とReDimで作る可変長配列がある。>>21氏の言うところの狭義の配列ですね。
「For Nextも配列だっのですか」という文は意味不明ですが、何かを勘違いしてる?。
0025デフォルトの名無しさん2015/12/02(水) 13:35:58.72ID:ES2jo2hu
質問お願いします!
演算子を変数に格納することはできませんか?

b = ”<=”

If n & b & 10 then

みたいに使いたいのですが、型が一致しませんというエラーとなります。
002672015/12/02(水) 14:29:54.99ID:xdo22nBP
If Evaluate(n & b & 10) then

でいけます
0027デフォルトの名無しさん2015/12/02(水) 15:59:46.36ID:IdfHYqnb
24さんへ
自分にとって配列とは狭義のものと、(A1:C5)みたいなものだけをだけだと思ってました。
Fornextは、配列と関係ないと考えてました
0028デフォルトの名無しさん2015/12/02(水) 17:50:57.38ID:megPAB6I
>>26
ありがとうございました!
0029デフォルトの名無しさん2015/12/02(水) 18:37:30.73ID:l3wtZpWO
もう一つお願いします!
配列を別の変数に格納するときは、次のようなコードで大丈夫でしょうか?一応テストでは成功していますが、なんとなく作って出来てしまったもので、、使い方が危ない場合、ご指摘お願いします。

dim varA as variant
redim a(10,0)
redim b(10,0)

if n = 0 then
varA = a()
else
varA = b()
end if
0030デフォルトの名無しさん2015/12/02(水) 19:04:11.72ID:1aVlPH12
>>29
varA = a、varA = bでいい。後ろの()は不要。varAはVariantだからそれでいける。
代入したものは元の配列のコピーであって別物だよ。コピーする意味はあまりないと思うけど?
0031デフォルトの名無しさん2015/12/02(水) 19:26:54.23ID:UPwzPe+L
>>30
ありがとうございます。助かりました!
a.bは既に要素が入ってる配列のつもりでした。
後に場合分けで参照するときにコード短縮の為に変数格納しました。
少し書き方が悪かったですね。すいません。
0032デフォルトの名無しさん2015/12/04(金) 14:58:36.71ID:R21wXbu/
みんなが今まで読んだVBAの本の中で1番良かった本またはベスト3あったら教えてくれ
0033デフォルトの名無しさん2015/12/04(金) 17:23:30.92ID:gPECvyso
入門書を一冊しか読まなかった
できるシリーズのヤツ
お勧めはしないけど
0034デフォルトの名無しさん2015/12/04(金) 18:25:37.86ID:R21wXbu/
オススメしないんかーいw
0035デフォルトの名無しさん2015/12/04(金) 19:42:49.81ID:otf7riqF
マイコンBASICマガジンで覚えた
0036デフォルトの名無しさん2015/12/04(金) 19:59:12.15ID:sb8rC8Nq
初学は自動記録とネットの情報で事足りた
ある程度使える様になってから逆引き辞典買ったけど余り役には立ってない
0037デフォルトの名無しさん2015/12/05(土) 04:12:41.80ID:CzoZcA89
俺もVBA関連の書籍は読んだことないな
ネットが今ほど充実してなかった大昔ならいざ知らず
ほとんどマクロの記録とネットでの検索で十分だしね

ま、構文の文法すら分らない超初心者なら
適当な入門書は読んだ方が良いとは思うけど
0038デフォルトの名無しさん2015/12/05(土) 07:09:21.83ID:r4Zj1qpg
>>32
入門書なら最近でたVBAの神様オススメ
小説仕立てで楽しく読み進められる
0039デフォルトの名無しさん2015/12/05(土) 09:12:30.30ID:R3VpKF0E
ネットの情報で十分なんだけど、第三者に見られる事を考えたら
やはり一度はしっかりとした言語仕様とリファレンスの本読みたいね
自分も知らずにEvaluateとか自作してしまったし
0040デフォルトの名無しさん2015/12/05(土) 18:36:02.45ID:kpxGhXzN
>>39
スゲー
どうやったら出来るのかソーゾーも出来ない。
俺だったら精々不等号のパターン4つかそこらの場合分けで条件分岐させるのが関の山で、evaluateみたいに文字列で自由に式評価させるなんてとても無理だ。
0041デフォルトの名無しさん2015/12/05(土) 19:51:10.55ID:xfTuOD8g
>>39
第三者に見られる環境ならば逆に他人のコードも見れるって事じゃないか、見て盗め
0042デフォルトの名無しさん2015/12/05(土) 22:14:54.16ID:2rD0PXa4
>>40
Evaluate自作なんて無理でしょ。というか目指すべきことじゃないよ実行時に意味が確定するなんて。
0043デフォルトの名無しさん2015/12/06(日) 01:02:05.80ID:RRzw5NLa
実行時評価(計算)なんて普通は使うもんじゃないけど、
乗算の度に小数点以下の切り上げを行う(しない場合もある)必要があって、
しかも計算式をユーザーが入力するというツールを作る際に使った
0044デフォルトの名無しさん2015/12/06(日) 01:19:20.97ID:Rb3lVfqw
使える演算子が乗算一種類なら、まあ簡単だな
0045デフォルトの名無しさん2015/12/07(月) 09:13:19.44ID:jD12UvhK
その程度でevaluate自作とか言われるのって、
寿司奢るって言われて
コンビニの納豆巻き一本渡されるぐらいのガッカリ感だな
0046デフォルトの名無しさん2015/12/07(月) 21:09:19.70ID:6aFt31sh
自作Evaluateと乗算のみの実行時評価は別だよ

四則計算のみ(括弧対応)のEvaluate
https://ideone.com/imts1M
あまり使ってないから正しく動くかどうかは保証しない
0047デフォルトの名無しさん2015/12/08(火) 11:48:40.10ID:W1o0a1vT
やめようよ
0048デフォルトの名無しさん2015/12/08(火) 19:21:03.28ID:ZPfyD2ax
エクセルに詳しい人いたらこれに答えて〜
http://i.imgur.com/ctFP56p.png
0049デフォルトの名無しさん2015/12/08(火) 19:24:33.40ID:eOnXmxYQ
嫌です
0050デフォルトの名無しさん2015/12/08(火) 19:45:20.81ID:WQt5IVqj
>>48
3 とか -3 をそのまま打てばいいやん w
0051デフォルトの名無しさん2015/12/08(火) 19:52:00.68ID:8bkF9KCf
VBAとセル計算ってどっちが速いの?

例えばVBAで

A1に○○代入(数値)
A2に○○代入(数値)

A20に○○代入(数値)

B1セルの値をB2に代入

みたいなVBAがあるとして
ここでB1セルにはA1〜A20を使ってifとか色々な関数使った長い式があるとする

この場合にB1セルの計算が終わる前にVBAが追い越して数値を代入することってありえるの?
0052デフォルトの名無しさん2015/12/08(火) 19:55:43.49ID:ZPfyD2ax
誰か>>48頼む!
=if(a3>a2,3,-3)を入力しても無理だった・・・
0053デフォルトの名無しさん2015/12/08(火) 19:57:18.42ID:J4OFLa1h
>>51
同時には実行されないから、関数よりもマクロが先に実行される仕組みならマクロが先に代入する。

>>52
VBAの話題ではない。
0054デフォルトの名無しさん2015/12/08(火) 20:50:48.64ID:4cJ0X+3R
>>52
無理って何だよ?それでいけるだろ
0055デフォルトの名無しさん2015/12/08(火) 21:36:53.02ID:KvNJeD9m
>>52
セルの書式が文字列とかじゃね
0056デフォルトの名無しさん2015/12/08(火) 21:49:08.87ID:46EuwWyR
>>51
計算方法が自動なら
> A1に○○代入(数値)
で再計算が行なわれる
以下
> A20に○○代入(数値)
まで、20回計算される
なので
> この場合にB1セルの計算が終わる前にVBAが追い越して数値を代入することってありえるの?
なんてことはない
20回も計算するのは時間がかかってしょうがないと言う時は、最初に Application.Calculation = xlCalculationManual とかして計算しない様にしておいて、A20 に代入したあとで、Application.Calculate とか実行しすると計算は1回ですむ
0057デフォルトの名無しさん2015/12/09(水) 01:33:16.84ID:bb4JBp1r
>>53>>56
なるほどなー

要するに、VBAでセルに数値が代入される→数値が変わった時点でセル内の再計算→またVBAに戻る

って感じか。なるほどなるほど。ありがと
0058デフォルトの名無しさん2015/12/09(水) 01:56:13.57ID:A8KFlPn0
全てセミコロンに変えたら解決できました
=if(c3>c2;3;-3)

どうもありがとう
0059デフォルトの名無しさん2015/12/09(水) 02:02:30.52ID:ZB9BGZbY
なりすまし
0060デフォルトの名無しさん2015/12/09(水) 11:36:59.80ID:NOtadkaS
エクセルにcsvファイルのデータを貼り付けて一部の列にvlookupの数式を上書きしたいんですけど
どうすればよいですか?
マクロにしたいのは数式の上書き部分だけです
0061デフォルトの名無しさん2015/12/09(水) 12:25:31.08ID:ZB9BGZbY
>>60
例えばC列に数式を入れたいときは

Range("C1").Formula = "=VLOOKUP(B1,A:A,1)"

みたいに数式を文字列にしてセルのFormulaに入れればいい
0062デフォルトの名無しさん2015/12/09(水) 16:22:59.08ID:NOtadkaS
>>61
ありがとうございます。
0063デフォルトの名無しさん2015/12/09(水) 16:59:02.21ID:bb4JBp1r
学生でVBAとSQL使って競馬のソフト作ったりして遊んでるけど、就活の時にそういうのアピールしてもいいかな
0064デフォルトの名無しさん2015/12/09(水) 17:09:37.89ID:h+7RpR46
>>63
マジレスすると、ギャンブルするような学生はいらんってことになるな
0065デフォルトの名無しさん2015/12/09(水) 17:21:13.51ID:bb4JBp1r
>>64
やっぱり印象悪いかな
データ集めて統計使って指数出したりするの好きなんだよな
0066デフォルトの名無しさん2015/12/09(水) 17:57:02.43ID:h+7RpR46
>>65
さらにマジレスすると、独創的なアルゴリズムを使った予想をしているならそのアルゴリズム
その、実装がむずかしいとされているものを既存のアルゴリズムを用いて実装したり(遺伝的
アルゴリズムでNSPを解決するなど)があるなら、アピールポイントになると思うよ
0067デフォルトの名無しさん2015/12/09(水) 22:32:23.05ID:ulePTNdz
素人にはプログラムなんてよく分からないからね
自分も入社時に現場叩き上げの人直々に面接されたが、WindowsのGUIアプリをフロッピーで持っていった所、
結局何が書いてあるのか分からなかったのか見てもらえなかったし
Unixの知識についてはあれこれ聞かれたが

IT業界以外ならVBAを使いこなせます、アプリ作ったことありますってだけで十分アピールポイントになると思うよ
VBAって何?SQLって何?ってことになる可能性があるからそこら辺はしっかり予習した方がいいと思うけど
0068デフォルトの名無しさん2015/12/10(木) 04:22:52.80ID:LKPBxMee
どういうところに修飾したいかもわからんのにまともなレスが返せるわけもなく
人生相談ならよそでやってくれ
0069デフォルトの名無しさん2015/12/10(木) 05:00:47.29ID:00S+xOQk
面接で見られてるのは技術じゃなくて人柄なんだってば

技術的なことなら筆記試験や小論文で判断できる
重要なのは「何をやったか」という内容じゃなくて、それをどう説明するかっていう、プレゼンまでは行かなくても話し方が見られてる
0070デフォルトの名無しさん2015/12/10(木) 07:11:06.38ID:DygANkW8
>>69
できる新人なんてほんと稀
できますって入ってきた奴が作ったものはバグだらけ
未経験のほうがよっぽどバグが少ない
まあこんなこともあるから経験の有無なんてほとんど誤差
0071デフォルトの名無しさん2015/12/10(木) 08:00:18.24ID:+sdtvmJJ
面接官も同じような面接質問ばっかしてるだろうから
面白がってはくれるだろうね。

採用につながるかは分からんが。
0072デフォルトの名無しさん2015/12/10(木) 13:03:32.27ID:uuSHmo9z
VBAにおけるIE11の制御において、普段は大丈夫なのに、
画面ロック中(スリープ後など)だけ、なぜかSELECT要素が参照できなくなります
他のINPUT要素などは問題なく参照できます
IE8からIE11に変えてから起きるようになった気がします
できるだけIE11で行いたいのですが、何が原因でこのようなことが起きるのでしょうか
0073デフォルトの名無しさん2015/12/10(木) 16:23:47.48ID:vMPjIzZK
http://xxx.com/contents.html#R1N1
セルにコピペした、上記のようなラベルを含むハイパーリンクを正常に機能させたいのですが、
「#」が「-」に置き換わっているような挙動をして意図したページが開けません。
ハイパーリンクの編集で確認しても上記の通り入力されています。改善方法はあるでしょうか?
0074デフォルトの名無しさん2015/12/10(木) 16:26:05.28ID:kl2q0NOf
>>73
このリンクはクリックするなよ
0075732015/12/10(木) 16:30:40.32ID:vMPjIzZK
書き込み後ためしに自分もクリッコしたんですが、変なサイトに飛びました・・不適切な例を使って申し訳ないです
0076デフォルトの名無しさん2015/12/10(木) 20:33:09.52ID:GTbd/bMS
VBAでCreateObject("Scripting.Dictionary")とすると
連想配列が使えることを知ったのだけど
動的配列(要素を放り込むと勝手に伸びていく配列)はないですかね
普通の配列は、要素数を決めてDimなりReDimなりしてからでないと
使えなくて不便で…
0077デフォルトの名無しさん2015/12/10(木) 20:37:45.04ID:m24vGLCh
>>76
ないと思うけどDictinaryではダメなポイントは何?
0078デフォルトの名無しさん2015/12/10(木) 20:39:24.26ID:CRNEQuUV
>>76
標準で使えるのはCollectionかな。

動的配列はByRefで渡した先で要素数を変更出来るので、
これを利用して自分で配列伸ばす関数作る事も出来るけど。
0079デフォルトの名無しさん2015/12/10(木) 21:02:59.81ID:GTbd/bMS
>>77
Dictionaryは要素の格納順が保証されないというのがネックです
例を挙げると、印刷すべきシート名を条件判断で選別しながら配列に放り込んでいき
最後にFor Eachで格納順に印刷する、というような処理があります

>>78
Collectionを調べてみます
ありがとうございます
0080デフォルトの名無しさん2015/12/10(木) 21:11:34.59ID:CRNEQuUV
格納順を保証したいならキーを1〜nにすればいいのに。
0081デフォルトの名無しさん2015/12/10(木) 21:50:20.75ID:LgWPhvQB
>>79
なんだ、その程度の配列サイズと頻度か。
だったら (配列, 追加する要素) を引数にとって、要素がひとつだけ大きい配列を返す関数を作ればいい。
効率なんか考えなくてOK。
0082デフォルトの名無しさん2015/12/10(木) 22:14:34.44ID:Ek2aQ7ct
配列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

って書くのもなんか泥臭いというか素人っぽいというか・・・
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じゃないけどね)

あとは ぐぐって
0183デフォルトの名無しさん2015/12/29(火) 10:58:22.65ID:u34Ypxab
プロシージャ名/関数名はすべてラクダ型の文字列にしたいのですが
その夢がかなわない単語1つのときはどうしたらいいですか?

[通常]
createSheet
fillData

[問題]
initialize
0184デフォルトの名無しさん2015/12/29(火) 11:42:28.29ID:WJw28H2b
>>183
単語2つ目をひねり出すか…
そのままでも問題なさそうだけど
0185デフォルトの名無しさん2015/12/29(火) 15:31:29.70ID:fz57zrCL
>>183
ふと思ったんだけど
[通常] の方は "どうする"+"何を" になってるけど
[問題] の方は "どうする" だけなんよね

だったらこっちも "どうする" + "何を"にすればよくね?
initializeData
initializeCell
とかとか

こう出来ない理由とかあるの?
0186デフォルトの名無しさん2015/12/30(水) 14:22:33.58ID:WC2i3iyl
For each構文でループを回すとき、
一番最初のループだけ特別なコードを1行書きたいのですが
その判別はどうします?

ノーマルなFor i=1 to構文では、If i=1 Thenと単純ですが。
0187デフォルトの名無しさん2015/12/30(水) 14:34:26.62ID:PBmz2gbU
foldl1を使う。
0188デフォルトの名無しさん2015/12/30(水) 14:43:38.04ID:JPIixvGP
扱う物によって色々やり方があるだろ。
だいたい同一処理を分かりやすくする為にEachがあるのであって、違う処理するならEachに含めちゃダメだろ。
0189デフォルトの名無しさん2015/12/30(水) 15:23:36.66ID:yH9ydeBO
>>186
forでやらない理由は?
0190デフォルトの名無しさん2015/12/30(水) 15:37:44.87ID:WC2i3iyl
>>187
なにそれ?
>>188
For eachがわかりやすいので可能な限り絶対この構文を使っています(For i=1は古い)。
でもそんなときでも最初のループだけ実行したいステートメントがあるというのはVBAの経験の浅い人じゃなければよくあると思うのですが。
>>189
Forでやると言ってるのですが
0191デフォルトの名無しさん2015/12/30(水) 15:42:53.87ID:WC2i3iyl
オブジェクト変数で
Set objTest = Nothing
という解放処理をするべきかどうかの議論がときどきありますが、
そもそもメモリ使用に関してこのSet objTest = Nothingはなにをやっているのでしょうか?
これがはっきり分かっていないままで議論しても意味がないと思うのですが。

基本的にオブジェクト変数の場合でもプロシージャ内の変数はプロシージャを抜けると役目を終えたということで消えますが
その参照先であるオブジェクトの実体はメモリに残ったままですよね?
Javaのガベージコレクションの機能があるという話はこのVBAで聞いたことが無いので
もしその実体をSet objTest = Nothingで消せるということなら
いかなるオブジェクト変数を使ったあとは必ずSet objTest = Nothingを書くべき、というのが(もし上の仮定が正しい場合)わたしの見解なのですが。
01921832015/12/30(水) 15:47:44.59ID:WC2i3iyl
わたしは183でもありました。

>>184

>>185
それはinitializeという英単語が引数を2つとる動詞、つまり1つ目の引数は「実行する主体」、2つ目の引数が「初期化される物」でうまくいきますが
例えば引数を1つしか取らない英単語、例えばrunだとかdieだとかappearの場合どうしたらいいのですか?
0193デフォルトの名無しさん2015/12/30(水) 15:50:40.47ID:WC2i3iyl
>>184
initializeの場合は、うんこをひねり出すかのごとく
initiializeDataやinitializeCellのようにDataやCellをひねり出すことができましたが
先にも書いたrunやdieやappearなどのときはどうしますか?
01941852015/12/30(水) 16:18:23.99ID:0l8puLjU
>>192
全部英文で考えれば "何を"の君のゆう所の 実行主体 が付けれると思うが
・・・をrun   何を実行?(runProcess)
・・・をdie   何を殺す(が死ぬ)? (dieProcess)
・・・をappear  何が出る?(appearBigin)


※英単語の訳等の間違いはスルーして下さいね

これ以上 君に付き合うつもりは無いので あしからず(年末なんで)
0195デフォルトの名無しさん2015/12/30(水) 16:27:23.62ID:Y9esFwyM
>>186
FirstTime とかのフラグかな
0196デフォルトの名無しさん2015/12/30(水) 18:39:36.91ID:PBmz2gbU
>>190
For i = 1 は古いって言われても、
m(i) = m1(i) + m2(i)
をどう実装するんですか?
0197デフォルトの名無しさん2015/12/30(水) 18:58:26.89ID:JPIixvGP
>>190
別の処理を施したいなら、別のForEach文なり、Do文なりを利用すべき。
そもそもForEachはオブジェクト型を扱わない場合は処理が重いので必要が無い限り極力使わない方がいい。

別の処理なら別のループとして分けられるはず。変なこだわりを持っているせいでややこしい事になっているだけ。
0198デフォルトの名無しさん2015/12/30(水) 19:05:08.95ID:yH9ydeBO
パフォーマンス的にはfor>foreachなんだけどね。あと、flag使うとかやりようはいくらでもある。少し捻りが足りないんじゃないかな
0199デフォルトの名無しさん2015/12/30(水) 20:02:26.27ID:bRclVw7x
他言語だと、For Each的なループであっても
何回目の処理かをループ内で知ることの出来る機能を持ったものがある
VBAは残念ながらそれがないから、自分でカウンタ変数を用意するか
一個目のデータに特有の項目があるならそれを判定するか、だろうね
0200デフォルトの名無しさん2015/12/30(水) 22:00:46.01ID:yDP/mW46
>>186

最初の時だけ何らかの値を計算してとっておくということであれば
Dim val As Variant として、ループの中で
If IsEmpty(val) Then val = ...
とやればいい。
余計なフラグなしにできるl。
0201デフォルトの名無しさん2015/12/30(水) 23:44:51.92ID:RDoNJfse
Application.OnTime TimeSerial(Hour(Now()) + 1, 0, 0), "更新"



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


以前教えてもらった1時間毎にマクロを起動するコードですが
23時になると狂って連続で"更新"マクロを繰り返してしまいます
23時から0時へは跨げないということでしょうか? 対策をお願いします
0202デフォルトの名無しさん2015/12/31(木) 00:00:57.74ID:yJLj8/Bn
>>201
対策をお願いします(キリッ

上から目線だなオイ
0203デフォルトの名無しさん2015/12/31(木) 00:47:01.17ID:2YFGdsnl
>>186
Dim user_list As Collection
Dim user As Collection
Set user_list = New Collection
Set user = New Collection
user.Add Key:="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
0204デフォルトの名無しさん2015/12/31(木) 06:18:32.30ID:EUZydMuq
>>201
Hourは、0〜23を返す。最後には、
23 + 1 = 24

これで値を見てみれば?
Debug.Print TimeSerial(24, 0, 0)
02051912015/12/31(木) 08:06:51.15ID:D5b/7JR8
みなさん不正解。がんばった人もいるけど残念!
答は、For eachループに入る直前にその1回目の書きたかったコードを書けばいいだけでした。
0206186 (=191)2015/12/31(木) 08:07:43.82ID:D5b/7JR8
上は>>186でした。
0207デフォルトの名無しさん2015/12/31(木) 08:13:13.18ID:xcpAmXWK
>>205
ひとつ目の値を使うんじゃないのか?それをどうやって取得するんだよ?
0208デフォルトの名無しさん2015/12/31(木) 09:43:58.89ID:18DEmBMj
残念も何もそう指摘されてるだろうに。
もしかして「僕はVBAにとても詳しいんだ」ってプライドを崩されてへそ曲げたのか。
0209デフォルトの名無しさん2015/12/31(木) 11:11:22.46ID:xcpAmXWK
パフォーマンスに関しては他の人も言ってるけど、
For Each z in M 構文での z と、For i = 0 To 〜 での M(i) の違いとして、
z はM(i)のコピーでしかないという点がある。(Mが配列の場合)
M がジャグ配列で要素が再び大きな配列だったりしたら重い処理になりえるな。
それに、コピーだから z に何か代入しても M には反映されない。
For i = 1は古い、なんて決めつけてると(以下略
0210デフォルトの名無しさん2015/12/31(木) 12:11:06.57ID:3FCNx6UT
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

テキストボックスを順にチェックしていきたかったのですが
なにか記述方法が間違っているのでしょうか?
ご指導のほど、よろしくお願いたします。
0211デフォルトの名無しさん2015/12/31(木) 12:21:48.92ID:e/tEw3yP
>>208
もうその通りだろうね。稚拙すぎて笑える
0212デフォルトの名無しさん2015/12/31(木) 14:10:55.55ID:KhBichDl
>>210
こんなかんじで指定するんじゃなかったっけ
Controls("TextBox" & i).Value
0213デフォルトの名無しさん2015/12/31(木) 15:23:07.54ID:18DEmBMj
>>210
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使って判定すれば特定のものだけ除外できるし。
02142102015/12/31(木) 17:47:16.72ID:3FCNx6UT
いろいろ試したのですが、やはりテキストボックスの表記の問題のようです。
順番にチェックしていく関係でこのような記述をしました。
最初にテキストボックスの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

の記述をしたのですが・・・テキストボックスの記述方法がダメなのでしょうか?
0215デフォルトの名無しさん2015/12/31(木) 18:21:50.17ID:xcpAmXWK
ActiveSheet.OLEObjects("TextBox" & 1).Object.Value
のように指定すればいいみたいだけど?
0216デフォルトの名無しさん2016/01/01(金) 08:16:43.96ID:sVrrx3Fu
On Error Resume Nextってそれを実行した行のあとも
プログラムが終了するまでずっと有効ですか?
ある区間だけ有効にしたい、あるいはずっと有効しておきたい、のように使い分けたいこともこれから出てくると思うのです。
0217デフォルトの名無しさん2016/01/01(金) 08:18:12.65ID:sVrrx3Fu
Application.DisplayAlerts = Falseも、(以下同文)
0218デフォルトの名無しさん2016/01/01(金) 09:06:31.31ID:HVUfaNaT
>>216-217
あけおめ

On Error はプロシージャ内のみ有効
Application.DisplayAlertsは Excel終了するまで継続のハズ

ちなみに
On Error Resume Next
は短い範囲でかつどうしても実行時エラーの可能性が排除できない
時のみ使う方が良いとおもうよ
ステートメント毎に Errオブジェクトを見てればいいけど
不具合発生してもスルーされるからどこでどんなエラーが発生したか分らなくなる
せめて
On Error Goto ラベル
でトラップ処理するなら別だけど
0219デフォルトの名無しさん2016/01/01(金) 10:06:58.64ID:sVrrx3Fu
>>218
どもあり、ことよろ。

そうなんですか、スッキリしました。これでこれから使い分けができそうです。
0220デフォルトの名無しさん2016/01/01(金) 10:17:22.33ID:NO+H6ZMg
>>216
> ある区間だけ有効にしたい、あるいはずっと有効しておきたい
On Error Goto 0
0221デフォルトの名無しさん2016/01/01(金) 19:56:00.98ID:xpOY3CWT
手元にExcelがないから試せないけど、確かOn Errorは呼び出し先の関数内でも有効になるんだよね
個人的にはErr.Raiseをthrowのように使いたいんだけどね
0222デフォルトの名無しさん2016/01/01(金) 20:52:55.76ID:sVrrx3Fu
>>220-221
なるへそありがとう。
0223デフォルトの名無しさん2016/01/01(金) 20:55:39.83ID:sVrrx3Fu
自分で作った列挙型(Enum)ってその全体のマクロでどこででも参照して利用できるようにするには
どこに書けばいいとか注意点はありますか?
自分で作ったクラスの中ででもその列挙型定数は使いたいです。
0224デフォルトの名無しさん2016/01/01(金) 21:04:54.88ID:+cD+YD5u
イミディエイトウィンドウに出力された内容を取得する方法ってありませんでしょうか
0225デフォルトの名無しさん2016/01/01(金) 23:06:06.65ID:+cD+YD5u
あとマクロ開始時にイミディエイトウィンドウをクリアする記述ってありますでしょうか
0226デフォルトの名無しさん2016/01/02(土) 01:20:56.54ID:jWkoNf5r
>>223
>自分で作ったクラスの中ででもその列挙型定数は使いたいです。
やめたほうがいいです。
ライブラリとして再利用する為なんじゃないの?
むしろ、そのクラスで使うならそのクラスに実装すべきで、他でも使いたいなら
公開すればいいだけ。
クラス以外で実装した列挙型をクラス内で使いたい場合は、クラスの中で再定義
するか、橋渡しするようなプロシージャを用意する必要があるかな。
めんどくさいけどね。
>>224
コピペしかないと思うけど、
そもそもイミディエイトに出力ってDebug.Print使ってるって
ことなんだろうけど、そろそろテキストファイルに出力する方法も
覚えたらどう?
0227デフォルトの名無しさん2016/01/02(土) 09:24:31.29ID:Dnf2flaM
イミディエイトをシェルとして使って作業の大部分を完結させている自分としては、イミディエイト内での
「もとに戻す」と「繰り返し」をショートカットでできるようにしてほしい。
ついでに「繰り返し」はctrl + yに統一してくれ。
0228デフォルトの名無しさん2016/01/02(土) 09:44:03.17ID:Nffz1P8X
文字列をためこんどいて
マクロ終了直前にメモ帳を起動してその文字列をそこに入力させておくためのコードは
どう書けばいいですか?
0229デフォルトの名無しさん2016/01/02(土) 09:51:29.48ID:sxcdtv6m
>>228
素直にテキストに落としてみては?
0230デフォルトの名無しさん2016/01/02(土) 09:58:15.99ID:vN/+lOC5
>>223
確かクラスでパブリックな列挙体を指定すると、クラス.列挙体.列挙値の記述が出来ないはず。
そもそも列挙体はそのクラスから生成したインスタンスで挙動が変わるものでないので、クラスに記述すること自体が微妙。
VBAは.Netと違ってSheardがないので、標準モジュールに記述して使うのが変な挙動をしなくていいと思う。

VBAでクラスを使おうとすると、まだ考え方が確立され切れていないときの状態を引きずった言語だから使い方に戸惑うことが多いよね。

ユーザー定義型なんてもっと顕著にそう言うことが起こるよ。
0231デフォルトの名無しさん2016/01/02(土) 21:54:01.64ID:MhjWcLlU
ライブラリ作ってるけどユーザー定義クラス(型)は全然使ってない。
どういう使いどころあるかな?
0232デフォルトの名無しさん2016/01/04(月) 06:20:47.61ID:D+zYtfMV
vbsと相互に使うからわざわざ定義型なんて使ってないなあ
まとめて管理するとかもVariantの配列に突っ込めばいいし
もうちょと互換性があれば使ったかもしれないけど
0233デフォルトの名無しさん2016/01/05(火) 00:10:29.99ID:USCQ6V11
ユーザフォームをActiveにしたときにコードを書きたいのですが
Activeってどうやって判断しますか?

UserForm_Click()だとボタンをクリックしたときにはそれが発動されないし。
0234デフォルトの名無しさん2016/01/05(火) 02:05:35.42ID:Kvov8i6k
どう?
0235デフォルトの名無しさん2016/01/05(火) 02:25:02.47ID:Kvov8i6k
ユーザーフォームを使った場合、
コードはそのフォームモジュールだけにに書いて
標準モジュールは作りさえしないというやり方で良いでしょうか?
いまのところ標準モジュールを作る意図が見いだせないのですが。
0236デフォルトの名無しさん2016/01/05(火) 02:34:32.38ID:LNU3ZziC
そんな事 人に聞かなくても
作らなくても 動作上問題ないなら 作らんでいいんじゃね?
0237デフォルトの名無しさん2016/01/05(火) 03:15:29.83ID:mStzs5Tn
>>233
普通はそのまんまのActivateイベント使うんじゃないかね

>>235
じゃあそれでいいんじゃない
0238デフォルトの名無しさん2016/01/05(火) 03:22:29.47ID:cUCC3uaz
>>237
2013だとイベント拾えないなActivateイベント
フォームロード時には発生するんだが…
02392332016/01/05(火) 03:30:01.47ID:Kvov8i6k
>>237
そのActivateがくせもので
フォームが複数あったときにそのフォームがActivateになったときはそのイベントをひろうけど
フォームが1つだとmodelessで開いたとき普通のExcelワークシートからそのフォームにActiveが移動しても
Acticateに書いたコードは実行してくれず無反応なんですよ。
0240デフォルトの名無しさん2016/01/05(火) 12:34:15.92ID:Kvov8i6k
Javaに慣れてると
他のSub(例えば名前をAdditionの2つの引数を取るとします)を呼ぶときに
Addition(5 , 8)
が構文エラーとなるのが気持ち悪くてしかたがありません。

正しくは
Addition 5 , 8
Call Addition(5 , 8)
のいずれかにしなければなりません。

でもどうにかしてJavaのように
Addition(5 , 8)
のようにできる方法はありませんかね?
0241デフォルトの名無しさん2016/01/05(火) 12:36:58.68ID:LntnFA7d
>>240
無理だと思う。
Functionにはしたくないんだよね?
0242デフォルトの名無しさん2016/01/05(火) 12:41:34.28ID:Kvov8i6k
>>241
Functionにしてもいいですよ。
でも同様にできなそうです。
0243デフォルトの名無しさん2016/01/05(火) 12:45:32.43ID:33a1opJu
プログラマーとは多様性を受け入れるものだ
0244デフォルトの名無しさん2016/01/05(火) 12:51:11.49ID:Kvov8i6k
受け入れたら負けだと思っている。
0245デフォルトの名無しさん2016/01/05(火) 13:01:18.99ID:LntnFA7d
>>242
ああ、戻り値を捨てるってことか。それも無理だと思う。

Functionにして繋げてしまえば?
result = Func1(Func2(Func3(...Addition(5, 8))))
どこにも副作用がなく、無駄な戻り値も無いようにすればいい。
0246デフォルトの名無しさん2016/01/05(火) 13:02:44.78ID:LntnFA7d
>>242
Javaを捨てて関数型に移行するのだ。VBAならそれができる。
0247デフォルトの名無しさん2016/01/05(火) 13:16:48.58ID:YLBFKxeK
>>240
気持ち悪いのは君の勝手
言語には言語の流儀がある。それが嫌ならやらなきゃいいだけ。逆に、JavaでVBAっぽく
やりたいとかアホ抜かせって話。

そして、普通みなそういう言語毎に流儀は慣れる。気持ち悪いなんて言ってるような奴は
プログラマーとしては三流。
0248デフォルトの名無しさん2016/01/05(火) 13:56:27.25ID:LntnFA7d
Subの呼び出し方がFunctionと違うことのメリットがなにかひとつあったような気がするんだが、忘れてしまった。

>>247ってプログラマなの?
0249デフォルトの名無しさん2016/01/05(火) 16:31:17.21ID:mlWeSkma
>>248
非常にレアなケースでしかメリットが出てこないが、消費するヒープがSubの方が少ないから再帰の回数が多くできる
厳密には戻り値の変数エリアを初期化する手間がなくなるので実行速度も誤差程度には速い、はず
0250デフォルトの名無しさん2016/01/05(火) 19:25:18.04ID:LntnFA7d
>>249
なるほど

s/ヒープ/スタック/
だよね?
0251デフォルトの名無しさん2016/01/05(火) 20:12:50.80ID:KIPOXvA0
>>240
・プリプロセッサを作って変換する
・MSに入社してVBAの言語仕様書を書き換える
・MSを買い取ってVBJをサボートさせる
・…

ただ、こう言う本質的でないところに突っかかる奴はたいてい適性がないので、素直にマをやめた方が本人も周りも幸せになれる
0252デフォルトの名無しさん2016/01/06(水) 03:05:54.21ID:IHMGmJSj
たぶんだけど「いやぁ、おれJava使えるんすよぉ。皆さんは出来ないでしょ?」的な自慢なんじゃないの。
プログラムの覚え始めってインプリンティングみたいな愛着が湧くから、そんな時期なんでしょ。
0253デフォルトの名無しさん2016/01/06(水) 06:08:03.77ID:wTjSz+NM
>>252
逆を言えばそれしか出来ないんでしょ?wwwこんな程度で気持ち悪いとか吐いてる程度だから、Java自体のレベルも知れてる。
0254デフォルトの名無しさん2016/01/06(水) 09:24:36.49ID:qs2eqDcn
あけましておめでとうございます

Excel VBA(windows7 Excel2010 VBA7,0)で パソコンがミュート状態かどうかを
判定したいのですが・・・

ミュート状態だと if 〜 Else で処理(ミュート解除)させようと思っていますが
ミュートかどうかを判定する方法がわかりません

みなさんのお力をお借りしたく書き込みさせて
頂きました。

よろしくお願いします 22歳OL
0255デフォルトの名無しさん2016/01/06(水) 10:01:38.51ID:nVjV76XE
>>254
mixerGetControlDetailsを使う
0256デフォルトの名無しさん2016/01/06(水) 10:04:22.66ID:/XlzX9bH
>>254
MMDevice API とかでぐぐってみる
0257デフォルトの名無しさん2016/01/06(水) 10:36:47.15ID:qs2eqDcn
>>255
>>256
早速の返信ありがとうございます
質問する前にgoogle先生に質問して
mixerGetControlDetails や
API などを使うと出来そうな感じの事が書いてあったのですが・・・

最近VBAを独学で勉強しだした私には難しくどうしたらいいか
よくわからず・・・ここで質問させていただきました
また、お時間ある時でいいのでアドバイスお願いします

まだどうしtらいいかわからないです
22歳OL
0258デフォルトの名無しさん2016/01/06(水) 10:49:05.08ID:f2GjMEVM
>>257
最後の1行 なんかバカにされてる気がするぞ
0259デフォルトの名無しさん2016/01/06(水) 11:47:08.51ID:/XlzX9bH
久しく制服を着たOLというものを見掛けなくなったな
0260デフォルトの名無しさん2016/01/06(水) 11:48:38.02ID:/XlzX9bH
>>257
独学はよくない。
明日からavivaに行きなさい。
0261デフォルトの名無しさん2016/01/06(水) 11:51:57.78ID:nVjV76XE
>>257
だったらこれからも独学でやれや
俺はグーグル先生みたいに甘くねーぞ
0262デフォルトの名無しさん2016/01/06(水) 11:57:47.28ID:9dwHBHIu
>>257
喧嘩売ってんの?
0263デフォルトの名無しさん2016/01/06(水) 12:48:37.88ID:uGhm1id+
ExcelVBAをオリジナルのExcelのない環境で実行することって不可能かな?
0264デフォルトの名無しさん2016/01/06(水) 12:54:07.42ID:IHMGmJSj
>>263
オートメーションと呼ばれる手法で、たとえばAccessでCreateObject("Excel.Application")して、
そこで得られたエクセルオブジェクトを利用するっていうんじゃなきゃ不可能じゃないの。

あとはVBSにでもするしか。
0265デフォルトの名無しさん2016/01/06(水) 13:12:52.54ID:YDWhVPVu
>>257
まずは誠意を見せたまえ。
おっ○いうp
0266デフォルトの名無しさん2016/01/06(水) 16:16:54.72ID:uGhm1id+
>>264
やはり普通には使えないようですね、残念
ブラウザ上で動くサーバーサイドExcelみたいなのがあれば便利だったのですが
0267デフォルトの名無しさん2016/01/06(水) 16:26:44.21ID:uGhm1id+
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で渡すのが当然とか?
0268デフォルトの名無しさん2016/01/06(水) 16:47:03.10ID:9dwHBHIu
>>266
Google Spreadsheetでも使って下さい。
0269デフォルトの名無しさん2016/01/06(水) 18:33:10.74ID:jZfE0I4k
>>267
Reset list(1).Item(1), "key", 456
とかなら呼び出せるっぽい

デフォルトプロパティの評価あたりでおかしな事になってるのかもしれん
実はItemは真のデフォルトプロパティじゃないし
0270デフォルトの名無しさん2016/01/06(水) 20:01:54.35ID:uGhm1id+
>>269
そういう方法がありましたか
ありがとう
0271初心者A2016/01/06(水) 20:04:38.71ID:tBMwYmRt
初歩的な質問で、すいません。配列とかFor〜Nextのとこなんですが、
うまくいかなくて、悩んでます。

■■■■質問
'SH2のE列に、次のように出力するためには、どのようにコードしたら
いいか教えてもらえませんでしょうか?
0272初心者A2016/01/06(水) 20:05:11.36ID:tBMwYmRt
-----
2
3
4
5
-----
1
3
4
5
-----
1
2
4
5
-----
1
2
3
5
-----
1
2
3
4
-----
0273初心者A2016/01/06(水) 20:06:39.51ID:tBMwYmRt
■■■■前置き(その1)
No(1)=1
No(2)=2
No(3)=3
No(4)=4
No(5)=5
の配列を、違うシート(シート名:sheet2name)に出力したい。

動的配列ですが、NUM1=5として考えやすくしてみました。

計算結果を出力するシートを、
Set SH2 = Worksheets(sheet2name)とする。
0274初心者A2016/01/06(水) 20:07:07.71ID:tBMwYmRt
■■■■前置き(その2)
1
1
1
1
-----
2
2
2
2
-----
3
3
3
3
-----
4
4
4
4
-----
5
5
5
5
-----
0275初心者A2016/01/06(水) 20:07:24.26ID:tBMwYmRt
■■■■前置き(その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
--------------------------------------------------
0276デフォルトの名無しさん2016/01/06(水) 20:30:41.31ID:5UG3hvjQ
動的配列のLBoundの値を変更するのにRedim Preserveを2回使うテクニックがあるけど、
真っ当な技と言えるんでしょうか?
0277デフォルトの名無しさん2016/01/06(水) 20:37:10.97ID:cINiOzEy
>>271
質問がとっちらかっててよくわからん
とりあえず>>272のコード

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
0278デフォルトの名無しさん2016/01/06(水) 20:38:10.90ID:cINiOzEy
For j = 1 To 5

For j = 1 To num
の間違い
0279初心者A2016/01/06(水) 21:15:55.49ID:tBMwYmRt
>277
やってみます。ありがとうございます。


http://ww10.puny.jp/uploader/download/1452081929.xls


パスワード:abc

Module1で試行錯誤中です。

SH2(シート名:計算結果)の【F列】
SH2.Cells(u + 2, 6).Value=
にデータ出力したいです。

初心者なんで難しいです(>_<)
時間かかりそうです。
0280初心者A2016/01/06(水) 21:30:56.38ID:tBMwYmRt
おかげさまで、できました(^^)/ありがとうございます
下記のコード

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
0281デフォルトの名無しさん2016/01/07(木) 00:21:58.78ID:GoyK1MG8
>>277みたいにシートをActivateやSelectして
Cellsの親を省略するみたいな書き方って気持ち悪いと思いませんか
扱うシートが増えたりしたらどうするんですか
0282デフォルトの名無しさん2016/01/07(木) 01:36:13.89ID:w0ujcVRl
シートが増えれば大変なのはどちらも同じ
好きな方を使えばよい
0283デフォルトの名無しさん2016/01/07(木) 08:35:20.93ID:bWvRU875
サンプルの書き方は本当の書き方と多少違うだろう。
0284デフォルトの名無しさん2016/01/07(木) 09:09:34.45ID:QNCWlpNp
>>282
どちらでもよくない。
処理中にシートが切り替わると副作用があるので、必ずsheet1.cellのように指定する。

個人で作って使うなら何してもいいが、人に渡す時はそんな舐めたことすんじゃねーぞ
0285デフォルトの名無しさん2016/01/07(木) 09:29:17.60ID:bWvRU875
>>284
人に渡すってどういう意味?
0286初心者A2016/01/07(木) 12:18:16.88ID:pq62efvo
■やりたいこと
下記のURL先のエクセルファイル
(ファイル名:2点間距離の差011)の
計算結果シートにて、
●D値が多い順の表を完成させたい。
●D値の合計が大きい順の表を完成させたい。

どうコーディングすればいいか、アドバイス
頂けると幸いですm(_ _)mぺこり

http://ww10.puny.jp/uploader/download/1452136421.xls
パスワード;abc
0287初心者A2016/01/07(木) 12:19:39.64ID:pq62efvo
2つの座標系を用いて、
点間距離の差を計算結果シートのO列に表示しています。

座標入力シートのG2セルにて、
点間距離の差がある値より大きいものをD値としています。
計算結果シートのO列で、そのD値より大きい値を赤くしています。
-----------------------------------------------------------
例えば、
点名A1 点名B1では、D値が多い順の個数は、
2個です(赤くなっている文字が2つ)

例えば、
点名A1 点名B1では、D値の合計が大きい順の合計(mm)は、
51.5です。
0288デフォルトの名無しさん2016/01/07(木) 17:52:38.68ID:2nH+0Iqy
単純に考えて
a1-b1
a2-b2
a3-b3
の表完成させて並び変えたら
0289初心者A2016/01/07(木) 18:17:44.40ID:pq62efvo
>>288 たしかに、並び替えは後ですね。
ここまで、できました。

現状で満足してますが
できれば、VBAを用いて、ソートしたい。

http://ww10.puny.jp/uploader/download/1452157302.xls
パスワード:abc

上記URL先のエクセルファイル(2点間距離の差016.xls)
の計算結果シートにおいて、
(表:D値の個数)個数をキー(多い順)として、ソートしたい。
(表:D値の合計)合計をキー(大きい順)としてソートしたい。

■これ勉強しなきゃいけないんかな?
VBAでクイックソート
http://howto-it.com/excelvbaqsort.html
http://excel-ubara.com/excelvba5/EXCELVBA229.html
0290初心者A2016/01/07(木) 18:24:25.57ID:pq62efvo
エクセルの標準機能で、いっかな(´・ω・`)

ホーム→
→並び替えとフィルター
→ユーザー設定の並べ替え
→列にて、優先されるキーで、個数または合計を選択
→順序で降順
→OKボタン
0291デフォルトの名無しさん2016/01/07(木) 18:33:25.91ID:2nH+0Iqy
並び替えする前に新しいマクロの記録コマンド
並び替え終わったら終了コマンド
すると操作が記録されたVBAプロシージャが取得できる
0292デフォルトの名無しさん2016/01/07(木) 19:09:08.14ID:v5mg4Nrt
OFFICE次バージョンからVBAが廃止されるかもとネットで見た。ウチの会社オワタ
0293デフォルトの名無しさん2016/01/07(木) 19:11:08.03ID:bWvRU875
>>292
どこのソース?
一般企業での利用者の存在数から考えて無理だと思う。
0294デフォルトの名無しさん2016/01/07(木) 19:37:43.86ID:2nH+0Iqy
というか基本的にOFFICEのバージョンアップは不要
しかしエクセルでマイナンバーとか管理されたら
それに近いところでVBAが動いてたらまずいでしょ
だから時代についていくためにVBAを切り捨てる必要がある
0295デフォルトの名無しさん2016/01/07(木) 19:47:50.85ID:bWvRU875
そんな日本だけの事情でマイクロソフトが動くのか?
0296初心者A2016/01/07(木) 19:54:26.63ID:pq62efvo
エクセル2007以降のバージョンなら、どのバージョンでもいい。
0297初心者A2016/01/07(木) 19:57:16.31ID:pq62efvo
>>291

そうでした。マクロの記録がありましたね。
やってみます。2行〜最終行を選択ればいいのかな?
0298デフォルトの名無しさん2016/01/07(木) 19:58:23.02ID:2nH+0Iqy
>>295
サポートじゃなくてセールス文句だから
ネットにつないでも安全なエクセルって感じかな
0299初心者A2016/01/07(木) 23:46:18.98ID:pq62efvo
Const sheet2name =
0300初心者A2016/01/07(木) 23:47:38.29ID:pq62efvo
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
0301初心者A2016/01/07(木) 23:49:14.75ID:pq62efvo
並べ替えって基本的にこれだけなんだ(´・ω・`)ほ〜

SH2.Sort.SortFields.Clear
Range(SH2.Cells(2, 18), SH2.Cells(NUM4 + 2, 21)) _
.Sort Key1:=SH2.Cells(3, 21), order1:=xlDescending, Header:=xlYes
0302デフォルトの名無しさん2016/01/08(金) 00:32:14.62ID:AwkBQm6q
シート上のソートはどこかにキー列がないと機能しないのがちょっと不便だけど、
簡単ではある。
0303デフォルトの名無しさん2016/01/08(金) 06:38:04.99ID:ZpBAcVz8
VBAの求人117件の平均最低月給224,500円
http://jobinjapan.jp/job-listing/keyword-vba.html
0304デフォルトの名無しさん2016/01/08(金) 15:12:20.20ID:9Hdlf+du
>>276
そのテクニックというもの自体知らないので、
よろしかったらもっと詳しく教えてください
0305デフォルトの名無しさん2016/01/08(金) 16:51:24.45ID:VkXSxnl8
>>304
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の値は確かに変わるし、巨大な配列でも一瞬で終わる。
これが仕様的に正しいと言えるのか不明。ループでやると仕様的な不安はないけど時間は掛かる。
0306デフォルトの名無しさん2016/01/08(金) 18:00:56.80ID:1fL2vwQ7
> ReDim Preserve v(1 to 3)
これ一回じゃあかんのか
0307デフォルトの名無しさん2016/01/08(金) 18:07:13.41ID:VkXSxnl8
>>306
なぜかダメ。
長さが変わらないからやる意味なしと判断されるのか...は不明。
0308デフォルトの名無しさん2016/01/08(金) 18:20:31.18ID:u+GM9q1y
>>305
意味がよくわからない。

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
0309デフォルトの名無しさん2016/01/08(金) 18:37:10.31ID:VkXSxnl8
>>308
えー?
下のfoo は自分の環境では
0 To 2
0 To 2
と出るんだけど?

Office 2010 Excel 14.0.7163.500(64bit)
Visual Basic for Applications 7.0
0310デフォルトの名無しさん2016/01/08(金) 18:45:54.37ID:ujpdqUME
>>305
ヘルプ(2007)には
>キーワード Preserve を使用した場合、動的配列のサイズを変更するために変えられるのは、添字の上限だけです。添字の下限を変更しようとすると、エラーが発生します。
って書いてあるな

>これが仕様的に正しいと言えるのか
やってみたが2007では出来てるみたいだが、ヘルプには出来ないと書いてあるのだから
仕様的に正しいとは言えないと思うが

過去のバージョンではホントにエラー出てたような気もするんだが
いつの間にかこっそり拡張されたのかねぇ
0311デフォルトの名無しさん2016/01/08(金) 18:53:30.77ID:ujpdqUME
>>309
2007の32ビットなら、>>305>>308も出来るっぽい

下限を変えたときに、要素がずれるのか下限側の要素が切り捨てられる(または
初期化された要素が追加される)のかは確認してない

この辺も明示されていないから、ReDimで下限変えるのは
環境依存で危険な方法だと思った方が良いんじゃない
0312デフォルトの名無しさん2016/01/08(金) 18:55:30.64ID:VkXSxnl8
レスくれた皆さんありがとう。
これを使ってLBoundを変更する機能、急にいらなくなりました。
なんでこんな質問をしたかというと、ワークシートから取得した配列(Range(範囲).Valueで取れるやつ)のLBoundを手っ取り早く0にしたかったからです。
だけどその場合は2次元配列となり、1次元目のReDim Preserveはどうやってもダメだと気づきました。
どうもすいません。
0313デフォルトの名無しさん2016/01/08(金) 18:58:01.58ID:1fL2vwQ7
>>310
検索するとこんなのがあったけど
a)キーワード Preserve を指定した場合、変更できるのは、動的配列の最後の次元のサイズに限られます。
また、次元数は変更できません。

b)つまり、キーワード Preserve を使用した場合、動的配列のサイズを変更するために変えられるのは、添字の上限だけです。
添字の下限を変更しようとすると、エラーが発生します。

つまりだからbはaの2以上の次元配列の話

v(3,5)
の3は変えられなくて5は変えられる
添え字の上限とは5(数値じゃなく一番右にあるって意味)のこと
0314デフォルトの名無しさん2016/01/08(金) 19:09:45.61ID:ujpdqUME
>>313
もし2次元以上の配列に限る話だったとしても、その意味は
(3, 1 To 5)を(3, 0 To 5)に出来ませんって事
次元と添字の上限下限は別の話。上限下限は次元ごとに存在んするんだよ
0315デフォルトの名無しさん2016/01/08(金) 23:46:16.59ID:EVmIpiZQ
>>292
アホな
0316デフォルトの名無しさん2016/01/09(土) 09:51:48.56ID:eE0tOkYT
アホな話かも知れないけど無くなるかも知れないってよ
Excelの自動操作をしたければ外部からやれってことらしいね
ついでにワードみたいに1アプリケーション1ブックしか開けなくなるかもってよ
0317デフォルトの名無しさん2016/01/09(土) 10:03:01.20ID:ba2w/O62
ワードはマルチドキュメントじゃなくなっただけだろう。
アプリケーションで複数のブックを開けなくなるなんて退化はあり得ない。
0318デフォルトの名無しさん2016/01/09(土) 10:31:05.76ID:c5DKVMyA
ないってよ
らしいね
かもってよ
www
0319デフォルトの名無しさん2016/01/09(土) 19:46:58.98ID:DEcEG5aT
ソースもださずにネットで見たとか言う話の信頼性をどうこう言っても
0320デフォルトの名無しさん2016/01/09(土) 20:11:29.37ID:h3R10OzO
グローバル変数や、Public Subの名前を変更したいとき、
それを確実にすべて変更する方法ってありますか?

置換は確実じゃないのでダメです。
例えば、manという変数をmaleに置換しようとしてまちがってwomanという変化をwomaleにしてしまう可能性があるからです。
0321デフォルトの名無しさん2016/01/09(土) 20:19:58.68ID:3Mphd1W9
正規表現
単語で検索
" man "を" male "に変換
3通りの可能性思いつきました
0322デフォルトの名無しさん2016/01/09(土) 20:56:12.50ID:1IbXuGB2
>>321
文字列とかコメントとかまで考えると…
0323デフォルトの名無しさん2016/01/09(土) 22:01:41.40ID:sD5C6F8w
exportしてトークンに分解して全置換してimportし直すマクロを組むとか
VBAのエスケープやコメント処理って比較的楽な気がするし
既にそういうのありそうだけど
0324デフォルトの名無しさん2016/01/09(土) 22:02:50.59ID:h3R10OzO
そのクーポンってなんですか?
割引してくれるの?
0325デフォルトの名無しさん2016/01/09(土) 22:03:52.65ID:h3R10OzO
このExcelにもともとついてる開発エディタにそんな機能はついてないの?
0326デフォルトの名無しさん2016/01/09(土) 22:07:18.41ID:sD5C6F8w
そうVBAソースを字句解析するって意味
自分で書けば100%割引でお得だよ
03273122016/01/09(土) 22:16:44.24ID:CpCNnIMM
配列のLBoundを変更する機能はVBAでやるのはやめて、メモリを直接弄ることにしました。
お騒がせしましたがうまくいったみたいです。
0328デフォルトの名無しさん2016/01/09(土) 22:22:59.10ID:sD5C6F8w
つーかeclipseプラグインとかにVBA用のがあれば何も作らずに済むんじゃないの
探してみなよ
0329デフォルトの名無しさん2016/01/09(土) 22:29:04.87ID:1IbXuGB2
>>323
コメントが「グローバル変数や、Public Subの名前」の説明だったり、文字列を Eval( ) に渡してるとか…
変換しなきゃいいって訳でもなかったりするし
0330デフォルトの名無しさん2016/01/09(土) 22:32:15.76ID:h3R10OzO
eclipseプラグインにVBAはございますか?
なければ探してもしかたがないもんな。
Do Until 見つかる 〜 Loop の無限ループに入ってしまう。
0331デフォルトの名無しさん2016/01/09(土) 22:36:03.89ID:sD5C6F8w
>>329
コメントやEvalがあったら置換した上で警告でも出せばいいんだし
こういう場合どう処理するの?なんて本人にしか判らんこと気にしても仕方ない
0332デフォルトの名無しさん2016/01/09(土) 22:42:38.50ID:enMYG2pF
途中で仕様変更しちゃいけないというのがよく分かるな。
0333デフォルトの名無しさん2016/01/09(土) 22:43:54.04ID:sD5C6F8w
つーか適当なエディタで単語で全置換でいいんじゃないの
それで大きな問題が起きるとは思えないし
0334デフォルトの名無しさん2016/01/10(日) 00:31:35.36ID:hZikTLMs
忘れたけどvbaのプラグインでそういうのできるのあったはず。
てか、vba編集するのにeclipse立ちあげるとかキチガイにもほどがある
0335デフォルトの名無しさん2016/01/10(日) 10:18:26.27ID:MoheO9k0
つWinMerge
0336デフォルトの名無しさん2016/01/10(日) 13:09:04.97ID:2foMUWB4
>>333
> それで大きな問題が起きるとは思えないし
よほど小さなソフトしか組んだことないか、ぬるい仕事しかしたことないんだろうな…
うらやましい
0337デフォルトの名無しさん2016/01/10(日) 13:29:33.20ID:vlDN8AGa
VBAでデカいきついシステム組むのがまちがってるけどな
0338デフォルトの名無しさん2016/01/10(日) 13:34:42.61ID:AcnVMiQc
そもそも仕事の話に持ってくのがおかしいよな
0339デフォルトの名無しさん2016/01/10(日) 15:06:14.04ID:NoYOPUfs
え?おまえらVBA書くのに他のソフトで書いてるの?
普通にExcelで書くよな?背景とか文字色も一応変えられるし

ちなみにおまえらの配色構成どうしてる?俺はこんな感じの配色にしてるんだけど、目疲れに良いおすすめあったら教えて
http://uproda.2ch-library.com/913125j4t/lib913125.jpg
0340デフォルトの名無しさん2016/01/10(日) 15:21:55.12ID:VlwFWjx7
仕事じゃなけりゃVBAなんか使わねぇよ
0341デフォルトの名無しさん2016/01/10(日) 17:00:44.21ID:NoYOPUfs
むしろプライベートでしかVBA使ってない
0342デフォルトの名無しさん2016/01/10(日) 17:51:41.19ID:wKvoM5NG
おれはVBAしか使えない
他言語どころか
Excelのピボットテーブルも入力規則も使ったことが無い
それどころかワークシート関数すら覚束ない
でもVBAだけで給料もらえるから問題なし
0343デフォルトの名無しさん2016/01/10(日) 18:07:03.32ID:W+alusTR
まぁ本人がその給料で満足してるならそれでいいんじゃないだろうか。

幾ら貰ってるかは知らないけど。
0344デフォルトの名無しさん2016/01/10(日) 18:43:22.48ID:KeJgEHCD
プログラマー気取りで変なプログラミング講釈する人うざいです
0345デフォルトの名無しさん2016/01/10(日) 21:31:31.28ID:NoYOPUfs
プログラマー気取りっていうか、VBAをプログラムというと変にファビョる人いるよね
「VBAがプログラムwwあれをプログラムと呼んだら駄目っしょ笑」みたいな人たまにいる
0346デフォルトの名無しさん2016/01/10(日) 22:07:49.93ID:fKRpFEpV
まあVBAは便利だけど子供のおもちゃみたいに思われているからね
マイクロソフトは勿体ないよな
ビジネスに発展させるには素人にスゲーと思わせてナンボなのに、
新卒の研修にちょっくら使わせてみるかみたいなイメージになってしまっている
0347デフォルトの名無しさん2016/01/10(日) 22:08:12.25ID:xRSSZTjv
>>342
Excelは入出力のインタフェースに過ぎないっていう使い方かな?

>>345
一種のコンプレックスのあらわれなんだろうか。
VBAは言語としてダメな点は多いけどね。
0348デフォルトの名無しさん2016/01/10(日) 22:55:42.57ID:agiL7Ile
For Application ってだけあって付属言語だからね
エクセルがあればすごいんです(キリ って感じ?

OS上で直接動く言語から見たら頭ポンポンしたくなるだろ
0349デフォルトの名無しさん2016/01/10(日) 23:08:46.92ID:+vbjBZah
Excelの企業シェアにあぐらをかいてる言語だという認識は間違っていないと思う
0350デフォルトの名無しさん2016/01/10(日) 23:12:22.88ID:+vbjBZah
ExcelはVBAも含めて基本PC1台で使うもの その点を忘れてはいけない
0351デフォルトの名無しさん2016/01/10(日) 23:32:51.77ID:nfQKqPqr
>>350
>>344
0352デフォルトの名無しさん2016/01/11(月) 01:59:22.45ID:AWAF7CGx
目下の疑念はOS上で動くものを「直接」と表現していいのかどうかという事だ
0353デフォルトの名無しさん2016/01/11(月) 07:21:46.06ID:gsKg8O84
VBAのダメ出ししてる人ってIDispatch経由で動かした場合どういう反応になるんだ
出来ること全く変わらんのだが
0354初心者A2016/01/11(月) 08:26:22.84ID:HLjXNd8w
'ワークシートの存在確認、削除、追加をするプログラム
Option Explicit
Const sheet3name = プロット(■前後のダブルクオテーション略!)

Sub Macro1()
Dim ws As Worksheet
Dim chart1 As Worksheet

Application.DisplayAlerts = False
For Each ws In Worksheets
If ws.Name = sheet3name Then
If Worksheets.Count > 1 Then
ws.Delete
Else
GoTo Label1
End If
End If
Next
Application.DisplayAlerts = True

Set chart1 = Worksheets.Add
ActiveSheet.Name = sheet3name

Label1:
End Sub
0355初心者A2016/01/11(月) 08:28:53.39ID:HLjXNd8w
ワークシートの存在確認、削除、追加をするプログラム
を作りました。
http://ww10.puny.jp/uploader/download/1452467710.zip
パスワード:abc

■やりたいこと
ワークシートの存在確認、削除、追加をするプログラムを
グラフシートの存在確認、削除、追加をするプログラムに修正したい。
For〜Nextの部分をどう、修正したらいいか、ご教授お願い致します。

修正前(ワークシート)
Dim ws As Worksheet
Dim chart1 As Worksheet
Set chart1 = Worksheets.Add
ActiveSheet.Name = sheet3name
修正後(グラフシート)
Dim ws As Chart
Dim chart1 As Chart
Set chart1 = Charts.Add
ActiveChart.Name = sheet3name 👀
Rock54: Caution(BBR-MD5:0be15ced7fbdb9fdb4d0ce1929c1b82f)
0356初心者A2016/01/11(月) 10:13:11.60ID:HLjXNd8w
難しく考えすぎました。自己解決しました。

'グラフシートの存在確認、削除、追加をするプログラム
Option Explicit
Const sheet3name = プロット(■前後のダブルクオテーション略!)

Sub Macro1()
Dim ws As Chart
Dim chart1 As Chart

Application.DisplayAlerts = False
For Each ws In Charts
If ws.Name = sheet3name Then
ws.Delete
End If
Next
Application.DisplayAlerts = True

Set chart1 = Charts.Add
ActiveChart.Name = sheet3name
End Sub
0357デフォルトの名無しさん2016/01/11(月) 11:19:37.13ID:eiYfk44d
>>353
素のままのVBAじゃなくて、そういう弄らなきゃいけないところをマイナスポイントにするかどうかで変わってくるな。
むしろプラスポイントと見なす人もいるかも知れんが。
自分は不満点いろいろある。
0358デフォルトの名無しさん2016/01/11(月) 14:09:09.67ID:np4MR6nO
質問お願いいたします。
ノートPCを閉じてスリープ状態になってしまってもvbaプログラムが止まらないようにする方法はありますか。移動や別の仕事で常にPCを開いとくことができません。よろしくお願いします。
0359デフォルトの名無しさん2016/01/11(月) 14:11:54.26ID:6idxIuPk
これってなに?最強の開発環境くるの?
http://blogs.msdn.com/b/ayatokura/archive/2016/01/09/ga.aspx
0360デフォルトの名無しさん2016/01/11(月) 14:32:56.61ID:grtS6L7L
>>359
そんな過去ネタを今更。
ハッキリ言って糞。使いたいとも思わない。
0361デフォルトの名無しさん2016/01/11(月) 14:38:18.74ID:qDZy1U6Z
>>358
スリープって眠るってことだよ
閉じても眠らない設定にしなさい画面だけ消すとか
0362デフォルトの名無しさん2016/01/11(月) 14:49:09.64ID:db4WHs28
エクセル2016からリレーションシップ機能追加ってマジですか?
0363デフォルトの名無しさん2016/01/11(月) 15:21:48.39ID:Fkm8B5dx
>>358
電源オプション→カバーを閉じたときの動作の選択→バッテリー駆動/カバーを閉じた時の動作を「何もしない」に設定すれば
パソコンを閉じてもプログラムは動き続ける
0364デフォルトの名無しさん2016/01/11(月) 15:43:06.72ID:grtS6L7L
>>362
元々、MSQUERYではやれていたが、実に古臭いUIと仕組みだったからねぇ。
どうなることやら。Accessを殺しに来るのかどうかが注目だがね。
0365デフォルトの名無しさん2016/01/11(月) 16:02:56.77ID:Fkm8B5dx
自社製品を殺してどうする
0366デフォルトの名無しさん2016/01/11(月) 16:17:41.70ID:grtS6L7L
>>365
そもそも、前からAccessについてはその存在について、実際に無くすっていう議論は
出てるんだよ。ユーザの間でも有名な話だぞ。2013が出た時はホッとしたがあの直前
当たり、下手するとそろそろAccessはユーザ数も減ってきており、Excelに統合されて
消えるんじゃないかってね。

この手のアプリってAccessしか実質的に存在しないし、Excelよりもとっつきにくいという
こともあってね。既にテーブル機能は実装されているし、ここにクエリーが本格的に実装
となると、Accessのポジションは危うくなる。
0367デフォルトの名無しさん2016/01/11(月) 17:00:49.67ID:d/8QAidv
accessでできることをエクセルでやろうと思わないけど、一般ユーザーは違うのかな
むしろこれからはビッグデータの時代なので、accessは逆に更に改良されていかないのかな
0368デフォルトの名無しさん2016/01/11(月) 17:23:46.95ID:np4MR6nO
>>363>>361
>カバーを閉じた時の動作を「何もしない」に設定
ありがとうございます。
こちらは、プログラムは動きつづけ、バッテリーも若干節約になるという認識でかまいませんでしょうか?
0369デフォルトの名無しさん2016/01/11(月) 19:03:39.63ID:U/eWhfN7
簡易的なデータベースのシートを提供してくれりゃいいのに。

そうすりゃ無駄に空列とか入れるヤツとか排除できる。
0370デフォルトの名無しさん2016/01/11(月) 19:43:34.53ID:Fkm8B5dx
>>368
基本は液晶が消えたままになるだけだから、そんなに節約にはならない
あと機種によっては閉じたまま計算を続けさせると熱暴走するんで、持ち歩くときはケースに入れず通気に注意すること
0371デフォルトの名無しさん2016/01/11(月) 21:16:15.69ID:N366RwDJ
まー、以前は.Net化して欲しいと思ってたけど、今はどうでもいいや。
.Netで使いたければ外部から触ればいいだけの話だからな。

いつまでもこのままって訳にも行かないだろうけど、そもそもモジュールをフォルダ階層化して扱えない
VBAは
クラスとか沢山作って管理するのに向いてない。
0372デフォルトの名無しさん2016/01/11(月) 23:15:43.34ID:JhD6lfDm
>>320
前後のスペースごと置換すればいいんじゃね
0373デフォルトの名無しさん2016/01/11(月) 23:41:08.19ID:6idxIuPk
ちょっと質問です

例えばA1セルとB1セルの値を抜き出し、C1に (A1の値)〜(B1の値) と表示したいときは

Range("C1") = Range("A1").Value & "〜" & Range("B1").Value

となりますよね。
ここでA1とB1の値が必ず小数点第一のくらいで表示したい時はどうすればいいのでしょうか。
例えばA1とB1が下記の値の場合は
A1=40.123
B1=20

上のVBAだとC1には「40.123〜20」と表示されます。これを「40.1〜20.0」と表示するようにしたいんです。
そういう関数ありますか?
0374デフォルトの名無しさん2016/01/12(火) 00:16:04.17ID:w+wRH2JN
Private Sub hoge()

Range("a1").Value = 40.123
Range("b1").Value = 20.1
Range("c1").Value = Range("A1").Value & "〜" & Range("B1").Value

Range("c2").Value = Format(Range("A1").Value, "###.0") & "〜" & Format(Range("B1").Value, "###.0")

End Sub
0375デフォルトの名無しさん2016/01/12(火) 00:28:30.25ID:1Tg2WctI
>>374
おお
なるほど、そうやるんですね。ありがとうー
0376デフォルトの名無しさん2016/01/12(火) 06:54:03.50ID:ZPc78C3i
>>372
A=グローバル変数
って書かれてるともうダメだし
0377デフォルトの名無しさん2016/01/12(火) 07:49:37.59ID:/ZqCERvo
>>376
VBE上では必ず前後に半角スペースが入ると思うが?
0378デフォルトの名無しさん2016/01/12(火) 08:46:16.41ID:ZXe+fB4P
>>367
俺としては消えてほしくないんだけれどねww

ただ、扱えるカラムや行数増やしたのも、その布石。ただスピードがなwww 現時点
では話にならないし、データベース関数も全く充実していない。

ただ随分前からAccess消えるかもって話は出てるね。
0379デフォルトの名無しさん2016/01/12(火) 09:47:13.68ID:MvXD/tOc
>>377
直後がコンマやカッコだとスペースが入らない
0380デフォルトの名無しさん2016/01/12(火) 10:12:53.76ID:/ZqCERvo
>>379
なるほど。
両側スペースと . と , と ( を個別にやればいいかな。
プレフィクス・ポストフィクスなんてないよね?
0381デフォルトの名無しさん2016/01/12(火) 10:34:26.94ID:+GqIZBzh
もういっその事
VBAのコードを変更(置換)する VBAコードを作っちゃえば?
0382デフォルトの名無しさん2016/01/12(火) 10:57:36.37ID:MvXD/tOc
エディタやワードにコピペして単語の置換機能を使った方が早い
0383デフォルトの名無しさん2016/01/12(火) 12:48:46.20ID:ZPc78C3i
>>377
行末には入らないし、>>379 の言うように , ( ) とかもダメ

>>380
そんなことするぐらいなら「完全に一致する単語だけ検索する」にチェック入れた方がいい
0384デフォルトの名無しさん2016/01/12(火) 12:53:56.70ID:ZPc78C3i
>>367
DBの機能が欲しいだけなら SQL-Server の Compact Edition, Express Edition, LocalDB とかでやればいい
Access って入力画面とか帳票をお手軽に作るツールでしょ
0385デフォルトの名無しさん2016/01/12(火) 14:03:34.59ID:kdR1XWYY
>>305
これ実行すると、v(1) => 1, v(2) => 2, v(3) => Nothingにならないんだ。
わかりづらい。
0386デフォルトの名無しさん2016/01/12(火) 14:33:05.97ID:1Tg2WctI
データベースならSQL+Excelで何とななるってきいた
0387デフォルトの名無しさん2016/01/12(火) 15:09:45.03ID:/ZqCERvo
>>383
ああ、「前後の空白」の"後"の方は行末の場合ダメってことか。失礼した。

>>385
うん、データをシフトする訳じゃなくて見かけ上のインデックスが変わるだけ。
だからデータをコピーしたり範囲を広げたり縮めたりするのは本来は不要な動作。
もうメモリを直接書き換えることにした。
0388デフォルトの名無しさん2016/01/12(火) 15:28:05.64ID:WkQGbLg9
非表示のシート数を数えるマクロは作れないですよね。
0389デフォルトの名無しさん2016/01/12(火) 15:50:17.33ID:FWKIiayM
for eachでworksheet参照してvisibleプロパティみればいい
0390デフォルトの名無しさん2016/01/12(火) 16:10:53.83ID:1Tg2WctI
>>38で勧められてたVBAの神様を今読み終わったんだけど、糞つまらなかった
Amazonのレビューもわりと高評価だが、VBAの参考書ならもっと他にいいのあるだろう
0391デフォルトの名無しさん2016/01/12(火) 17:56:50.78ID:wYSSDoUN
VBAの求人161件の平均最低月給223,100円
http://jobinjapan.jp/job-listing/keyword-vba.html
0392デフォルトの名無しさん2016/01/12(火) 19:36:12.43ID:/ZqCERvo
>>390
MsgBox ("こんにちは") の大間違いって何なん?
0393デフォルトの名無しさん2016/01/12(火) 23:53:13.87ID:iltzJQ7p
call忘れてる辺りかな
0394デフォルトの名無しさん2016/01/13(水) 00:08:28.28ID:NbxXZYkh
他の言語で言う hello world をただの挨拶として認識してるってことかと
0395デフォルトの名無しさん2016/01/13(水) 00:12:12.63ID:NbxXZYkh
んで、hello world をVBAでやるんだったら
 Worksheets("Sheet1").Range("A1").Value = "こんにちは"
まだこっちだ
0396デフォルトの名無しさん2016/01/13(水) 05:12:39.94ID:6j8B4A3/
>>395
EXCEL VBAでやるなら、な
他の言語でもhello worldなんて、MsgBoxで表示と大差ないけど

ちなみに間違いってのは
MsgBox (こんにちわ)
が間違ってるって話じゃないのか
0397初心者A2016/01/13(水) 06:27:10.38ID:hFbJh3ij
自分用に作成したVBAですが、アップします。

2点間距離の差(22).xls
パスワード:abc
http://ww10.puny.jp/uploader/download/1452633400.xls
そのうち削除します。

もっと、わかりやすくプロシージャを分けた方がいいんだろうけど。
素人が見様見真似で作成したものです。
アドバイスなどありましたら、コメント願います。
0398初心者A2016/01/13(水) 07:54:34.97ID:hFbJh3ij
全画面表示ボタンを押した後、印刷プレビューボタンを押すと
閉じるボタンが表示されないので、以下のように修正。

Sub 印刷プレビュー()
Application.DisplayFullScreen = False
ActiveWindow.Zoom = True
DoEvents
ActiveSheet.PrintPreview
End Sub
0399初心者A2016/01/13(水) 08:00:33.92ID:hFbJh3ij
ボタンを挿入するの箇所を修正
.Placement = xlMove
.PrintObject = False
を追加


With chart1.Buttons.Add(20, 50, 80, 25)
.OnAction = "全画面表示ON"
.Characters.Text = "全画面表示(ON)"
.Placement = xlMove
.PrintObject = False
End With

他のボタンも同様
0400初心者A2016/01/13(水) 08:31:29.89ID:hFbJh3ij
ちょっと修正
http://ww10.puny.jp/uploader/download/1452641324.zip
2点間距離の差(23).xls パスワード:abc
0401デフォルトの名無しさん2016/01/13(水) 13:48:54.18ID:2tOFPV9B
>>397
またお前か。
人に見てもらうようなコードを書こうとは思わないのかね。
0402デフォルトの名無しさん2016/01/13(水) 14:02:28.80ID:LYjGdwXl
>>400
ひとつの関数に詰め込みすぎ
もっと分割する
そして20行くらいに収めてforやifのネストは2つまでにする
変数も多すぎて見にくい
0403初心者A2016/01/13(水) 15:46:31.62ID:hFbJh3ij
>>402
>20行くらいに収めてforやifのネストは2つまでにする。
>変数も多すぎて見にくい

今後、心掛けてみます。
スクロールしないとプロシージャ全体が見れないのは、
たしかに見にくいですね。

ありがとうございます。
0404デフォルトの名無しさん2016/01/14(木) 04:33:01.66ID:fK8eMzuy
そんなこと気にしちゃダメ
画面を大きくすればいいんだから
0405デフォルトの名無しさん2016/01/14(木) 04:47:09.57ID:5jp4f0T2
関数は機能毎に分けるものであって行数で分けるもんじゃないぞ
関数名や付随するちょっとした説明を見れば中身を見なくても何する関数か分かるようにするのが美しい
0406デフォルトの名無しさん2016/01/14(木) 08:51:34.23ID:hDrEawni
>>403
プロシージャってのは、別に行数が多いから分けるってもんじゃないぞww

例えばループで何度も同じような大きめの処理をするのであるならば、それは
呼び出す形にして切り分けろって事だぞ。ループの中にダラダラと書いてある
と、それは見辛いってこと。

スクロールしないかどうかなんて問題じゃない。
0407デフォルトの名無しさん2016/01/14(木) 09:20:36.05ID:kariNJk1
行数は目安にはなる。
スクロールしなきゃ全体が見渡せないなんて、結局自分がつらい。
0408デフォルトの名無しさん2016/01/14(木) 10:23:19.25ID:lO54s+mO
行数はあくまで目安だからな
関数を分けるのは機能毎
機能=関数名にしてそれ以外のことはするな
同じ関数名になったらそれは関数を見直したほうがいい
同じようなことをやろうとしてるはず
そうすれば大体20行以内になる
ならないからって分割する必要はないぞ
0409デフォルトの名無しさん2016/01/14(木) 12:40:00.28ID:hPr0+y7s
行数か機能の目安になるわけねーだろw
なんつー嘘つくねんこいつww
0410デフォルトの名無しさん2016/01/14(木) 12:52:34.23ID:q8GDBYq3
巨大モニターを使えば行数多くてもスクロールしなくてよくないか?
0411デフォルトの名無しさん2016/01/14(木) 12:53:35.54ID:hDrEawni
>>410
11インチくらいのMBAで作業でもしてるんじゃね?
0412デフォルトの名無しさん2016/01/14(木) 13:04:14.50ID:q8GDBYq3
MBAとは?
0413デフォルトの名無しさん2016/01/14(木) 13:13:29.52ID:lO54s+mO
>>409
行数が機能の目安になるなんて言ってねーだろww
機能を絞れば行数が短くなるって言ってるんだよw
0414デフォルトの名無しさん2016/01/14(木) 13:23:17.24ID:QLA7f99b
>>412
たぶんマックブックエアーの略
0415デフォルトの名無しさん2016/01/14(木) 13:48:12.51ID:kariNJk1
まー作ってるものが違えば長い短いの基準は変わってくるだろうけど。
自分の場合は10行超えたら不満、30行超えたらリファクタリングを試みる。
ただし機能を外出しするためにPrivateなプロシージャを作ることは極力しない、という方針。
それをしたらただ分けてるだけだからね。
0416デフォルトの名無しさん2016/01/14(木) 13:51:57.39ID:q8GDBYq3
1つのSubの中が長くなって短くしようとするときに
そのSub内で繰り返しのコードが見つかったので
それをさらにそのSubから呼ばれるSub(サブSubと呼ぼう)にしたいとき
単にそのサブSubをPrivate Subにするしか方法はないですか?

理想はそのSubからしか呼ばれないからそのSubの内部にそのサブSubを置きたいのですが。
0417デフォルトの名無しさん2016/01/14(木) 14:15:35.60ID:hDrEawni
>>416
JavaScriptだとそういう書き方は無名関数ってのを使ってよくやるけれどね。
VBAで出来るのかね
0418デフォルトの名無しさん2016/01/14(木) 17:11:17.68ID:ZyMeHqvf
>>416
推奨はされてないけど こんなのはある

GoSub...Returnステートメント
http://officetanaka.net/excel/vba/statement/GoSubReturn.htm
0419デフォルトの名無しさん2016/01/14(木) 18:15:46.06ID:QLA7f99b
>>416
いっそのことモジュール単位で考えて、
ひとつのモジュールの内容をそのSubとサブSubだけにしちゃうとか

メインのSub以外全部Privateにしとけば
他のモジュールにあるSubからは呼べなく出来るじゃん
0420初心者A2016/01/14(木) 18:50:08.19ID:sGJ4yhp5
エクセルVBAの表示画面
解像度:1366px×768pxで46行表示可能なんで、
基本、40行以下ならいいかな。1つのプロシージャ

★2点間距離の差(24)
http://ww10.puny.jp/uploader/download/1452764372.xls
Password:abc
そのうち、削除します。
個人用に作成したものなんで、コードはまとまってません。
0421デフォルトの名無しさん2016/01/14(木) 20:14:23.77ID:os+tW4sX
>>416
そう言うことができる言語はあるけど VBA では無理
そもそもそんな機能をつけるぐらいならその前に改善してほしいところは山ほどあるだろ
我慢して付き合っていくしかない
0422デフォルトの名無しさん2016/01/14(木) 20:47:13.19ID:b/ISwWkG
っていうかmain1_sub1みたいな名前の関数にすればいい

コンボボックスからアクセスできる
main1グループはかためてテキストでつなげておくと
まとまり具合でsubルーチンと状況は変わらん
0423デフォルトの名無しさん2016/01/14(木) 21:18:50.57ID:6VSn4vPy
拡張子csvを列書式文字列で開く方法はないんだろうか
0424デフォルトの名無しさん2016/01/14(木) 21:59:18.16ID:R121pJF+
いや、そもそも長ければいい、短ければいいというもんじゃなくて
単一責任原則とDRY原則を守って作って行けば必然的に
1関数辺りのコードはそこまで長くならないだろうし、
手の入れ易い、分かり易いコードになる。

上の人は機能毎に分けると書いているが、どちらかと言えば
1役割1責任で関数を作って、それを組み立てて行くようなイメージかな。
0425デフォルトの名無しさん2016/01/14(木) 22:09:12.75ID:kKuTLL/9
みなさんの話が難しくてわからない
どうすればVBAに詳しくなれますか?
0426デフォルトの名無しさん2016/01/14(木) 22:15:24.54ID:fK8eMzuy
>>423
列書式文字列ってなんだ
>>425
詳しくなる必要ないぞ
このスレのおっさんすら1割も理解してるか怪しい
0427デフォルトの名無しさん2016/01/15(金) 00:07:51.17ID:+wAhFI3f
>>>>425
とにかく、WEBから拾ったサンプルプログラムを動かして、さらに改造して動かす。なんでも良いのでVBAでシステムを組んで効率的なアルゴリズムを考える
0428デフォルトの名無しさん2016/01/15(金) 00:23:44.72ID:OqTq8akB
>>425
皮肉なものでVBAはある程度理解したら他の言語をやった方がいい。そうしないと超え辛い一線がある。

>>418
それは止めとけ。N-BASIC時代からの負の遺産だ。
他で呼ばれていないからその処理を関数、またはメソッドにしないと言う考え方そのものが
既に構造化言語の考え方から離れていることに気付かないと。
0429デフォルトの名無しさん2016/01/15(金) 01:04:34.92ID:ln/l6pM0
>>428
その言い方だとラムダ式も否定しているように聞こえるが、そういう意図じゃないよね?
0430デフォルトの名無しさん2016/01/15(金) 01:34:55.99ID:qCDtweIz
>>1
RPGツクール2000 , RPGツクールMV https://tkool.jp/mv/ ( JavaScript 採用 )

WOLF RPGエディター http://www.silversecond.com/WolfRPGEditor/

デュエル・マスターズ Android版 ,i-OS版、公式 http://dm.takaratomy.co.jp/extra/dmapp/entrygate_ds/
デュエル・マスターズ対戦CGI ex
https://web.archive.org/web/20150809154946/http://www53.atwiki.jp/dmsuishinparty/pages/314.html

デュエル・マスターズ(デュエマ)DM ONLINE 1.8a  /  VanGuard ONLINE 1.5a
https://web.archive.org/web/20150809160254/http://uhyohyohyo.sak ura.ne.jp/hsp.html

ヴァンガード専用ネット対戦ツール【 VanGuard Online 】
https://web.archive.org/web/20150809155032/http://kiimaa.jugem.jp/?eid=61

「カードファイト!!ヴァンガード」のネット対戦ができる公式オンラインゲーム「Cardfight!! Online」 2015年冬スタート
https://web.archive.org/web/20150809153724/http://supersolenoid.blog63.fc2.com/blog-entry-6886.html

遊戯王 Automatic Dueling System
https://web.archive.org/web/20150809164855/http://www3.atwiki.jp/ads-wiki/pages/20.html

遊戯王 デュエル・オンライン
https://web.archive.org/web/20150809171527/http://www31.atwiki.jp/vipdo/pages/15.html
https://web.archive.org/web/20140628005202/http://do.yugioh-portal.net/

ウィクロス( WIXOSS ) WEBXOSS http://webxoss.com/about_en.html http://webxoss.com/DeckEditor/

BG(ボードゲーム)Engine https://web.archive.org/web/20151209080842/https://bgengine.net/
https://web.archive.org/web/20151209172205/http://14owl.hateblo.jp/entry/2015/12/09/011234

アプレンティス  マジック:ザ・ギャザリング(MtG)オンライン化 http://homepage1.nifty.com/Q_Q/ap.html
https://web.archive.org/web/20151202202725/http://homepage1.nifty.com/Q_Q/ap.html
0431デフォルトの名無しさん2016/01/15(金) 01:35:57.90ID:qCDtweIz
【 オンラインTCGエディター 】   >>1,>>430

デュエル・マスターズ的な非電源TCGの 《 オンライン化ツクール系ソフト 》 制作の企画。

例えば、ガチンコ・ジャッジを直ぐにでも導入できる機能を持っておりながら、
当面それを扱わず単純化させておいて、事後的に導入拡張する際に当該システムを
ブロック構造の組み合わせで後付け挿入できるように予めシステム化してあるソフト(エディター)。
既存の非電源TCGを劣らずに再現できるならば大概のニーズに応えられる筈。
デュエマ、ヴァンガ、ウィクロス、ポケカ、デジモン、ゼクス、モンコレ、旧ガンダム・ウォー、ライブオン、ディメンション・ゼロ、シャーマン・キング、カードヒーローなど
のシステムを完全再現できるように設計するけど、他に此のTCGの此のシステムは再現希望とか有ったら書け。
マジック:ザ・ギャザリングの全システムを完全に再現するのは無理だから、此れだけは必用だ!って部分のみリクエストしろ。
個vs個、多数乱戦、チームvsチーム、個vsチームを実現し、P2P通信対戦プラグイン有り。

設計思想は 《 RPGツクール 》 が良いかな?  他に、優れたエディター有ったら挙げてみろ。

個人や企業などのベンダーが提示する開発費(見積もり)で折り合えば、発注する。

エディター群から基本コンセプトを絞り込む(もちろんオリジナルで優れた新ネタが有れば導入する)。

遊戯王OCGに関しては、タッグフォース、ADS、デュエルオンラインを発注先ベンダーに研究させる。
バトスピ、ヴァンガ、デュエマなど発売済みゲームソフトが存在してるTCGはベンダーに研究させる。

各社TCGを再現するテストプレイ ⇒ 更に改良や修正 + コード記述の仕様書(設計書)を作成。

機能制限した下位版を制作しても原則として発売せず + 上位版デュエリ−グ用でサーバー稼動。

下位版を仮に発売した場合の改造および商用利用には、別途で当社との契約が必要。

さ〜て、インド人ベンダーと日本人の翻訳担当SEを見つけよっと!ww
http://wc2014.2ch.net/test/read.cgi/entrance2/1451262577/-16
0432デフォルトの名無しさん2016/01/15(金) 18:47:37.70ID:Xck1p4iK
印刷設定を立ち上げて3秒待つ、
ただそれだけなのに意図通りに動きません
なぜか最初に3秒待ちが発生し、その後にプリンタの設定に移ります。
なぜコードの順番と実行順序が逆になってしまうんでしょうか?
理由と解決方法をご存知でしたら教えてください。

Sub test()
Application.SendKeys "^p", True
Application.Wait Now + TimeValue("0:00:03")
End Sub
0433デフォルトの名無しさん2016/01/15(金) 19:11:48.10ID:GaD4rXA1
使ったことないけど

Application.SendKeys "^p", True
Application.Wait Now + TimeValue("0:00:03")

Application.Wait Now + TimeValue("0:00:03")
Application.SendKeys "^p", True
にしてみたらどうなの
waitでフリーズしてるんじゃ
とおもったが設定画面が出て3秒何もできないようにしたいのだな
loopでdoeventsの時間稼ぎとかかな
まあ何がしたいかはっきりさせてから考えたら
0434デフォルトの名無しさん2016/01/15(金) 19:45:41.25ID:Xck1p4iK
>>433
設定画面出てから3秒何もできないようにしたいです。
あとこの現象の理由も知りたいです
0435デフォルトの名無しさん2016/01/15(金) 19:58:32.80ID:KZg44ccI
Sub test()
Application.SendKeys "^p", True
Application.OnTime Now, "Ueito"
End Sub

Sub Ueito()
Application.Wait Now + TimeValue("0:00:03")
End Sub

これならどうや?
0436デフォルトの名無しさん2016/01/15(金) 20:05:58.41ID:GaD4rXA1
Application.SendKeys "^p", True
DoEvents
Application.Wait Now + TimeValue("0:00:03")

これで様子が変わったけど
0437デフォルトの名無しさん2016/01/15(金) 20:17:56.81ID:JNdiAV22
プロシージャの役割は1つだけにして簡潔に短く、というポリシーは賛成ですが
それを実現するためにプロシージャを分割しようとすると
元のプロシージャで使ってたローカル変数が使えなくなって困ります。
そのへんみなさんはどう対処してますか?
たくさんの引数を使ってわたしてる?
さらにプロシージャ分割を行うとさらに引数を使い、たらいまわしになってしまうのですが。
0438デフォルトの名無しさん2016/01/15(金) 20:54:52.19ID:GaD4rXA1
>>437
ローカル変数が使えなくなるの意味がわからないが
参照渡しで何の損もなく長い部分を外に追い出すことは
できると思うけど
0439デフォルトの名無しさん2016/01/15(金) 21:52:28.32ID:FuCtvVW7
>>437
VBAでコードの長さを気にしたら負け
変数宣言・初期化・代入だけで10行くらい使う言語なのだから
短くすることより機能単位にまとまっている方がメンテしやすい
ローカル変数を引数に与えてプロシージャ間でたらい回しするのは
グローバル変数を使うことと同じくらい融通の利かないコードになる
0440デフォルトの名無しさん2016/01/15(金) 22:10:39.54ID:kSdf5HWG
引数が増えるのは機能の分け方が下手なだけ
0441デフォルトの名無しさん2016/01/15(金) 22:21:10.91ID:bPOQG/pm
>>344
0442初心者A2016/01/15(金) 23:08:24.77ID:frMDKvbE
★出勤簿.xls(パスワード:abc)
1つ1つのプロシージャを短く、まとめてみました。
http://ww10.puny.jp/uploader/download/1452866571.zip

>>420
★2点間距離の差(24).xls(パスワード:abc)
http://ww10.puny.jp/uploader/download/1452764372.xls
そのうち消します。
0443デフォルトの名無しさん2016/01/15(金) 23:12:05.17ID:bPOQG/pm
ラーマーヤナ
0444デフォルトの名無しさん2016/01/15(金) 23:13:30.81ID:bPOQG/pm
スマン、ラピュタ観てた。誤爆
0445デフォルトの名無しさん2016/01/16(土) 01:02:35.49ID:ycK3j5Q3
>>437-440
リファクタリングでは、カプセル化・疎結合にする

引数をたらい回しにしているのは、密結合になっていて、
分割する場所が悪い

その引数を、クラス・構造体にまとめられないのか?
0446デフォルトの名無しさん2016/01/16(土) 03:40:59.69ID:jFPwREdt
>>432
SendKeysはOSにそのキー入力を送ってねってお願いする命令
EXCELがOSからキー入力を受け取るには、マクロがひと段落する必要がある
マクロの途中でOSからの処理を受け取るにはDoEventsつかう
0447デフォルトの名無しさん2016/01/16(土) 04:26:02.48ID:fCKattgx
vbaでクラスとかいちいち作るヤツは死ねよ
0448デフォルトの名無しさん2016/01/16(土) 09:41:21.78ID:17wph6Lk
>>445
その辺がVBAでは悩みどころで、Entityクラスを一つ追加することは直でモジュールを一つ追加することになる。
細かいフォルダ階層が持てないVBAでは場合によってモジュールだらけになり、分かり辛くなる。

構造体は.Netで言う構造体のことを言ってるのかユーザー定義型のことを言ってるのか分からないけど、
前者は使えないし、後者はまずクラス化しないと他のモジュールで宣言して
それを引数で他のモジュールにあるメソッドや関数の引数に渡したりは出来ない。

直接指定しなければ使えないので、結局結合度は高いままになるし、
クラス化しても、同じ型を使って宣言した場合、同じモジュール内だと同じ参照先を指すため、非常に使い辛い。

結局のところコレクション、配列、ディクショナリやRecordSetを使って渡してやるとこらへんが妥当になる。

要は大きなシステムを開発する言語は兎も角、VBAにそこまで求めるなと言うことなんだろうな。
0449デフォルトの名無しさん2016/01/16(土) 10:38:53.02ID:EQwe8P3v
複数のプロシージャで使うパラメータなら、引数たらい回しより
シート・セルに範囲名を付けて使う方がマシかも知れない
0450デフォルトの名無しさん2016/01/16(土) 13:23:06.09ID:BVnENxs2
VBAのクラスは使ったことないし、ライブラリではクラスを定義する気ないなあ。
表に出ない使い方ならいいだろうけど、独自データ型をユーザーに使わせるのは旨くない。
ほかの言語ではそんな問題にはならないけど、VBAだとクラスのメリットが出にくいと思う。
0451デフォルトの名無しさん2016/01/16(土) 13:32:03.98ID:djcR4koj
>>450
お前の作ったライブラリを使わさせる時点でこの上ない苦痛なのだから
そんな事考えるだけ時間も無駄だ、好きにしろ
0452デフォルトの名無しさん2016/01/16(土) 13:43:22.10ID:/WAAZPFP
クラスはモジュールをパッケージ化するって目的の為だけに使う物だと考えると使いやすい。

VBAは環境が特殊なので普通のプログラムと同じような勉強の仕方すると混乱する。
クラスって名前がついているだけで、型安全の為に存在しているわけではないと気づけば応用範囲が広がると思う。
0453デフォルトの名無しさん2016/01/16(土) 14:25:05.94ID:BVnENxs2
>>451
食わず嫌いせずに使ってみてくれよ
0454デフォルトの名無しさん2016/01/16(土) 17:52:22.66ID:djcR4koj
>>453
そこまで言うなら使ってやるからどっかに上げといてくれ
0455デフォルトの名無しさん2016/01/16(土) 19:16:02.12ID:TOLCMvfB
プログラムのフレームワーク学習用にクラス使ったり
新入社員が仕事になるようクラスで必要なことを整理
するのも有効利用してると思うが
3Dレンダリングとかなるとクラスがないと
人と人とのコミュニケーションすらとれない感じだろ
必要とする度合いと取られる時間で決めたらいいのでは
0456デフォルトの名無しさん2016/01/18(月) 22:03:45.12ID:IuIvKytx
For Each はどうしてこう使いにくいのか?
0457デフォルトの名無しさん2016/01/18(月) 22:24:26.01ID:FooX/JpX
使いにくいかな?
0458デフォルトの名無しさん2016/01/18(月) 23:03:13.57ID:5Km6QlG1
VBのforeachは言語仕様上オブジェクトしか参照を渡してくれないからね
スマートにforeachで処理したつもりで全く反映されてなくてぐぎぎぎぎ
0459デフォルトの名無しさん2016/01/19(火) 00:05:50.65ID:XjyMc5te
>>421
vbaのclass使えば出来るんじゃないか?
0460デフォルトの名無しさん2016/01/19(火) 05:48:35.72ID:Knai0l7P
>>458
VBAにオブジェクト以外の参照型なんて無いからな
0461デフォルトの名無しさん2016/01/19(火) 08:57:29.57ID:hKwHZ0io
>>425
とにかく、場数を踏んで1個1個のメソッドについて使えるようにするしかないよ。
どうすれば車の運転が上手くなりますか? なんて質問と大差ない。
0462デフォルトの名無しさん2016/01/19(火) 11:40:00.29ID:1yi9x6jx
配列の値渡しの質問お願いします。

長いプロシージャを分割する作業をしているのですが、10個ある配列をモジュールレベル変数に置くか、その都度値渡しをするか、どちらがスピードは速くなるでしょうか?
パソコンが低スペですが、現在1分ぐらいかかるプログラムです。
0463デフォルトの名無しさん2016/01/19(火) 11:48:45.64ID:jGMD02BB
>>462
分割したプロシージャを数千万回とか呼ぶのでなければ、どっちにしても処理時間1分に
与える影響は1秒未満だと思う。

処理時間1分の中の10msとか100msの処理時間の違いなんて、気にしてもしょうがない。
0464デフォルトの名無しさん2016/01/19(火) 12:03:42.10ID:moFYOEmO
>>462
参照渡し(ByRef)でダメな理由は?
0465デフォルトの名無しさん2016/01/19(火) 12:57:02.14ID:1yi9x6jx
>>463
>>464
ありがとうございます。
値渡しする数が多すぎて、エラーを招きそうな気がしたもので、、、
0466デフォルトの名無しさん2016/01/19(火) 12:59:39.91ID:jGMD02BB
>>465
クラス使うと解決するかもね。
0467デフォルトの名無しさん2016/01/19(火) 13:32:37.47ID:hKwHZ0io
>>464
たとえば、var array = []; として、この配列のarrayをbayrefで渡せるの?
0468デフォルトの名無しさん2016/01/19(火) 13:58:55.16ID:Knai0l7P
>>467
お前は何の言語の話をしてるんだ?
0469デフォルトの名無しさん2016/01/19(火) 16:22:46.20ID:moFYOEmO
>>465
えーと、参照で渡すと意図しない書き換えが起こり得るって話かな?
でもそれはモジュールレベル変数にしても同じだし、何を問題にしてるのかよくわからない。
0470デフォルトの名無しさん2016/01/19(火) 17:49:50.46ID:1yi9x6jx
>>469
スピードとメモリの解放等が気になります。
実際はこの1分のプログラムを60〜120回ぐらいループさせたいのが目標で、0.1秒でも速くなると助かります。
また、一度モジュール変数多用でメモリ不足エラーが出てしまいました。
0471デフォルトの名無しさん2016/01/19(火) 18:12:17.93ID:jGMD02BB
>>470
何度も言うようだけど、速度改善を目標にするのは意味ないって。
1分かかる処理を60回繰り返すのだったら、0.1秒速くなっても、1時間の内6秒速くなるだけ。
もし本当に速度改善をしたいなら、処理ブロック毎に処理時間計測をすること。

本当に解決すべきは、そのメモリ不足エラーで、もし関数に配列の値渡しをしているなら、
それが原因かもしれない。

あるいは、60〜120回の繰り返し方が悪いのかもしれない。

public sub foo()
 for i = 1 to 60
  call メモリを大量に使う関数()
 next
end sub

なら、メモリを大量に使う関数のローカル変数は呼び出し終了後に自動解放されるので
問題はないが、以下のようにしているのなら問題がある。

public sub foo()
 for i = 1 to 60
  ' メモリを大量に確保して処理を行う
 next
end sub

これはfoo()が終了するまで、メモリを累積して確保し続ける。
確保した変数 = Nothingをnextの前に置けば、状況は改善するかもしれない。
あるいは、メモリ上のデータではなく、シート上のデータを相手にすれば、必要なメモリは
少なくて済む。(処理速度は遅くなるが)
0472デフォルトの名無しさん2016/01/19(火) 18:17:14.15ID:jGMD02BB
関数に変数を値渡しするというのは、元の変数のコピーを作って渡すということ。
つまり、参照渡しに比べて二倍のメモリが必要。

「メモリ不足エラー」というエラーではなくて「スタック領域不足」の場合は、また別の原因。
0473デフォルトの名無しさん2016/01/19(火) 18:42:41.96ID:1yi9x6jx
>>471>>472
わかりやすいご回答ありがとうございます。
メモリの解放タイミングが気になっていました。
まだまだ初心者で分かりにくい書き方ですいません。頑張ってみます。
0474デフォルトの名無しさん2016/01/19(火) 19:06:30.07ID:moFYOEmO
>>473
今現在データをどう渡しているのか書いてよ。
0475デフォルトの名無しさん2016/01/19(火) 19:36:21.61ID:1yi9x6jx
>>474
モジュール1
private tableA() as currency,tableB tableC
…動的配列10個程

sub 実行()
CALL A
配列の要素数決定しredim処理
CALL B
CALL C ←BCDで配列の中身を入れていく作業
CALL D
end sub

CALL先のプロシージャでは、ほとんど全ての配列を使っています。配列以外のこまごました変数だけ値渡ししています。

モジュール2
sub 全実行()
for n = 1 to 60
CALL 実行(name)
next n
end sub

こんな感じです。スマホからですいません。
0476デフォルトの名無しさん2016/01/19(火) 19:40:14.63ID:5AOetSsn
>>475
たぶんAccess VBA覚えた方が幸せになれる
0477デフォルトの名無しさん2016/01/19(火) 20:01:16.49ID:1yi9x6jx
>>475
スピードも変わるんでしょうか?
0478デフォルトの名無しさん2016/01/19(火) 20:36:15.66ID:Knai0l7P
>>475
結局配列何個確保してメモリ不足なんだよ

ちなみに
private tableA() as currency,tableB tableC
はたぶんBとCの間にカンマ抜けてるんだろうと思うけど
これでCurrencyになってるのはAだけで、BとCはVariantだぞ
0479デフォルトの名無しさん2016/01/19(火) 20:38:53.39ID:moFYOEmO
>>475
その10個の配列はずっと残っていてほしいということか?
ならいいんじゃね。
そうでなければ Sub 全実行のなかで作って各処理に参照渡しすればいい。
何も考え込むようなことじゃないら。
0480デフォルトの名無しさん2016/01/19(火) 20:39:52.19ID:moFYOEmO
ないらw
0481デフォルトの名無しさん2016/01/19(火) 20:54:20.44ID:5AOetSsn
無駄な事やってるだろうなってのは予想できるんだけど、
実際のデータをどう扱ってるのか分からないから解決出来ないもどかしさ。

ダミーデータと処理方法(VBAのではなく手作業的な)があれば効率のいいマクロ書けると思うんだけどな。
0482デフォルトの名無しさん2016/01/19(火) 20:58:28.16ID:Knai0l7P
>>476-477
何やってるか分からんけど、SQL一発で出来るような内容なら
ACCESS(とか他のDB)使えば速くなるかもしれん
ACCESSでも、VBAで自分でロジック組んでループまわすようなら、速くはならんと思うが
0483デフォルトの名無しさん2016/01/19(火) 21:06:55.44ID:UlyMCfxA
チューニングするならABCDのどこで時間が取られてるか調べないと対策のしようがない
excelから値取ってくるのに時間掛かってましたとかなら正直どうにもならん
0484デフォルトの名無しさん2016/01/19(火) 22:02:40.69ID:fUVEQkdb
シムレーションだろう
vbaだろうがcだろうが案外計算速度に違いはないが
variantとかだとそれはやめたほうがいいって感じ
0485デフォルトの名無しさん2016/01/19(火) 23:39:15.43ID:1yi9x6jx
質問主です。
みなさんありがとうございます。
上のコードは省略しすぎているので、型などは間違っていません。その他各部門のスピードは計測しなが改善しようと思います。
最後に質問なのですが、
上のモジュール2の
CALL 実行 が終わった場合、モジュール1の配列で使っていたメモリは解放されるということで間違いないでしょうか?
0486デフォルトの名無しさん2016/01/20(水) 00:11:38.99ID:XFqYG3t7
うん、間違いなくなくなくないかもしれないかもなくない

Private a As String
Sub test1()
a = "aho"
End Sub
Sub test2()
MsgBox a
End Sub

とかすればわかるかもしれない
0487デフォルトの名無しさん2016/01/20(水) 00:34:12.16ID:tnXkhLo5
ExcelでVBAマクロl動かしてる間
他のExcelの作業が中断してしまうのですが
どうにかなりませんか!
0488デフォルトの名無しさん2016/01/20(水) 00:41:59.97ID:uYf8rD9k
モジュールって基本的にはVBA実行中はずっと生きてる気がする
つまりモジュールレベルの変数は明示的にNothing代入するなりRedimするなりしないと開放されない気がする
0489デフォルトの名無しさん2016/01/20(水) 01:20:01.65ID:7T123+WA
>>487
もう一つ別に、Excelプロセスを起動したら?
0490デフォルトの名無しさん2016/01/20(水) 02:06:12.29ID:3JHsYJhz
話むしかえすけど
配列マジックを極める(ASCII)
って本をアマゾンでジャケ買いしたんだけど
VBAのことほとんど触れてねー
VBAでいうところの配列のテクニックを期待してたんだが残念。
やっぱ本はジャケ買いするもんじゃないな
0491デフォルトの名無しさん2016/01/20(水) 03:44:21.39ID:gC8iY3QI
>>487
ループ処理にDoEvents入れればループ処理宙は実行中に他の作業が出来る。
0492デフォルトの名無しさん2016/01/20(水) 07:11:18.99ID:xfIx1JoD
>>490
そんな本があるのか。
息するように配列を弄りまくっている俺でも、VBAの配列にはよくわからないところがある。
0493デフォルトの名無しさん2016/01/20(水) 08:21:54.61ID:biOEENiS
>>459
サブルーチンの中で定義したいと言う話
ファイル単位のスコープならモジュールでもできる
0494デフォルトの名無しさん2016/01/20(水) 10:03:37.62ID:TOXNslUJ
>>468
今気がついた。

普通にJavaScriptの構文で書いてた。最近VBAよりそっちの仕事のほうが多くて
ガチで気が付かなかった。
0495デフォルトの名無しさん2016/01/20(水) 10:37:40.75ID:HskUHurd
>>494
配列のarrayってVBAでいうジャグ配列(配列を要素とする配列)のことだろうか?
ByRefで関数に渡せるよ。
要素を参照で持てるか?という意味だとしたら、それはできない。
0496デフォルトの名無しさん2016/01/20(水) 11:25:41.73ID:TOXNslUJ
>>495
なるほどねぇ。

JavaScriptやってると配列関係の取扱いがVBAとはちょっと違うので、混乱するね。
0497デフォルトの名無しさん2016/01/20(水) 11:53:53.10ID:HskUHurd
例えば3つの配列
array1
array2
array3
をまとめて、
array_all = Array(array1, array2, array3)
なんてものを作ると、全部コピーになってしまう。
参照にしたくて色々試したが成功しない。
どうやら不可能なようだ。
0498デフォルトの名無しさん2016/01/20(水) 12:46:25.59ID:V5TARUOi
≫486>>487
度々ありがとうございます。
念のため、全てnothingで終わらせてみる実験をしてみます。長く走らせると不手際で解放されてないのかも知れません。
0499デフォルトの名無しさん2016/01/20(水) 18:19:33.52ID:xdXYdVv+
対象セルがどこかのセルで参照されているかどうか、
判定することはできるのでしょうか。

参照先のセルを得るのではなく、
「参照されているか、否か」を判定する方法です。

シート内の不要データの整理に使いたいと考えています。
0500デフォルトの名無しさん2016/01/20(水) 18:34:15.12ID:XFqYG3t7
isref
05014992016/01/20(水) 18:45:24.37ID:xdXYdVv+
>>500

あわせて調べてみました。
ttp://excel.onushi.com/function/isref.htm

isref()の引数で判定対象のセルを指定すればいいのですかね。
isref(cells(i,j)) みたく。
0502デフォルトの名無しさん2016/01/20(水) 19:48:55.16ID:XFqYG3t7
>>501
参照できたかどうかの関数らしい
ので間違いだった
セルの内容が参照の場合trueって説明だったから
isref使った時点で参照してるじゃんってミスでもないらしい
考えるにデータの入っていないセルに参照されてるかどうかの
プロパティつけるのは無駄かもしれないので
アイディアがないと無理そう
0503デフォルトの名無しさん2016/01/20(水) 20:55:20.57ID:uYf8rD9k
>>499
Range.Dependents プロパティ
05044992016/01/20(水) 22:25:06.28ID:xdXYdVv+
Dim range1 As Range

Dim returnValue As Range
returnValue = range1.Dependents

こんな感じでrange型変数に格納したあと、
if分で空(nothing)かを判定する、というのはどうなんでしょうか。
(自分で確認すれば良いのですが、ちょっと今は試せない状況で・・・)

ただ、どっちにしろ
>Dependents プロパティは作業中のシートでのみ有効で、
>リモート参照をトレースできないことに注意してください
ttps://msdn.microsoft.com/ja-jp/library/office/ff197707.aspx

なんて記述があるんで、
他シートをまたいでいるものに関しては
文字列判定をする必要がありそうですが。
0505デフォルトの名無しさん2016/01/21(木) 00:52:36.55ID:rehOk3U9
10行×5列の表があって、1列目に5個、2列目に8個、3列目に5個、4列目と5列目は空欄となっています。各項目は必ず1行目から入っています。
各列から1つずつ取って、それらを左から繋げた文字列(順列)を作りたいのですが、どのように書けば良いのでしょうか。
各列に何個要素があるかをカウントするところまでは書けたのですが、そこからよくわからなくなってしまいました
0506デフォルトの名無しさん2016/01/21(木) 01:06:23.00ID:X7n9A0oT
>>505
こんな感じか?

Sub macro1()
  r = 1
  For r1 = 1 To 5
    For r2 = 1 To 8
      For r3 = 1 To 5
        s = Cells(r1, 1) & Cells(r2, 2) & Cells(r3, 3)
        Cells(r, 6) = s
        r = r + 1
      Next
    Next
  Next
End Sub
0507デフォルトの名無しさん2016/01/21(木) 01:07:45.84ID:0jk7vnPh
>>499
Function RefCheck(CheckRange As Range) As Boolean
If CheckRange Is Nothing Then Exit Function
RefCheck = True
For Each x In ThisWorkbook.Worksheets
For Each y In x.UsedRange
For Each Z In CheckRange
If y.Formula Like "*" & Z.Address(1, 1) & "*" _
Or y.Formula Like "*" & Z.Address(0, 1) & "*" _
Or y.Formula Like "*" & Z.Address(1, 0) & "*" _
Or y.Formula Like "*" & Z.Address(0, 0) & "*" _
Then Exit Function
Next
Next
Next
RefCheck = False
End Function

あとは調べて無いけど同一シート内で参照していた場合もブック名とシート名を表示させる事が出来れば、
Addressの第四引数にTrue入れてチェックする事で間違いなく判定出来る。
0508デフォルトの名無しさん2016/01/21(木) 05:38:14.28ID:tGM9G3/P
>>506
ありがとうございます
そういう感じで必要十分なのですが、余談ですが同じような処理を繰り返すのでもう少しうまく処理できるのでしょうか?
0509デフォルトの名無しさん2016/01/21(木) 06:18:36.49ID:0jk7vnPh
>>508
Sub test()
Dim a(1 To 5), str(5), b() As String, index As Long
For i = 1 To 5
a(i) = Range(Cells(1, i), Cells(Rows.Count, i).End(xlUp)).Value
Next
For Each v1 In a(1): str(1) = v1
For Each v2 In a(2): str(2) = v2
For Each v3 In a(3): str(3) = v3
For Each v4 In a(4): str(4) = v4
For Each v5 In a(5): str(5) = v5
c = ""
For Each x In str
c = c & x
Next
ReDim Preserve b(index)
b(index) = c
index = index + 1
Next:Next:Next:Next:Next

For Each x In b
Debug.Print x
Next
End Sub

五桁固定。最低でも一桁当り2要素ないといけない。
桁数まで柔軟にすると、くっそ面倒だから自分でやれ。
0510デフォルトの名無しさん2016/01/21(木) 07:56:21.86ID:hkWWdNPn
>>509
だせぇ
0511デフォルトの名無しさん2016/01/21(木) 08:30:12.04ID:epD6nfy/
>>509
なぁ、出来もしないのなら、無理に回答しなくていいぞww

あとな、お前にお勧めのスレがある。
今までみた絶望的なソースコード [転載禁止](c)2ch.net
http://peace.2ch.net/test/read.cgi/tech/1429279230/
0512デフォルトの名無しさん2016/01/21(木) 08:48:35.32ID:Jdl8/hrx
初心者のコードってすげぇと思うよな。
とても真似できん。
自分にない発想があるなって劣等感があるよ。
0513デフォルトの名無しさん2016/01/21(木) 09:46:20.45ID:pkb4zgJk
>>505のやつ4行くらいでできないかな。
入出力2行、 桁数可変で本体処理2行。
右からやるか左からやるか...
0514デフォルトの名無しさん2016/01/21(木) 10:15:19.09ID:f+IaIVwa
昨日か一昨日かのWindows UpdateでList View使ってるファイルがおかしくなった。。。
0515デフォルトの名無しさん2016/01/21(木) 12:00:32.16ID:tGM9G3/P
>>509
ありがとうございます。
条件を書くと、以下のようです。

1)各列に何個の要素があるかは動的(
2)何列あるかも動的(>>506のネストの数は3だが、ここが何回ネストするかが動的になる)
3)組み合わせの仕方は左から順にのみで、並び替えの必要はない(樹形図的)
4)要素の文字数も動的で、何桁か決まってはいないし、数字もあれば文字列もある

私は条件2のうまい書き方がよくわからず、結局、何列あるかを調べて、if文で1列なら〜2列なら〜3列なら>>506というようにしています。
0516デフォルトの名無しさん2016/01/21(木) 12:06:31.84ID:X7n9A0oT
>>515
そういう場合は再帰を使え
0517デフォルトの名無しさん2016/01/21(木) 12:13:08.74ID:pkb4zgJk
>>516
かなり無理があるのでは?
組み合わせの数だから相当の量になる。
0518デフォルトの名無しさん2016/01/21(木) 12:15:50.60ID:epD6nfy/
>>505
つーか、そんなのユーザ定義関数でいいだろ。
0519デフォルトの名無しさん2016/01/21(木) 12:54:35.53ID:jus49kmC
>>517
組合せの数だけネストするわけじゃないだろ
0520デフォルトの名無しさん2016/01/21(木) 13:30:20.23ID:X7n9A0oT
>>515
再帰ってのはこんなふうに書くんだよ
ループのネストの段数が不定でも問題なく動く
VBAの仕様でデータが300列ぐらいあるとメモリ不足を起こすけど、300列の順列なんて出そうとしたら人類が滅亡するほど時間がかかるんで実用上は問題ない

Sub main()
  Call Recursive(1, "")
End Sub

Sub Recursive(c As Long, s As String)
  max_row = Cells(Rows.Count, c).End(xlUp).Row
  If Cells(max_row, c).Value <> "" Then
    For r = 1 To max_row
      Call Recursive(c + 1, s & Cells(r, c))
    Next
  Else
    Debug.Print s  ' データ出力
  End If
End Sub
0521デフォルトの名無しさん2016/01/21(木) 13:36:58.95ID:P+RPuePi
テーブルの重複行削除の際に、削除する行を指定させる方法を教えてください。
以下は、単純にマクロ記録したものです。
Sub Macro1()
Range("F5").Select
ActiveSheet.Range("テーブル2[#すべて]").RemoveDuplicates Columns:=Array(1, 6, 7), _
Header:=xlYes
End Sub
11列分テーブルの、1、6、7列目が重複したものを削除するのですが、
これに、8列目のの数値が小さいほうを削除、大きい方を残したいです。
わかりますでしょうか?よろしくお願いします。
0522デフォルトの名無しさん2016/01/21(木) 15:34:42.41ID:epD6nfy/
>>520
減価償却費の計算とかではよくつかってる。
0523デフォルトの名無しさん2016/01/21(木) 20:02:04.58ID:RqTcmjez
>>521
聞きたい事は分かったが残念な事に答えが分からんのだよw
0524デフォルトの名無しさん2016/01/21(木) 20:35:34.37ID:0jk7vnPh
>>521
Sub test()
Dim c(2), m As Collection, del As Range
Do
Set del = Nothing
Set m = New Collection
xdata = Range(Cells(1, 1), Cells(Rows.Count, 11).End(xlUp)).Value
i = i + 1
If i > UBound(xdata, 1) Then Exit Do
c(0) = xdata(i, 1): c(1) = xdata(i, 6): c(2) = xdata(i, 7)
For j = 1 To UBound(xdata, 1)
If xdata(j, 1) = c(0) And xdata(j, 6) = c(1) And xdata(j, 7) Then m.Add j
Next
If m.Count Then
p = 0
For Each x In m
e = True
If p Then If xdata(p, 8) > xdata(x, 8) Then e = False
If e Then p = x
Next
For Each x In m
If x <> p Then If del Is Nothing Then Set del = Rows(x) Else Set del = Range(del, Cells(x, 1).EntireRow)
Next
If Not del Is Nothing Then del.Delete
End If
Loop
End Sub

これで動かないかな
0525デフォルトの名無しさん2016/01/21(木) 20:40:55.77ID:xJzWoKjV
1空き列に連番を振る
28列目で降順に並び替える
3removeduplicate
41の列で並び替える
51の列を削除
05264992016/01/21(木) 23:00:34.27ID:0tyN2uzx
dependentsを使って、それっぽいことはできました。
下記は、セル(1,1)とそれを参照するセルを返して選択させる
ということをさせようとしています。

Sub Macro1()

Dim c As Range

Set c = Cells(1,1)
Set c = Union(c,Cells(1,1).Dpendents)

If Not c Is Nothing Then c.select

End sub

これだと、.Dependentsの対象(1,1))がどこかで参照されていれば問題ないのですが、
参照していないとエラーになってしまいます。

何か方法はないでしょうか。
0527デフォルトの名無しさん2016/01/22(金) 00:36:15.19ID:gKLeKKXn
>>526

Sub Macro1()
  Dim c As Range

  Set c = Cells(1, 1)
  On Error Resume Next
  Set c = Union(c, Cells(1, 1).Dependents)
  On Error GoTo 0
  
  If Not c Is Nothing Then c.Select

End Sub
0528デフォルトの名無しさん2016/01/22(金) 04:12:46.72ID:7u0WrXxg
>>520
遅くなりました。ありがとうございます。忙しくてまだ試せていませんが、勉強します!
0529デフォルトの名無しさん2016/01/22(金) 07:09:40.91ID:hQb40WO/
>>520
何度もだせぇの書くなよ
質問者に悪いと思わんのかw
0530デフォルトの名無しさん2016/01/22(金) 08:58:29.38ID:1YiOGDCq
>>520
でもそれ、別に別の関数に投げるんでも全く問題ないわけだが。わざわざそういう
書き方した所で、大したメリットがない。
0531デフォルトの名無しさん2016/01/22(金) 09:52:25.70ID:p0qaIBjS
VBAでの再帰はかなり制約的に書かないといけないから使いにくい。
右からの畳み込みで表現するといいと思う。
0532デフォルトの名無しさん2016/01/22(金) 11:27:13.63ID:aQA1bWN9
>>524
遅くなってすいません。
思い通りに実行出来ました!ありがとうございました!
0533デフォルトの名無しさん2016/01/22(金) 12:38:57.86ID:6pvUxBV3
最近、If文の1行書きを知ったのですが、例えば、10個の分岐を10個のelseifを使って分岐させるのを1行書きに書き換えるとスピードはやはり落ちるものなんでしょうか?
elseifを使うと、該当したら他のelseifコードはスルーしますが、1行書きifを使うと、一応ぜんぶ判定しにいくので。しかし可読性は1行書きの方なんですよね〜
0534デフォルトの名無しさん2016/01/22(金) 13:04:43.89ID:1YiOGDCq
>>533
select文も使うのが普通ですよ。
0535デフォルトの名無しさん2016/01/22(金) 13:27:56.38ID:KXk9pxmd
>>533
100万回実行して、10ms未満の違いしかないようなことを気にしてもしかたがな。
0536デフォルトの名無しさん2016/01/22(金) 14:29:53.04ID:p0qaIBjS
>>533
複数の if が排他的でなかったら論理的に違うことをやってるのはわかるよね?
スピードなんかより
0537デフォルトの名無しさん2016/01/22(金) 19:44:34.49ID:turD6O79
'mycollectionという変数に、キーワードを100〜1000個入れて、
'セルの値と該当しない場合、その行を削除するみたいなことをやりたいのですが、
'こんなことは可能でしょうか?
Sub test01()
Dim lRow As Long, i As Long
'mycollection = "田中","山田","佐藤","鈴木","井上"・・・・・・・手動でキーワードを入れる
lRow = Cells(Rows.Count, 1).End(xlUp).row
For i = lRow To 2 Step -1
If Cells(i, 2).Value <> mycollection Then
Range(i & ":" & i).Delete
End If
Next i
End Sub
0538デフォルトの名無しさん2016/01/22(金) 20:00:51.94ID:ax/jel29
その例のような感じにするならキーワードを配列に入れておいてFilter()したらいいのでは
ただそのキーワードというもののあり方によってはフィルタ系の機能を使ったり正規表現を使った方がいいかもしれないぞ
0539デフォルトの名無しさん2016/01/22(金) 20:15:48.39ID:turD6O79
>>538
Filter使ったことないですが挑戦してみます。
キーワードは、文字列で完全一致のもので絞り込めたらいいのですが、filterで問題ないでしょうか?
0540デフォルトの名無しさん2016/01/22(金) 20:16:29.80ID:50X4sy+n
1000個ある名前をセルに入れるなり変数にセットするのを
vbaでやればあとはどうやってもできるんじゃないか
手動でキーワードを入れるってのをできるだけ
自動化するって問題だけだろ
0541デフォルトの名無しさん2016/01/22(金) 20:40:19.73ID:KhXVHsnG
>>529-531
より良いコード書いてからほざけ、ボケ
0542デフォルトの名無しさん2016/01/22(金) 20:43:53.69ID:turD6O79
>>540
mycollection(1000)として、filterをどのように使えばよいのでしょうか?
初心者ですいませんが、よろしければご教授お願いたします。

f = Filter(mycollection,.Cells(i,2).Value)
f(0)がエラーとなるならばといったようなコードでしょうか?
0543デフォルトの名無しさん2016/01/22(金) 21:11:50.86ID:pRZKDnHi
>>537
Sub Test(Keyword As Range, CheckList As Range, CheckColumn As Long)
Dim del As Range
For i = CheckList.Row To CheckList.Rows.Count
For Each x In Keyword
If Cells(i, CheckColumn) Like x Then
If del Is Nothing Then
Set del = Cells(i, 1).EntireRow
Else
Set del = Range(del, Cells(i, 1).EntireRow)
End If
End If
Next
Next
del.Delete
End Sub

Keyword = キーワードを入れたセルを指定する。
CheckList = チェックしたいリストの範囲を入れる。
CheckColumn = キーワードを判定したい行を入れる。
0544デフォルトの名無しさん2016/01/22(金) 21:15:29.86ID:p0qaIBjS
くそ、ケンカを売られたぞ
0545デフォルトの名無しさん2016/01/22(金) 21:18:48.91ID:d8M8QDrI
VBAの変数名ってどこまで大丈夫なの?
「らんま1/2」みたいな演算子っぽいのが混ざった名前も変数にしたいんだけど何か方法ある?
0546デフォルトの名無しさん2016/01/22(金) 21:44:34.68ID:50X4sy+n
おすすめ

strcollection=",佐藤,田中,長谷川,"
if instr( strcollection,"," & cells(n,1)) & ",")=0 then
cells(n,1).entirerow.delete
end if
0547デフォルトの名無しさん2016/01/22(金) 22:34:02.46ID:d8M8QDrI
文字列使ってる時点でないわー
0548デフォルトの名無しさん2016/01/22(金) 22:35:11.31ID:d8M8QDrI
らんま1/2ならいけるのかなー
全角を演算子と認識したりはしないよねさすがに
0549デフォルトの名無しさん2016/01/22(金) 22:46:22.46ID:tiw7VxmH
らんま2分の1にしろ

データとしてはあり得るけど変数名にしたいってのは考えにくいが
たくさんあるなら var1div2 とかでいいかも知れん
0550デフォルトの名無しさん2016/01/22(金) 23:24:56.91ID:d8M8QDrI
よく考えたらやっぱ変数名に漢字はねーわな
VBAコードで漢字の変数名見ただけでアホだコイツと思うわけじゃん
ローマ字だか英語だかよくわからん変数名をこれからも使っていくわ一生
05514992016/01/22(金) 23:26:21.02ID:uYyrweLr
>>527
ありがとうございます。
なるほど、on errorステートメントというのがあるのですね。

同一シート内の参照はこれで問題ないのですが、
シートをまたいだ参照先を得ることは、当然できませんでした。

やはり不可能なのでしょうか。
dependents以外に何か方法がありましたら教えてください。
0552デフォルトの名無しさん2016/01/22(金) 23:29:20.57ID:d8M8QDrI
全ドライブのxls*を開いて参照探してくるぐらいのことはやってから不可能って言えよー
0553デフォルトの名無しさん2016/01/22(金) 23:32:30.77ID:TWMQPGy9
>>546
これいいね
0554デフォルトの名無しさん2016/01/22(金) 23:38:00.02ID:r3UK0uLR
>>546
それやるならSplitで配列に変換した方が、その後の処理が簡単になりそう
0555デフォルトの名無しさん2016/01/22(金) 23:54:33.37ID:ax/jel29
>>542
今回問題なのはfilter(, , true, )のとき該当するものが無いと空の配列が返るってんで、それをどう数えたもんか?
ヘルプで言うと「配列に関するキーワード一覧」に書いてある(最近のバージョンでどういう目次構成か知らんけど)
UBound()で配列添字の最大値、LBound()で添字の最小値を取得できる、というのが使えるわけです

UBound()を使えばいいんだけど、ヘルプの該当ページにはどういうわけか
ここで知りたい空っぽのとき何が返るのかということと、Option Baseに言及していないという
VBA初見の人間を惑わすクソドキュメントになっている(もしかしたら最近のには書いてあるのかも)
そういうわけでどういうときどういう値が返るか試して、なんで-1なのか覚えてから使ってやってください
0556デフォルトの名無しさん2016/01/23(土) 00:27:23.02ID:5faR9SkP
filter質問主です。ありがとうございます。
今日は仕事が疲れすぎたので明日使わせて頂きます。
0557デフォルトの名無しさん2016/01/23(土) 03:58:47.08ID:NKVsIEv5
>>533
これは単純に見えて根深い問題で例えば FuncA、FuncBというBooleanの戻り値を持つメソッドがあったとして
If FuncA then
If FuncB Then

End If
End If

If FuncA And FuncB then

End If
とした場合これはあまり変わらないけど、もしFuncBで評価を求めるのに時間が掛かる場合、
Dim isDo As Boolean
isDo = True
If Not FancA Then
isDo = False
Else Not FancB Then
isDo = False
End If
If isDo then

End if
とかにした方が速い時がある。つまり、FancAで既に評価対象から外れた場合、FancBの評価を見る必要はない。
.NetにはOrElseやAndAlsoという、片方の評価が既に条件を満たしていればもう片方の評価はしないという命令があるからそれを使うけど、
VBAのAndやOrはどちらも評価してしまうため、場合によっては使用しないで上記のような回りくどい書き方をした方が速い場合もある。
もちろん、この方法は評価を求める以外必ず実行しなければいけない処理がFancBに書かれていれば使うことは出来ない。
だから単純に決められることではないので、状況を良く見てからどう作るか考えた方が良いかもね。
0558デフォルトの名無しさん2016/01/23(土) 04:07:52.25ID:NKVsIEv5
ああごめん、よく読んだら全て評価することは知ってたのか。
だったら後はメソッドとか使う場合で片側の処理が重い時があるんで、それに気をつけておけばいいと思うよ。
0559デフォルトの名無しさん2016/01/23(土) 04:31:04.25ID:JARUPMna
プロシージャ変数コメントに日本語バンバン使いまくったマクロをアメリカに送ったら
アメリカ人が発狂してたわw
0560デフォルトの名無しさん2016/01/23(土) 07:00:23.52ID:FWUKBiDK
日本で作ったものをアメリカ人が発狂する意味が分からんわ。

なんか英語に合わせてるけど。
0561デフォルトの名無しさん2016/01/23(土) 07:42:46.85ID:NVJ+LsdH
質問お願いいたします
エクセル上で業務マニュアルの作成をしております
セル内にタイトルを入力し、そこにハイパーリンクでそのタイトルの詳細のワードの保存先に飛ぶ形にしています
段々とタイトルも増えてきて、キーワードで検索をかけられるようにしたいと思って色々と調べていますが素人のため全く理解できない状態です
ユーザーフォームにテキストボックスを設けて、そこにキーワードを入力し、コマンドボタンで検索をかけたいですのですが、どのようにコードを入力したら宜しいでしょうか?
よろしくお願いします。
0562デフォルトの名無しさん2016/01/23(土) 13:26:21.35ID:9iIZKcSa
>>561
標準のフィルタ機能で十分だろ
0563デフォルトの名無しさん2016/01/23(土) 14:42:09.66ID:YJo138Ig
>>551
"エクセルでシートの参照先を調べたい"
でググってみると幸せになれるかも
0564デフォルトの名無しさん2016/01/23(土) 15:40:45.44ID:xVQLFIqO
2つの配列の値を比較してサンプルを数える(Countifs系)コードについてアドバイスお願いいたします。
ListP()as Currency とGPR() as Stringという配列で、欲しいサンプルは、以下の5個です。
ListPが60以上の、サンプル数、SamSix
ListPが60以上かつ、GPRが4つの文字列である数、SB,SHB,SL,SHL
For n = 1 To 1000
If ListP(n, x) = Empty Then
Exit For
ElseIf ListP(n,x) >= 60 Then
SamSix = SamSix + 1
If GPR(n, x) = "B" Then
SB = SB + 1
ElseIf GPR(n, x) = "HB" Then
SHB = SHB + 1
ElseIf GPR(n, x) = "L" Then
SL = SL + 1
ElseIf GPR(n, x) = "HL" Then
SHL = SHL + 1
End If
End If
Next n

このループを多用(約1万回)しているのですが、ループを使用しなかったり、もっとスピードの出るアイデアはございませんでしょうか?
5個のサンプルを取得できれば満足です。
よろしくお願いいたします。
0565デフォルトの名無しさん2016/01/23(土) 17:01:45.55ID:2O2OeDHJ
>>564
本来だったら配列を昇順ソートしてからバイナリサーチやれば圧倒的に速くなるがね。
0566デフォルトの名無しさん2016/01/23(土) 17:20:35.71ID:Ub1PC2hC
>>564
CurrencyならEmptyチェックする必要ないんじゃない
後はそこだけで速くするのは難しそう

俺なら配列に値セット/変更する時に値チェックしてカウントするようにするかなぁ
案外配列じゃなくセルに展開して、カウントする数式入れたセル見た方が早いかもしれん
0567デフォルトの名無しさん2016/01/23(土) 18:14:06.44ID:5/HkQk/m
{=SUM(IF((B1:B1000="SHL")*(A1:A1000>60),1,0))}

配列数式でできた
0568デフォルトの名無しさん2016/01/23(土) 19:34:03.73ID:7fmpCrJt
>>564
この状態でどれぐらいの時間がかかってるのか教えろハゲ
0569デフォルトの名無しさん2016/01/23(土) 19:41:11.42ID:UyBsumDJ
>>565
調べてみましたが、やや難しそうです。(:;)
>>566
Emptyは必要ないですね//
配列をA列とB列にいったん貼り付けてワークシート関数で調べる方法ですよね。
ひとまず、やってみます!
>>567
使い方教えていただけますでしょうか?
SHL = WoksheetFunction.Countifs(Range( ),">60",Range( ) ,"HL")みたいな形で使えそうです。
0570デフォルトの名無しさん2016/01/23(土) 19:45:35.16ID:G5thoHAj
バリアント配列をダブルの配列にどうやってキャストすればよいでしょうか
0571デフォルトの名無しさん2016/01/23(土) 19:46:50.85ID:UyBsumDJ
>>568
他のループも合わせてからの推測ですが50msぐらいです。
0572デフォルトの名無しさん2016/01/23(土) 19:54:39.20ID:d6eRWlmR
質問です。

エクセルの1シートを1テーブルに見立ててデータの抽出、計算をしようと思っています。
ただデータの検索をクエリを書くのと同様に行えるのかが気になっています。
例えばSQLだとselect * from t where c < 10 and c > 0 と範囲検索が簡単に出来ますが、
エクセルvbaだとfind、findnext結果を順々に見ていくしかないんでしょうか?
access使えと言われるかも知れませんが自分も作ったものを使う人も
使ったことないので使う予定でないです。
0573デフォルトの名無しさん2016/01/23(土) 19:55:52.13ID:UyBsumDJ
>>543
サンプルで作ってみたのですが、思った通りの動作ができません・・・
改善点をお分かりになりますでしょうか?

Sub jikkou()
Dim Keyword As Range
Dim CheckList As Range
Dim Checkcolumn As Long

With ActiveWorkbook.Worksheets("Sheet1")

Set Keyword = .Range("F2:F4") '順に田中、山田、井上
Set CheckList = .Range("A2:C9")
Checkcolumn = 2

Call Test(Keyword, CheckList, Checkcolumn)

End With
End Sub
0574デフォルトの名無しさん2016/01/23(土) 20:12:01.85ID:9iIZKcSa
>>573
たぶんSheet1に書いてない
0575デフォルトの名無しさん2016/01/23(土) 22:41:50.10ID:rT+4QcAA
>>572
使ったことないけどODBCでExcel読めるんだから同じように出来るんじゃなかろうか
0576デフォルトの名無しさん2016/01/23(土) 22:56:00.52ID:VVSBE+9k
>>572
ODBCだけど
Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)}
で普通にWHEREが効いたよ。
0577デフォルトの名無しさん2016/01/23(土) 23:11:55.10ID:Lyhv/FJb
選択した行の下に行を挿入したい
0578デフォルトの名無しさん2016/01/23(土) 23:31:40.97ID:d6eRWlmR
>>575
>>576
成る程!
エクセルからODBCする発想はありませんでした。
ありがとうございます。
0579デフォルトの名無しさん2016/01/24(日) 00:52:16.69ID:3BacWB5Q
質問
union(range("A1:A3"),range("A4:A6")).select
とすると A1:A6がセレクトされてしまいます
A1:A3,A4:A6とばらばらに選択させるにはどうしたらいいのでしょうか
0580デフォルトの名無しさん2016/01/24(日) 01:02:59.65ID:8yNc66kp
>>579
Range("A1:A3, A4:A6").Select
0581デフォルトの名無しさん2016/01/24(日) 01:24:07.69ID:3BacWB5Q
>>580
Rangeを使った場合
少ないとOKなのですが
Range("A1:A3,A4:A6,A7:A9,A10:A12,A13:A15,A16:A18,A19:A21,A22:A24,A25:A27,A28:A30,A31:A33,A34:A36,A37:A39,A40:A42,A43:A45,A46:A48,A49:A51,
A52:A54,A55:A57,A58:A60,A61:A63,A64:A66,A67:A69,A70:A72,A73:A75,A76:A78,A79:A81,A82:A84,A85:A87,A88:A90").Select

多いとエラーになってしまうんですよ
Range("A1:A3,A4:A6,A7:A9,A10:A12,A13:A15,A16:A18,A19:A21,A22:A24,A25:A27,A28:A30,A31:A33,A34:A36,A37:A39,A40:A42,A43:A45,A46:A48,A49:A51,
A52:A54,A55:A57,A58:A60,A61:A63,A64:A66,A67:A69,A70:A72,A73:A75,A76:A78,A79:A81,A82:A84,A85:A87,A88:A90,
A91:A93,A94:A96,A97:A99,A100:A102,A103:A105,A106:A108,A109:A111,A112:A114,A115:A117,A118:A120,A121:A123,A124:A126,A127:A129,A130:A132,
A133:A135,A136:A138,A139:A141,A142:A144,A145:A147,A148:A150,A151:A153,A154:A156,A157:A159,A160:A162,A163:A165,A166:A168").Select
0582デフォルトの名無しさん2016/01/24(日) 04:40:05.83ID:QDUQ11dL
文字列の長さが256文字以上はエラーになるからね
union使いたくないってことなら適当な長さで区切って処理していくしかないね
0583デフォルトの名無しさん2016/01/24(日) 08:31:19.18ID:P3FwbSRP
そもそもマクロでSelect使うのってユーザーに見せる場合だけだから広範囲選択しないよな
0584デフォルトの名無しさん2016/01/24(日) 08:43:14.19ID:OLLhmKw5
ばらばらに選択させなきゃならない理由がわからない
0585デフォルトの名無しさん2016/01/24(日) 10:14:46.19ID:EERzV+Td
セルの色変えるとか
0586デフォルトの名無しさん2016/01/24(日) 10:17:27.22ID:U2BkwJ1U
選択した行の下に行を挿入したい
0587デフォルトの名無しさん2016/01/24(日) 10:54:59.26ID:jAR/7hik
26 名前:名無しゲノムのクローンさん[] 投稿日:2015/05/07(木) 22:53:53.09 ID:dgLqosr8Q
理研の職員がwinnyでウィルス感染→個人情報流出?2
http://wc2014.2ch.net/test/read.cgi/rikei/1284822425/

27 名前:名無しゲノムのクローンさん[] 投稿日:2015/05/07(木) 22:59:50.36 ID:dgLqosr8Q
http://www.riken.jp/research/labs/bsi/behav_neurophysiol/

姓が変わってる
0588デフォルトの名無しさん2016/01/24(日) 11:50:42.56ID:OLLhmKw5
>>586
Selection.Offset(1).Insert
0589デフォルトの名無しさん2016/01/24(日) 12:16:54.98ID:CzW7EpCe
>>581
Range("A1:A168").Select
0590デフォルトの名無しさん2016/01/24(日) 13:20:11.62ID:9Re4pm4/
>>570
これ誰かわかりませんかね?
単純にループで要素をとって変換してるんですけどもっと効率よく書く方法知りたいんですけど
0591デフォルトの名無しさん2016/01/24(日) 14:43:43.40ID:kddwELVp
>>590
まず目的がわからない。Variant配列のままではできないことが何かあるの?
0592デフォルトの名無しさん2016/01/24(日) 14:48:25.07ID:Qp0DBCKE
>>590
それでいいだろ
型が全然違うものをどうやってキャストするつもりなんだよ?
0593デフォルトの名無しさん2016/01/24(日) 19:54:05.71ID:ZDzZlqZ2
ダブルからバリアントはできるから
なんでできないんだってクレームだろうね
0594デフォルトの名無しさん2016/01/24(日) 21:03:26.31ID:bw3MWu8t
>>593
> ダブルからバリアントはできるから
はあ?
0595デフォルトの名無しさん2016/01/24(日) 21:18:18.78ID:kddwELVp
たぶん質問者はいちいちコピーを取らずに一瞬でできる方法を求めているんだろう。
それは原理的に無理だ。
0596デフォルトの名無しさん2016/01/24(日) 21:31:15.52ID:LpWoFh+w
>>592
オブジェクト指向はそういうの普通にやりますけど。
あれですか?
C言語しかしらない人ですか?
0597デフォルトの名無しさん2016/01/24(日) 21:51:00.06ID:kddwELVp
>>596
つ 配列
0598デフォルトの名無しさん2016/01/24(日) 22:03:39.50ID:ZDzZlqZ2
オブジェクト指向のは
ポインタ渡すだけじゃないの
int型をオブジェクト指向のバリアントに渡すのは結局ループさせてると思うけどw
0599デフォルトの名無しさん2016/01/24(日) 22:39:14.22ID:ZDzZlqZ2
そもそも関心を持って>>570にキャストって何?って聞かないと
できるなら、そこからはじめよう
0600デフォルトの名無しさん2016/01/24(日) 22:42:25.30ID:vxhR0ZQc
やりたいこととしてはc++で作ったdllに配列を渡したいけどvariantの配列は呼び出し規約に引っかかって渡せないからdoubleの配列にキャストしたいということです

今やってるのはセルのレンジをvbaでvariant配列として受ける→doubleの配列に変更したいというわけです。
0601デフォルトの名無しさん2016/01/24(日) 22:46:42.39ID:kddwELVp
>>600
dllを改変してVariant配列を受け取るようにしなさい。
C++側で工夫すれば中身がdouble配列でもinteger配列でもハンドリングできる。
0602デフォルトの名無しさん2016/01/24(日) 22:49:15.03ID:kddwELVp
配列の先頭をByRefで渡しつつ長さも別に渡してるんでしょ?
0603デフォルトの名無しさん2016/01/24(日) 23:16:09.36ID:ZDzZlqZ2
dllでdoubleの配列受けるのは仕組みがわかればできるとして
valiantは仕組みがわかったとしてプログラムは難しいというか
メリットがあるのかどうか結局
doubleの配列に渡してdllに渡すプログラムになるだろ
正規ユーザーならマイクロソフトに聞いたらどうだ
0604デフォルトの名無しさん2016/01/24(日) 23:31:31.52ID:CzW7EpCe
配列の型を丸ごと変換なんて、ループで代入するしかない
それがVBAの決まり
0605デフォルトの名無しさん2016/01/25(月) 00:00:11.24ID:OVAwI95a
>>581
自己レス
名前機能を組み合わせて最大1291の連続するセル範囲を選択することに成功しました
連続する単一セルならば最大2788
マクロだとこれが限界なのかなぁ
0606デフォルトの名無しさん2016/01/25(月) 03:16:47.81ID:x8k2PtIT
マクロでやる意味あるのか?
0607デフォルトの名無しさん2016/01/25(月) 06:54:36.14ID:ZbEgu09E
>>604
そもそも変換どころか、キャストしたい
って話だしな
「自分のやりたいことは簡単に書ける方法が絶対あるはず教」の信者さんでしょ
0608デフォルトの名無しさん2016/01/25(月) 07:04:40.46ID:ZbEgu09E
>>603
Variant の仕様は MSDN に書いてあるし、API もあるから難しくはないよ
double しか渡されない(double 以外は保証しないよ)と言う仕様でいいなら double の配列の読み書きとたいして変わらん

お前は、それ以前に
> doubleの配列に渡してdllに渡すプログラムになるだろ
と言うワケわからん日本語書くのをやめれ
0609デフォルトの名無しさん2016/01/25(月) 07:25:28.63ID:kQZEtAkw
>>596
へえ。Object指向に普通にVariant型があると思ってるのか?
馬鹿だろお前。Object指向だろうがなんだろうがキャスト出来ないものはキャスト出来ねーよ。
Variant型変数にDouble型の配列を入れたと言うなら型変換しなくても使えるが、
Variant型の配列に突っ込んだ値をと言ってるんだろ?
て言うか、C++なんて糞言語ここで持ち出すなよ。ここ何のスレだか知ってて書いてるのか?
0610デフォルトの名無しさん2016/01/25(月) 07:58:42.36ID:PYOqNH8O
>>541
0611デフォルトの名無しさん2016/01/25(月) 08:16:46.72ID:Ymzzk2Ep
Java屋じゃね?
0612デフォルトの名無しさん2016/01/25(月) 10:30:52.42ID:Ymzzk2Ep
Variantだと中に何が入っているかのチェックもいるし、配列だとしても何の配列かによって処理を変えなきゃいけないなど多少は面倒。
でも一度作ってしまえばそれだけで対応できるから、型別に配列を扱うより結局ラクになる。
0613デフォルトの名無しさん2016/01/25(月) 19:45:11.59ID:h5WdPhTZ
解説書「Excelで学ぶ物理シミュレーション」が変数定義してなかったので、変数定義しながらやってるのですが、
以下の「ActiveSheet〜」のところで、を「変数が定義されていません」とエラーが出てしまいます。

ActiveSheetはどう変数定義すればよろしいのでしょうか?
--
Sub particles()
Worksheets(2).Activate

Dim x0, y0, x1, y1, x2, y2, r As Integer

x0 = 300
y0 = 300
x1 = 0
y1 = 0
x2 = 0
y2 = 100
r = 20

AcitiveSheet.Shapes.AddShape(msoShapeOval, x0 + x1 - r, y0 + y1 - r, 2 * r, 2 * r).Select
(以下略)
0614デフォルトの名無しさん2016/01/25(月) 20:20:34.36ID:tSs+i5nu
そのままのコードで円が表示されたけど
何かの理由でAddShapeが失敗してるとか
0615デフォルトの名無しさん2016/01/25(月) 20:20:39.23ID:EI0NNUYr
>>613
スペルミス よく見てみ
0616デフォルトの名無しさん2016/01/25(月) 20:30:20.64ID:S6u4QlwX
VBAなんてやめてHaskell使いなよ。
こんな数学的に説明できない糞言語使いにくいでしょ。
0617デフォルトの名無しさん2016/01/25(月) 20:32:24.39ID:h5WdPhTZ
>>615
バカでした。すみません。ありがとうございます。
0618デフォルトの名無しさん2016/01/25(月) 21:35:58.44ID:bhGrjqTq
苦労してやっとVBA覚えたのに、さらに他の言語を覚えるなんて嫌だ
言語を覚えるだけで人生終わっちまう
しかもHaskellって関数型ってヤツで、地球人でも特別な人間にしか理解できないヤツだろ
0619デフォルトの名無しさん2016/01/25(月) 21:39:21.69ID:6cjSwNuY
vbeで、「変数 = 」って入力して他の変数コピペしようって
カーソル移動するとエラーメッセージボックスがでてうっとうしいんですが
どうすればいいですか?
0620デフォルトの名無しさん2016/01/25(月) 21:43:55.44ID:tSs+i5nu
vbeで、他の変数コピーして「変数 = 」って入力してペーストすればどう
0621デフォルトの名無しさん2016/01/25(月) 21:44:00.33ID:EI0NNUYr
>>619
自動構文チェックを off にする
0622デフォルトの名無しさん2016/01/25(月) 22:02:38.95ID:zDVscmGV
やばいやばい
0623デフォルトの名無しさん2016/01/25(月) 22:06:25.75ID:xK2Lk5XQ
>>621
ありがとうございます!
0624デフォルトの名無しさん2016/01/25(月) 22:34:29.77ID:tSs+i5nu
とびぬけたベリー!ばか!アホ!
0625デフォルトの名無しさん2016/01/25(月) 23:39:17.97ID:zDVscmGV
>>616
Haskellでワークシートのデータに簡単にアクセスできてDBも読めるんなら使ってもいいぞ。
0626デフォルトの名無しさん2016/01/26(火) 03:57:19.80ID:iVTpdqcA
○○言語がクソっていうのは、対戦系のゲームで自分が勝てない事を根拠にクソゲーと言うのに似ている。
0627デフォルトの名無しさん2016/01/26(火) 08:43:18.81ID:qqVXY/GV
>>616
説明できないっけ。結構なレベルまで出来るけどなあ
0628デフォルトの名無しさん2016/01/26(火) 09:18:40.01ID:5vRCDG8F
>>616
使う環境が違うんだからそもそも比較の対象にならん。
純粋に言語部分だけで比較するんだと言うなら勝手だけど。
0629デフォルトの名無しさん2016/01/26(火) 18:43:46.24ID:ZKGLEkP4
If objtag.innertext = "≫|" Then

この特殊記号をVBEに書き込む方法を教えてください
0630デフォルトの名無しさん2016/01/26(火) 19:08:50.23ID:Le1AWrDO
そのままコピペしても文字化けせず 普通に書き込めるが?
0631デフォルトの名無しさん2016/01/26(火) 20:11:57.90ID:s2VOqCHE
?(ハート)はダメだけど♪はおk
0632デフォルトの名無しさん2016/01/26(火) 20:21:55.06ID:Ss3eGzB+
>>618
関数型が難しいとか嘘まき散らしてるのはF欄卒の低能だよ。
国立の情報系出てれば普通に使える。
0633デフォルトの名無しさん2016/01/26(火) 20:35:20.49ID:s2VOqCHE
最近じゃVBAでもできるみたいだし
0634デフォルトの名無しさん2016/01/26(火) 20:36:17.62ID:an9o+4d6
>>630
自分のVBAには貼り付けできないんです…
なんでだろう…
0635デフォルトの名無しさん2016/01/26(火) 20:44:20.93ID:s2VOqCHE
>>634
エディターの設定でフォントは何になってる?
0636デフォルトの名無しさん2016/01/26(火) 20:47:22.36ID:an9o+4d6
arial unicode MS(日本語)です。
まずいのでしょうか?
0637デフォルトの名無しさん2016/01/26(火) 20:53:14.53ID:s2VOqCHE
>>636
そのフォントだったら自分のとこでも大丈夫だなあ...
0638デフォルトの名無しさん2016/01/26(火) 23:13:32.78ID:XA1jjBiE
windowsがXPなんじゃね
0639デフォルトの名無しさん2016/01/26(火) 23:59:27.82ID:Ss3eGzB+
だからLinux使えと言ってるのにまったく。
0640デフォルトの名無しさん2016/01/27(水) 02:32:20.61ID:FFJgZUiX
Excelワークシート関数って参照透明性があるという点だけ見れば関数型言語っぽくね?
0641デフォルトの名無しさん2016/01/27(水) 09:55:13.64ID:AxnKqjSh
linuxて研究機関でもあるまいし
0642デフォルトの名無しさん2016/01/27(水) 16:56:55.10ID:M2nAG8/t
質問です。

cnt = 5 '(適当)
For n = 1 to cnt

if n = 1 then cnt = a + b


next n

このようにForLoopのcntをfor内で新たに出す場合、Forループの回数は新たに書き換えられるのでしょうか?
つまり、Forは5回で終わるか、新たに書き換えられるかという問題です。
私の実験で4回中1回書き換えが行われませんでした。詳しい方、ご教授お願いいたします。
0643デフォルトの名無しさん2016/01/27(水) 17:06:25.62ID:peQY74Nr
>>642
VBAでのドキュメントが見つからないが
Forの終了条件の変数ははじめに評価されたあと再評価されないはず
つまりその例ではcntを書き換えてもnは1から5までしかループしないはず
試してもそうなってるけど、そうならないようなら環境とそのコード教えてくれ
0644デフォルトの名無しさん2016/01/27(水) 21:23:26.05ID:Tz0t5sQ9
>>643
怪しかったので、cntを先に求めるよう修正しました。勘違いがあったかもしれません。
再評価をしないということがわかり勉強になりました。ありがとうございます。
0645デフォルトの名無しさん2016/01/27(水) 21:59:35.79ID:i9TI+OhT
再評価しないから安心して
For i = LBound(x) To UBound(x)
って書けるという面もある。
0646デフォルトの名無しさん2016/01/27(水) 23:03:39.45ID:8GEb3XG2
いやいや、終了条件をループの中で変えたいときはDo Loopを使うんだってばよ・・・
0647デフォルトの名無しさん2016/01/28(木) 00:16:58.40ID:w3bB+ovg
まぁ挙動を知っておくのは大事かも知れないけど、
実際使うかどうかはまた別だわな
0648デフォルトの名無しさん2016/01/28(木) 20:19:00.28ID:l8d43dgO
i = UBound(arr)
For i = 1 to i
Next

みたいにリサイクルしちゃう事はよくある。
0649デフォルトの名無しさん2016/01/28(木) 20:55:34.37ID:87VXcHuk
>>648
たまにあるならまだしもよくあるなら向いてない
特にループ変数に i とか使うのはまだわからんでもないが
> i = UBound(arr)
とか書く奴は単なるバカ
0650デフォルトの名無しさん2016/01/28(木) 21:00:56.80ID:YELEWwrc
i = UBound(arr) To 0 Step -1
はたまにやるけどな
0651デフォルトの名無しさん2016/01/28(木) 21:22:27.24ID:l8d43dgO
>>649
VBAは変数を宣言するともれなく初期化がついてくるから
これを抑制する為に可読性を損なわない様に工夫しつつリサイクルというのは割と普通だと思うんだけどな。

あとそれなりにVBAをいじってきて何か自負が芽生えてきた時期なんだとは思うけど
非常に限定された例でバカだの向いてないだの言うのは止めた方がいいぞ。
0652デフォルトの名無しさん2016/01/28(木) 21:22:55.28ID:9fWHkl7R
basicなんだから
メモリとか考えずにどういう仕様か注釈なくても
わかるように書け
i = UBound(arr) To LBound(arr) Step -1
と徹底してたら
i = UBound(arr) To 0 Step -1
が特別だと区別がつく
0653デフォルトの名無しさん2016/01/28(木) 21:27:03.38ID:NmcV3G4I
>>648
これって何かいいことあるの?何か悪いことあるの?>>651
0654デフォルトの名無しさん2016/01/28(木) 21:28:24.36ID:Px8oTJsB
basicでなければわからんように書いてもいいのか?と問いただしたい気持ち
0655デフォルトの名無しさん2016/01/28(木) 21:41:49.39ID:Og0hCXDt
VBAならたぶん正常に動く
他の言語だとループの終了値が再評価されてループ回数がおかしくなる場合があるし、
それを逆手に取るようなコードをわざと書く場合もある
言語仕様をいちいち確認しなきゃならんようなコードは悪手かなあ
0656デフォルトの名無しさん2016/01/28(木) 21:58:29.74ID:BRaPySJX
>>653
良いことなんて特に無い
だって普通に
For i = 1 To UBound(arr)
って書いたほうが読みやすいし行数も少ない
0657デフォルトの名無しさん2016/01/28(木) 22:11:22.26ID:w3bB+ovg
何かVB6じゃUsingが使えないから
With New とかやるって旧VBスレで言ってたのを思い出した
0658デフォルトの名無しさん2016/01/28(木) 22:36:03.92ID:zD2EcWsW
>>651
> VBAは変数を宣言するともれなく初期化がついてくるから
> これを抑制する為
抑制する理由書いてみ
君のアホさがわかると思う

> 非常に限定された例で
限定されてると思ってる時点で何も理解してないことが良くわかる w
0659デフォルトの名無しさん2016/01/28(木) 23:00:29.67ID:D0vEBF/4
すいません、
2つセルのアドレスを取得したのですが、
そこまで何列離れているかが知りたいのですが、
どうやって求めれば良いでしょうか?
0660デフォルトの名無しさん2016/01/28(木) 23:25:11.76ID:BRaPySJX
>>659
その二つのセルのColumnを引き算したら分かるんでないの?
0661デフォルトの名無しさん2016/01/28(木) 23:27:32.34ID:D0vEBF/4
>>660
ありがとうございます。
0662デフォルトの名無しさん2016/01/28(木) 23:32:05.18ID:YELEWwrc
まあ LBound も UBound は十分速いから気にする必要はもともとないけどな
0663デフォルトの名無しさん2016/01/28(木) 23:33:03.80ID:YELEWwrc
誤 LBound も UBound は
正 LBound も UBound も
0664デフォルトの名無しさん2016/01/29(金) 00:42:17.43ID:/cWmSx8U
そもそもVBAでは宣言と同時に代入するような構文はないし
宣言時の初期化を抑制する構文もないから
宣言と同時に変数を初期化するのを抑制なんてできないわけだが

まあ変数の数を減らす事によってその分のメモリと初期化時間を節約できるのは確かかもしれんが
それを当たり前にやらないとダメなような環境なら、VBA使うのがそもそも間違ってる
巨大な配列ならまだしも、可読性落としてまでやるような事じゃない
0665デフォルトの名無しさん2016/01/29(金) 00:47:48.27ID:/cWmSx8U
ああ
For i = 1 to i
なんてコード書いて可読性が落ちてないとか言う主張してるのか
俺とは完全に別次元の人だわ
俺の意見も、このスレのほとんどの人の意見も忘れてくれていいんじゃない
0666デフォルトの名無しさん2016/01/29(金) 00:52:17.65ID:u6PJbYuv
そもそもループカウンタ変数なんて使うのが時代遅れ
0667デフォルトの名無しさん2016/01/29(金) 00:57:19.20ID:mcgCrfPK
えっ
それ以外に効率的にやる方法あんの?
0668デフォルトの名無しさん2016/01/29(金) 01:38:47.60ID:u6PJbYuv
for each
0669デフォルトの名無しさん2016/01/29(金) 01:52:49.80ID:DJFadGs/
他の言語ではFor Each的なループが主流になってるが
VBAではその存在を知らない人さえいるんじゃないかな
0670デフォルトの名無しさん2016/01/29(金) 02:08:08.30ID:EuNL8AIn
はてさてFor EachはVBAではご存知の通り配列では使えない。

ループの対象がRangeとかであれば有効だろうけど、配列の中をガラガラと回す機会も少なくは無いだろう。
そうしたとき、配列の代わりにCollectionやScripting Dictionaryを使ってまでFor Eachを使うことによって
何の恩恵が受けられるのだろうか?

そもそもそれを言ってしまうのであればVBA自体が時代遅れの言語な訳だから
それに合わせて使い分けなければならないんじゃないかな。
0671デフォルトの名無しさん2016/01/29(金) 02:19:34.89ID:u6PJbYuv
使えるだろ何言ってんだハゲ
0672デフォルトの名無しさん2016/01/29(金) 03:03:52.29ID:EuNL8AIn
本当だ。
受け取り側をVariantに設定すれば出来るんだな。済まん。
0673デフォルトの名無しさん2016/01/29(金) 04:05:19.53ID:vu3Qsjkg
なぜ理解していないのに文句を言ってしまうのか
0674デフォルトの名無しさん2016/01/29(金) 06:41:43.06ID:zKTo8s/w
For Eachの使いにくさはこのスレでも何度か指摘されてるだろ。
まずひとつのシーケンスしか扱えないのがつらいし、コピーベースだから効率的でもない。
結局はカウンタを使うことが多い。
0675デフォルトの名無しさん2016/01/29(金) 06:49:02.29ID:zKTo8s/w
とにかくVBAのFor Eachは全然ダメだ。
0676デフォルトの名無しさん2016/01/29(金) 08:18:18.44ID:n4JmA3/2
>>674
0677デフォルトの名無しさん2016/01/29(金) 10:09:18.99ID:eO+SXLpF
>>649
ループの変数にiではなくて何を使うの?
素朴な疑問です。
行をループさせるときはrとか使うけど、なんてない?ループのときはiって書く癖が付いてる。
0678デフォルトの名無しさん2016/01/29(金) 10:21:38.80ID:n4JmA3/2
>>649は典型的な馬鹿
0679デフォルトの名無しさん2016/01/29(金) 10:26:37.59ID:Cfolpywf
>>677
よく詠め
0680デフォルトの名無しさん2016/01/29(金) 11:26:35.90ID:zKTo8s/w
風流だな
0681デフォルトの名無しさん2016/01/29(金) 12:41:18.50ID:OZjYu77z
>>678
>>658
> > VBAは変数を宣言するともれなく初期化がついてくるから
> > これを抑制する為
> 抑制する理由書いてみ
に答えてからほざかないとかわいそうな奴にしか見えないぞ w
0682デフォルトの名無しさん2016/01/29(金) 15:51:56.92ID:zKTo8s/w
>>666
VBAではループカウンタを使うのがベター、という結論でいいのか?
0683デフォルトの名無しさん2016/01/29(金) 16:10:50.46ID:u6PJbYuv
いいわけないだろハゲ
0684デフォルトの名無しさん2016/01/29(金) 16:23:04.02ID:zKTo8s/w
>>683
使いにくさは認識しているだろババア
0685デフォルトの名無しさん2016/01/29(金) 16:33:33.32ID:u8nDFqF+
要素の順序に関係なくとにかく列挙したい → For Each
要素の順序に合わせてやりたい処理がある → ただのFor
それぞれ使いどころが違うんだから
こっちがベターとか、あっちは時代遅れとか
どちらも的外れな気がするけど
0686デフォルトの名無しさん2016/01/29(金) 18:20:31.74ID:/cWmSx8U
ああ、俺、For Eachで特定の順序で列挙される事を期待してるコード書いてるわ

今まで問題になった事ないけど、これからも問題にならないように祈ろう
0687デフォルトの名無しさん2016/01/29(金) 19:11:10.65ID:zKTo8s/w
For Each自体は良いものだ。しかし、

ひとつのシーケンスしか扱えない
→ arr1(i) + arr2(i) を簡単に書けない

同時に複数の要素にアクセスできない
→ arr(i+1) - arr(i) を簡単に書けない

コピーなので代入ができない(配列)
→ Each z... z = z * 2 とできない

コピーコストがある(配列)
→ ただループを回すだけで時間がかかることがある

というようなトレードオフがある。
最初の二つは標準のコンテナライブラリが充実してる言語だと大した問題にならないが、VBAにはそういうものがない。
For Eachの使いどころは相対的に狭いと思う。
0688デフォルトの名無しさん2016/01/29(金) 20:54:13.12ID:GirFGy8a
>>687
トレードオフという言葉の使い方が変だと思う
矢印の前後が同じ事の言い換えにすぎないので
そういうのはトレードオフとは言わない
0689デフォルトの名無しさん2016/01/29(金) 21:08:56.19ID:zKTo8s/w
>>688
おお、そうだな。
違うことを書いたり消したりしてるうち「トレードオフ」だけ変に残ってた。

「というような難点もある。」
に言い換えます。
0690デフォルトの名無しさん2016/01/29(金) 22:26:51.74ID:vu3Qsjkg
「For文とForEach文」っていう対比だけで考えている限り、効率的に使い分けるってのは出来なさそうだな
0691デフォルトの名無しさん2016/01/29(金) 22:41:31.80ID:Cfolpywf
VBAのFor Eachは順序が保障されてるってどっかで見たような
記憶違いだったかなあ
0692デフォルトの名無しさん2016/01/29(金) 22:46:41.43ID:3bay7YeG
VBAでIE操作する際にUA偽装することはかのうでしょうか?
0693デフォルトの名無しさん2016/01/29(金) 22:56:37.31ID:xL/2dOZ2
コレクションはaddした順になってるってどっかで読んだな
0694デフォルトの名無しさん2016/01/29(金) 22:59:33.85ID:SzcTnZpo
>>692
できるはずだけど
0695デフォルトの名無しさん2016/01/29(金) 23:03:44.66ID:x5GxlBbm
>>694
どのようにやるのか教えていただけませんか?
0696デフォルトの名無しさん2016/01/29(金) 23:11:05.17ID:zGtXhGWM
>>695
それはトレードオフだな
0697デフォルトの名無しさん2016/01/29(金) 23:33:04.61ID:SzcTnZpo
>>695
ieオブジェクトから探してみたら
useragentプロパティとかそれらしいの
または偽装のpostデータを送信すれば偽装できる
0698デフォルトの名無しさん2016/01/30(土) 00:18:29.02ID:WsSatOj8
>>695
Navigateメソッドに Headersパラメータあるよ ここで指定する
0699デフォルトの名無しさん2016/01/30(土) 01:09:42.28ID:QZN0GaAw
符号なし32bit値を普通に扱いたいのだが
所々にオーバーフローの罠が仕掛けられている
どうしたものか
0700デフォルトの名無しさん2016/01/30(土) 02:47:34.76ID:wZlCWGLp
>>699
64bit版ならlonglongをマスクして使う
32bit版ならあきらめてVBを使うとか文字列で処理するとか
0701デフォルトの名無しさん2016/01/30(土) 21:48:03.29ID:9q1UC1/m
(単位百万円)ってよく書いてるだろ
0702sage2016/01/30(土) 22:42:24.01ID:DtupSwoU
貼り付けをする時は、「値のみ貼り付け」のみにしたいのですが

Sub 値貼り付け()
Dim SEL As String
SEL = ActiveCell.Address
On Error Resume Next
Range(SEL).PasteSpecial Paste:=xlValues
Application.CutCopyMode = False
End Sub


これで制御できたと思ったんですが、ENTERキーを押すと
数式まで貼り付けられてしまうのでENTERキーでも「値のみの貼り付け」はできないでしょうか?
0703デフォルトの名無しさん2016/01/30(土) 23:17:21.27ID:WsSatOj8
>>702
やりたい事がわからない もうすこし詳細な説明をして下さい

そのマクロとENTERキーの関係とか
0704sage2016/01/30(土) 23:53:42.67ID:DtupSwoU
>>703
週のはじめに各従業員が行先と訪問時間などを入力する
表を作りたいのです。
毎週、お客さんのところに行く曜日や時間が変わるので
コピペして運用したいのです。

しかしあまりPCに不慣れな人もいて、コピペしてしまい
関数が乱れてしまいます。

そこで、貼り付けを制御をしたいです。
上のマクロで用意してあるフォームボタンだけなら
問題ないのですが、コピーした後にENTERキーを押してしまう
人がいて困っています。
0705デフォルトの名無しさん2016/01/31(日) 00:29:23.55ID:GHH7Ytwp
>>704
データ入力者が複数いる場合は、ワークシートに時間などを直接入れるんじゃなくて
入力フォームを使うのが定番の方法です
0706デフォルトの名無しさん2016/01/31(日) 00:43:56.18ID:MM1DiLhb
>>704
だいたいさ、なんでお前が
考えることを放棄してるような感じになってるの
どこの能力が足りないわけ
0707デフォルトの名無しさん2016/01/31(日) 00:53:42.54ID:hQeW+ttM
>>704
コピペ運用そのものを やめて見直すべきだと思うよ

どうしてもというなら
↓のようにCopy/Paste 両方ボタンにして モジュール変数を使うとか

Private BUF As Variant

Sub 値Copy()
BUF = ActiveCell.Value
End Sub

Sub 値Paste()
ActiveCell.Value = BUF
End Sub
0708デフォルトの名無しさん2016/01/31(日) 14:40:54.90ID:yZ5QuPZH
IFの入れ子は何個まで書きますか?
皆さんの経験上大体何回ぐらいが限界だとおもいますか?
0709デフォルトの名無しさん2016/01/31(日) 14:55:35.44ID:fJmO8CE1
純粋にIfだけの入れ子にするくらいなら、

Dim S As Long
If (条件A) Then S = 1
If (条件B) Then S = S + 2
If (条件C) Then S = S + 4
...
Select Case S
Case 1

Case 2

...

みたいな形にした方がいいと思う。
途中にループとか挟まるなら関数として分けろ。
0710デフォルトの名無しさん2016/01/31(日) 17:31:33.51ID:oGNCocg8
初稿では基本入れ子にならないように書いてる
でも増改築していくと結局4つぐらいになってる
0711デフォルトの名無しさん2016/01/31(日) 17:46:37.03ID:k5bfrJJo
>>708
前に書いたけど、分岐はその使い方によって以降の分岐を避けられる場合がある。
Case文の場合は作られたケースを順番に評価するのはトレースすると解るよね。

まずそこで使い分けが発生するんだけど、単純にそれで書くと読みにくくなることがある。
処理のレスポンスと可読性どちらを取るかはケースバイケースで、組んでる人のセンスの見せ処にもなる。

後は上の人がループの切り分けの話をしていたけど俺の感覚からすれば
関数やメソッドは単一責任原則に則って作っていればループや分岐は別に分かれていなくてもいいと思ってる。

つまり何が幾つまでという切り分けで作るのではなく一つの役割で一つの関数やメソッドを作っておけば、
基本スパゲティコードになることはない筈なので
後は分岐数は見やすければお好きにどうぞと言いたい。俺個人の意見としてはね。
0712デフォルトの名無しさん2016/01/31(日) 21:42:48.93ID:3A1xW7mu
>>709
>>710
>>711
ありがとうございます。
1行だけの単純命令ならいくらでも入れ子できそうですが
本日多数の関数を持ったelse付きの数行あるコードを4層構造に仕込もうとしましたが
複雑に入り組みすぎて、途中で脳が沸騰しそうになり未だに完成していません。
Caseでやるのもよさそうですね
正直もうくたくたで何もやる気も起きません。
0713デフォルトの名無しさん2016/01/31(日) 21:49:46.31ID:3A1xW7mu
VBAのコードを半日近く書き続けて煮詰まってくると頭痛がしてくるのは私だけでしょうか?
0714デフォルトの名無しさん2016/01/31(日) 22:37:46.23ID:fN9K6rqb
老化といいます
0715デフォルトの名無しさん2016/01/31(日) 22:44:30.24ID:/MiBgNRG
たいへんもうしわけごさいません
0716デフォルトの名無しさん2016/01/31(日) 22:54:07.60ID:fJmO8CE1
コードはこんがらがってきたら無理せずに一回捨てて、
それまでで得られた結果を反映した強くてニューゲームした方がいい。

ただしアルゴリズムとかマトモに学んでないと、そういう時に手段が限られて苦労する。
0717デフォルトの名無しさん2016/01/31(日) 23:37:12.06ID:OOAiq76c
プログラムの設計は難しい。
小さな問題と大きな問題の両方に悩まされる。
一筋縄ではいかない。
0718デフォルトの名無しさん2016/02/02(火) 19:46:44.38ID:n8+/YJjg
フリーズした?
0719デフォルトの名無しさん2016/02/02(火) 21:29:47.13ID:xMBhBprB
株探の決算表から、ウェブクエリでテーブルをエクセルに取り込むことは出来ました。
しかし100銘柄〜200銘柄も取り込むと膨大な時間がかかってしまいます。
取り込む時間を最小限にするために、テーブルの中の一か所だけを取り込むようにしたいです。

例:
・URL http://kabutan.jp/stock/finance?code=1301
・テーブル「今期予想」の「予 2016.03」の「経常益」のみ(3000という数字)を取り込みたい


―――参考までに「ウェブクエリでテーブルをエクセルに取り込むマクロ」―――
Sub sssample2()
Dim fff As String

fff = ThisWorkbook.Path & "http://kabutan.jp/stock/finance?code=1301";
With ActiveSheet.QueryTables.Add(Connection:= _
"URL;" & fff, Destination:=Range("B2"))

.RefreshStyle = xlOverwriteCells
.WebTables = "12"
.WebFormatting = xlWebFormattingNone
.Refresh BackgroundQuery:=False

End With
End Sub
――――――――――――――――――――――――――――――――――

よろしくお願いします。
0720デフォルトの名無しさん2016/02/03(水) 00:11:42.99ID:phHyrAir
>>719
ウェブクエリはテーブルの一部だけを取り込むことは基本的にできないし、
そもそも動作が遅すぎるので大量データの取得には向いてない
「XMLHTTPオブジェクト」おすすめ
0721デフォルトの名無しさん2016/02/03(水) 01:21:36.38ID:xSOyaD7A
ありがとうございます
ハードルは高そうですが調べてみます
0722デフォルトの名無しさん2016/02/03(水) 10:22:57.26ID:/plcvGK1
すいません
すっごい初心者な質問なのですが…
vbaでie操作して最後にieで完了ページが表示された事を確認してからieを閉じたいのですが

if instr(objIE.document.body.innerhtml."完了しました。") 〉0 then
とじる
else
やりなおし
end if

としていますが機能していないようで
こういう目的の場合どういった方法を取るものなのでしょうか
0723デフォルトの名無しさん2016/02/03(水) 12:15:31.59ID:kFs/rV/l
objIE.document.body.innerhtmlの内容は確認したの?
0724デフォルトの名無しさん2016/02/03(水) 13:23:42.06ID:zCM4JqWj
>>722
機能していないとは?
0725デフォルトの名無しさん2016/02/03(水) 21:32:48.21ID:HBzsb+pO
A列に氏名、B列に勉強科目、C列に勉強時間が入力されたデータがあり、
各人の最も勉強した科目は何でその勉強はいくらかを計算するプログラムを作りたいのですが、
何か良い案をお教えいただけないでしょうか?
またこのようにプログラムを全く思いつかない場合、どのように検索・勉強すればよいのでしょうか?
宜しければご教授下さい
07267252016/02/03(水) 21:34:02.56ID:HBzsb+pO
>>725
>勉強はいくらか
「勉強時間はいくらか」の間違いです。
申し訳ありません
0727デフォルトの名無しさん2016/02/03(水) 22:06:22.01ID:owuQJz30
>>725
検索キーは [VBA クロス集計]

クロス集計はこんな感じ
http://www4.synapse.ne.jp/yone/excel_exercise/exercise_vba_cross.html
07287252016/02/03(水) 22:22:33.44ID:HBzsb+pO
>>727
早速の返信ありがとうございます
おかげさまで解決出来ました
心より感謝申し上げます
0729デフォルトの名無しさん2016/02/05(金) 00:08:37.08ID:TXCmVTvB
質問です。
ExcelのVBAでDo While Cellsを使用して
sheet1のA6セルに入力されたデータをsheet2のS列のデータと比較し
重複データがあれば「重複データが存在します」
なければ「重複チェック終了しました」とメッセージ表記されるようにしました。
これで続けて重複データをsheet1のA10以降に表示されるようにしたいです。
この後にどのように入力したらいいでしょうか。
当初はオートフィルでやってたのですが、cells利用してもできると聞いて
調べて見たのですがよくわからなくて困っています。
数日前に始めたばかりで勝手がわかっていなかったらすみません。
0730デフォルトの名無しさん2016/02/05(金) 00:36:52.27ID:blBw672Y
>>729
とりあえず、作ったVBAをどこかに貼って
短ければここでもいいし
0731デフォルトの名無しさん2016/02/05(金) 00:50:11.46ID:U+VxVXPf
A6から急にA10に話が飛んでる理由は何なの
ウォートホッグなの
0732デフォルトの名無しさん2016/02/05(金) 04:20:30.65ID:tis1OD9T
もしA6の値が、S列に含まれていれば、
A10に、A6の値を代入する

A10 = A6の値
0733デフォルトの名無しさん2016/02/05(金) 04:25:48.17ID:LfaH5pAK
今日は書けるかな
0734デフォルトの名無しさん2016/02/05(金) 04:40:03.69ID:LfaH5pAK
Sub test()
ccc = 1
For Each eee In Sheets("Sheet2").Range("S1:S100")
If eee.Value = Sheets("Sheet1").Range("A6").Value Then
Sheets("Sheet1").Range("A10").Cells(ccc, 1) = eee.Value
ccc = ccc + 1
End If
Next
End Sub
0735デフォルトの名無しさん2016/02/05(金) 05:36:50.98ID:eBNdrWRt
たまにxlsmファイルがプロジェクトまたはライブラリが見つかりませんと出て動作を停止してしまうのはなんなんだろう
その度新しくブックを作り直さなきゃならなくなる
07367292016/02/05(金) 11:08:36.96ID:j1/kW8gU
レスありがとうございます。
>>730
Sub sheet1()
'
' sheet1 Macro
'
Dim i, ii As Integer
i = 0
ii = 0
Do While Cells(6 + i, 2) <> ""
Do While Worksheets("sheet2").Cells(2 + ii, 2) <> ""
If Cells(6 + i, 2) = Worksheets("sheet2").Cells(2 + ii, 2) Then Worksheets("Sheet2").Cells(2 + ii, 2).Value = Cells(10 + i, 2).Value
  ii = ii + 1
Loop
i = i + 1
Loop
MsgBox ("重複チェック終了しました。")
Exit Sub
End Sub

>>729の後、データの存在の有無は不要ということで終了後に「重複チェック終了しました。」と表示されるだけにしました。
これで実行してもメッセージが出るだけでデータの抽出ができません。

>>731
sheet1のA6に入力欄を作り、実行するとA10以下に表示される、という仕組みを作りたかったので…
これまでVBAに触ったこともなかったので色々と効率の悪いことをしていると思います。
0737デフォルトの名無しさん2016/02/05(金) 12:44:29.76ID:VJfh6At3
質問です。
シートモジュールに@のコードを書くとうまくいきますが、Aのコードを書くと
上手くいきません。
なぜなんでしょうか?教えてください。

@
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 1 Then
Sheet2.Cells(Target.Row, 5) = Time
Sheet2.Cells(Target.Row, 5).Copy
ActiveSheet.Cells(17, 5).Paste

End If
End Sub

A
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 1 Then
Sheet2.Cells(Target.Row, 5) = Time
Sheet2.Cells(Target.Row, 5).Copy
ActiveSheet.Paste

End If
End Sub
0738デフォルトの名無しさん2016/02/05(金) 14:28:18.31ID:7bhw2NUK
>>736
やりたい事 今一つ分ってないけと なんとなく
If Cells(6 + i, 2) = Worksheets("sheet2").Cells(2 + ii, 2) Then Worksheets("Sheet2").Cells(2 + ii, 2).Value = Cells(10 + i, 2).Value
これ
・・・・・・・・Then Cells(10 + i, 2).Value = Worksheets("Sheet2").Cells(2 + ii, 2).Value
じゃないかなと思うのだけど(代入文の 右辺と左辺が逆)


>>737
EXCELのバージョンはいくつ?

俺ん所(EXCEL2016)では
目的どおり動作するかどうか関係なく 単純に動く/動かないだと
@ Pasteで実行時エラー
A 動く
なんだけどな
0739デフォルトの名無しさん2016/02/05(金) 14:54:32.80ID:VJfh6At3
>>738
Excel2010です。
何が原因なんでしょうか?
0740デフォルトの名無しさん2016/02/05(金) 15:07:44.85ID:RDrjDYLW
単純に↓でいいのでは?

Worksheets(2).Select
Cells(target.Row, 5)=Time
Cells(17, 5) = Cells(target.Row, 5)
0741デフォルトの名無しさん2016/02/05(金) 15:19:29.05ID:VJfh6At3
>>740
返信ありがとうございます。
sheet2でコピーしたものをシート1に持ってきたいのです。

ご教示お願いします。
07427382016/02/05(金) 15:22:59.01ID:7bhw2NUK
>>739
ちょっと確認
>>737 の通り
@ ○
A ×
の動作でいいのよね
俺ん所では 逆だから これ以上は回答できないけど
0743デフォルトの名無しさん2016/02/05(金) 15:29:10.07ID:RDrjDYLW
>>741
activesheetを1にした場合で
copyする範囲がa1〜h1だとした例

With Worksheets(2)
For i = 1 To 8
Cells(1, i) = .Cells(1, i)
Next i
End With
0744デフォルトの名無しさん2016/02/05(金) 15:32:26.54ID:VJfh6At3
>>742
すいません、おっしゃる通り逆でした。

A○

>>743
試してみます。
07457382016/02/05(金) 15:37:37.09ID:7bhw2NUK
>>744
なら
https://www.moug.net/tech/exvba/0050103.html
のように
Destination を指定する
0746デフォルトの名無しさん2016/02/05(金) 15:58:15.69ID:VJfh6At3
>>745
無事にできました。
ご教示ありがとうございます。
0747デフォルトの名無しさん2016/02/05(金) 21:58:27.26ID:qfst1uAU
オートシェイプの図形(たとえば角丸四角形)にマクロを割り振って
そのプロシージャ内でApplication.Caller で呼び出し元を調べると
"角丸四角形 1" とか出てくるけど、その図形のNameプロパティーを調べると
”Rounded Rectangle 1" っていうふうに英語名で出てくる。

シート上の複数の図形から同じプロシージャを呼び出して、
呼び出し元の図形の列位置(Column)に応じて処理を分岐させるってのをやりたくて
こんなコード書いたんだけど、
Application.Caller の結果と Nameプロパティーが違うんで上手くいかなかった。

Sub Test()
Dim v As Variant
Dim shp As Shape
Dim clm As Long
v = Application.Caller
For Each shp in Thisworkbook.Sheets(1).Shapes
 If shp.Name = v Then
  clm = shp.Column
  Exit For
 End If
Next shp
End Sub

できればどっちか(なるべくなら英語のほう)に統一したいんだけど、
どうすりゃいいの?
0748デフォルトの名無しさん2016/02/05(金) 22:08:37.95ID:blBw672Y
>>747
ActiveSheet.Shapes(Application.Caller).Name
あたりで英語の名前が取得できるはず
0749デフォルトの名無しさん2016/02/05(金) 22:27:47.03ID:RDrjDYLW
>>747
複数の画像をシートに配置し1画像をクリックしたら個々の処理をしたい
そのマクロを画像数に関係しないで1ルーチンでしたい、、ってことかな?
0750デフォルトの名無しさん2016/02/05(金) 22:33:57.04ID:qfst1uAU
>>748さま
早速の回答ありがとうございます。

Sub Test()
Dim ws As Worksheet
Dim str As String
Dim shp As Shape
Dim clm As Long
Set ws = ThisWorkbook.Sheets(1)
str = ws.Shapes(Application.Caller).Name
For Each shp In ws.Shapes
 If shp.Name = str Then
  clm = shp.TopLeftCell.Column
  Exit For
 End If
Next shp
Set ws = Nothing
Debug.Print clm
End Sub

おかげさまで無事に期待通りの動作になりました。
0751デフォルトの名無しさん2016/02/05(金) 22:36:08.61ID:qfst1uAU
>>749さん
すみません、リロードしてなかったので気付きませんでした

>そのマクロを画像数に関係しないで1ルーチンでしたい、、ってことかな?

そうです、そんな感じです
0752デフォルトの名無しさん2016/02/06(土) 08:53:13.29ID:P3+owK3w
>>751
おいらの場合だが、、画像を貼る時
ユニーク(唯一)な画像名を入れ、実行するマクロ名は全て同一にしている

マクロのほうでクリックされた画像名を取得すれば、どうにでもできる
0753デフォルトの名無しさん2016/02/06(土) 09:06:55.95ID:P3+owK3w
画像名の指定
objshape.name
マクロの登録については
selection.onactionあたりをgoogってw
0754デフォルトの名無しさん2016/02/06(土) 15:32:47.34ID:lnO4bcRF
質問
セル範囲をctrol+Cとかでクリップボードにいれた状態で
その内容をVBAで配列等にしたい場合、内容を地道にCRLFとHTでsplitするしか方法がないのでしょうか
0755デフォルトの名無しさん2016/02/06(土) 19:18:20.53ID:o+SuU72l
>>736
質問の答えは>>738の通りと思うけど気になった点を2つほど
・A6以降の値を調べるならループ必要だけど、A6のみなら最初のDoループは不要では?
・最後のExit Subは自分なら書かないかな(なくても問題ないため)
0756デフォルトの名無しさん2016/02/06(土) 19:26:54.79ID:k9/r4E4x
>>754
なぜクリップボードに入れる前に普通にValueプロパティで配列化しないの?
0757デフォルトの名無しさん2016/02/06(土) 19:29:16.46ID:d/rSshNV
>>754
Rangeオブジェクトを使う方向で考えた方がいい
Rangeから配列へはVariant変数にただ代入するだけ
0758デフォルトの名無しさん2016/02/06(土) 19:48:03.96ID:eyuorlki
VBAでコマンドプロンプトの実行させたいんですがどうやればいいんでしょう?
ググったりしてたんですが意味わからんものでしてそれぞれのプログラムの説明も良かったら頼みます
やりたいことはコマンドプロンプトのコマンドの実行とコマンドプロンプト画面を表示したくないためです
0759デフォルトの名無しさん2016/02/06(土) 20:00:25.86ID:lnO4bcRF
>>756-757
通常なら提言通りの方法でやるのですが
システムの関係でExcelのインスタンスが2つになってるんです
そこでインスタンスAでCtrol+CをしてインスタンスBでマクロを動かし
クリップボードのセル範囲情報を取り出そうとしているんです
0760デフォルトの名無しさん2016/02/06(土) 20:54:04.56ID:l536E6T4
>>758
retval = Shell("c:\t\t.bat", vbHide)
0761デフォルトの名無しさん2016/02/06(土) 21:16:39.44ID:eyuorlki
>>760
ググったら「ExecかRunをWScript.Shellで実行」できるというのを見たんですがそれらと
>>760の実行は何か違いがあるんですかね?
それとググったら発見したんですが
CreateObject("WScript.Shell").Run "CMD.EXE C:\>コマンドプロンプトのコマンドの実行文", 0
これでも通じますか?また通じたとしたら何か問題ありますかね?
0762デフォルトの名無しさん2016/02/06(土) 21:25:25.27ID:d/rSshNV
>>759
基本Excelの中身ってCOMだからGetObjectでBからA見たりできるよ
getobject 複数 インスタンスでぐぐれ
0763デフォルトの名無しさん2016/02/06(土) 21:29:36.07ID:l536E6T4
>>761
字数の多いのは機能も多いだろう
軽自動車か高級車の違いで
コンビニ行くなら同じ
0764デフォルトの名無しさん2016/02/06(土) 21:40:35.45ID:eyuorlki
>>763
つまり>>760この実行文は余計なものを省いたような文なんでしょうかね?
それだったらありがたいんですがその実行文は何をしてるんですかね?
良かったら説明お願いします
0765デフォルトの名無しさん2016/02/06(土) 21:53:20.80ID:P9swx1tr
>761
× "CMD.EXE C:\>コマンドプロンプトのコマンドの実行文"
○ "CMD.EXE /C コマンドプロンプトのコマンドの実行文"
ですよ
×の方でやったらループして動かなくなった(EXCEL2016)

ちなみに
RC = CreateObject("WScript.Shell").Run("CMD.EXE /C コマンドプロンプトのコマンドの実行文", vbHide , True)
なら
マンドの実行終了を待ち合せてくれて 実行結果の終了コード(番号)が返ってきます(通常 正常終了は 0)
これは Shell関数は使えない。
0766デフォルトの名無しさん2016/02/06(土) 22:07:31.95ID:eyuorlki
>>765
それで実行できました
ところで
CreateObject("WScript.Shell").Run "empty *", 0
この実行文は前に作ったものなんですが違いはなんなんでしょう?
0767デフォルトの名無しさん2016/02/06(土) 22:14:02.79ID:cR3OuN6O
コマンドプロンプトでできること一般をVBAでやりたいのか、
特定のOSの機能を使いたいのかはっきりさせてほしいところだ。
0768デフォルトの名無しさん2016/02/06(土) 23:55:45.18ID:eyuorlki
>>767
タスク機能でバックグランド実行しようとしてたんですわ
0769デフォルトの名無しさん2016/02/07(日) 00:08:40.73ID:z3M1lb5n
なんで今さら、コマンドプロンプトやねん?

PowerShellでええやろ。
PowerShell_ISE でも使って見れば?

WSH, VBScript もあるし
0770デフォルトの名無しさん2016/02/07(日) 01:04:57.37ID:S151Vk4M
質問させてください。

Excelの右クリックにメニュー追加したいんですが、右クリックメニューって何種類ありますか?

Application.CommandBars("Cell")とかでRowとかいろいろあると思うんですが。

もしくは右クリックメニューすべてに追加するみたいな方法ってあるのでしょうか。
0771デフォルトの名無しさん2016/02/07(日) 10:07:38.16ID:GylIyJ2o
普段Mac使いなんですが、10年ぶりにWindowsでエクセルVBA書くことになった。。
昔はxp上のエクセル2003で作ってました。

今回はWindows7 32ビット
エクセル2013 32ビット

で作ります。
はあ
0772デフォルトの名無しさん2016/02/07(日) 12:20:07.64ID:lxD2jtcx
macはExcel使いづらいし良いと思うよ
0773デフォルトの名無しさん2016/02/07(日) 13:13:51.34ID:lvVeevWi
>>771
知らないんだけどExcel使う上でも違いってあるの?
0774デフォルトの名無しさん2016/02/07(日) 15:50:17.72ID:YehISXuU
俺もよく知らんけど色々あるみたいね
http://qiita.com/sjuny/items/d3bf8e4dd9e609374575
0775デフォルトの名無しさん2016/02/07(日) 16:04:51.64ID:Ah5srJ1t
こりゃMacでExcelVBAの仕事なんかきたら絶対拒否だな
まあ絶対こないけどな
0776デフォルトの名無しさん2016/02/07(日) 21:17:08.90ID:8jeH5Cxf
>>774
これは酷いな
文字化け起こすわ正規表現使えないわ
ScriptingDictionary使えないから
書き換えたいときはCollectionラッピングしてイテレート使えとか
しれっと言ってるけどVBAの知識しか持ってない奴には
何が何のことか分からないだろうしな

エラーは違うモジュールやクラスまたがるとスコープ外れることがあるから
WindowsのVBAでもRaiseに限らず気をつけるけど
.Netの参照もろくに使えないで、APIも貧弱だとしたらもう
何をどうしろと言うのだという感じになるだろうな。お手上げだ。
0777デフォルトの名無しさん2016/02/08(月) 08:35:37.46ID:74LZCTzt
>>776
テメェの会社のソフトウェアすらまともにポーティング出来ないってのも
笑えるなww 今時、マルチプラットフォームなんて当たり前の時代に。
0778デフォルトの名無しさん2016/02/08(月) 12:16:06.90ID:9AywMO4K
FormにコードからCheckboxやLabelやらCommandButtonを貼り付けたいんです。(数が決まっていないから)
そのときLayoutをAndroid開発のように手軽にする方法ってないものなのですか?
現状ではいちいち各要素のLeftプロパティやTo@プロバティやWidthプロパティをわざわざ計算して代入していますが。
0779デフォルトの名無しさん2016/02/09(火) 02:12:59.07ID:fm/+Qtdn
>>778
EXCELVBAからWindowsPhoneにプラットフォームを変える
07807782016/02/09(火) 10:27:16.61ID:kyiA5+yG
>>779
あまりわたしを怒らせないほうがいいぞ。
しばらくこのスレに住みつくんだからな。
0781デフォルトの名無しさん2016/02/09(火) 11:33:24.91ID:6l1mZ7CB
>>780
コテ付けておいてくださいね?
0782デフォルトの名無しさん2016/02/09(火) 12:02:55.92ID:nKvXEyw2
ファイル名とセル内の何桁目までが一致したものをハイパーリンクをつけたいのですがどのような構文を書けばよいでしょうか?
0783デフォルトの名無しさん2016/02/09(火) 13:36:12.19ID:nKvXEyw2
書き方が酷かった。
ファイル名とセル名で特定の場所が一致していた場合そのファイルとセルを紐付けるハイパーリンクを挿入するにはどのような構文が必要でしょうか?

例 abc0001xxxx.pdfというファイル名のファイルとセルがあった場合に
abcとxxxxは参照せずに
0001の部分と .pdfの拡張子のみで判別して合致したものにハイパーリンクで紐付けする。
0784デフォルトの名無しさん2016/02/09(火) 13:42:51.44ID:f4xX8fNK
>>783
ファイル名の集合は検索前に固定されてるの?
0785デフォルトの名無しさん2016/02/09(火) 13:55:54.83ID:nKvXEyw2
>>784
ファイル名は法則はあるけど全部が完全な固定じゃなくて100 -(ハイフン)の後ろ3桁とかで検索したい。

ファイル名の構成は
(特定のものだけいれる単語)(分類別の文字2桁)200-(固有の番号)(分類別の文字2〜3桁.pdf)
って感じ。
200-(ハイフン)は固定
0786デフォルトの名無しさん2016/02/09(火) 14:23:18.20ID:nKvXEyw2
というよりは改稿するたびにファイル名の後ろの数字が変わるからそれ以外で判断してハイパーリンクを付けたい.. .
0787デフォルトの名無しさん2016/02/09(火) 14:58:50.32ID:6l1mZ7CB
JavaScript並に、配列の扱いが楽になったらいいのに

VBAが最近嫌になってきたわ。
0788デフォルトの名無しさん2016/02/09(火) 14:58:58.23ID:f4xX8fNK
>>785
そういう文字列のパターンに合致したもの全部にリンクを貼るの?
それとも実際存在しているファイル名かどうかも考慮するの?
0789デフォルトの名無しさん2016/02/09(火) 15:06:16.15ID:j0ZWcdvL
>>787
どう違うのか教えて
0790デフォルトの名無しさん2016/02/09(火) 15:19:03.63ID:nKvXEyw2
>>788
ファイル名に固有の数字を持ってるから1つしか一致しない。

セル内の固有数字と同じものが存在しない場合っていうのは基本的にあり得ないけど存在しなかったらリンクしないでほしい
0791デフォルトの名無しさん2016/02/09(火) 17:30:49.91ID:FJrhS/CA
Excel2013です。

実行中のマクロが、
エラーメッセージや中断ダイアログも何も出ずに、
途中で終了してしまうことがあります。

多数の重いブック(大きなもので30M)を、
 開いて→シートのデータを取得して→上書きせずに閉じて、
を繰り返す処理ですが、
実行中に他のアプリケーションを使って作業などしていると
この現象が発生するようです。
(但し、作業の重い軽いに必ずしも関係ない様で、起きない時には狙っても起きません。)

今の所、
参照したいブックをオープンしたところで
何のダイアログも出ずに終了しているのを確認しています。

尚、
ブックのオープン・クローズのメソッドの前後のほか、
あちこちにDoEventを配置してます。


色々探したのですが、関連記事が見つかりませんでした。
何かお知恵を拝借出来れば幸いです。
宜しくお願いします。
0792デフォルトの名無しさん2016/02/09(火) 17:34:59.79ID:fCLnUzKj
下記のコードをWin8.1 Excel2013 IE11で実行すると
表示待機(2度目)で無限ループになります。
(なぜかIEのReadyStateは1のまま、LocationNameはYahoo! JAPANのまま)
原因と根本的な対処法を教えてください。

ちなみに以下の場合はなぜか無限ループしません。
・Vista Excel2007 IE9で実行した場合
・ステップインで実行した場合
・Google表示の前にExcelを最前面にした場合(コメントアウト部分の処理です)
・IEのVisibleをFalseのまま実行した場合
0793デフォルトの名無しさん2016/02/09(火) 17:41:50.26ID:fCLnUzKj
Option Explicit

'スリープAPIの宣言
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Sub main()
'IE起動
Dim ie As Object
Set ie = CreateObject("InternetExplorer.Application")
ie.Visible = True

'Yahoo!表示
ie.Navigate "http://www.yahoo.co.jp/";

'表示待機(1度目)
Do While ie.ReadyState < 4 Or ie.Busy = True
 Debug.Print "ReadyState:" & ie.ReadyState & " Busy:" & ie.Busy & " LocationName:" & ie.LocationName
 Sleep 50
 DoEvents
Loop
Debug.Print "Yahoo!表示完了-------------------------------"
0794デフォルトの名無しさん2016/02/09(火) 17:43:31.26ID:fCLnUzKj
>>793の続き

'Excel最前面化
'AppActivate Application.Caption

'Google表示
ie.Navigate "http://www.google.co.jp/";

'表示待機(2度目)
Do While ie.ReadyState < 4 Or ie.Busy = True
 Debug.Print "ReadyState:" & ie.ReadyState & " Busy:" & ie.Busy & " LocationName:" & ie.LocationName
 Sleep 50
 DoEvents
Loop
Debug.Print "Google表示完了-------------------------------"

Set ie = Nothing
End Sub
0795デフォルトの名無しさん2016/02/09(火) 17:47:55.13ID:yhhWqviC
>>793
おれは
ie.ReadyState < 4

ie.ReadyState <> 4
で書いてるなぁ。
解説サイトのパクりだから細かいことはわからないけど。
0796デフォルトの名無しさん2016/02/09(火) 18:00:00.99ID:fCLnUzKj
>>795
ありがとうございます。
<>に変えてみてもやはり無限ループになります。

多分IE11なのが悪い気がするが
OSごとにIEのバージョンが決まってるからダウングレードもできない・・・
0797デフォルトの名無しさん2016/02/09(火) 18:18:24.28ID:C6IPgLvU
>>796
Win8.1 + IE11 でReadyStateが取得できないのは既知の仕様です
対処方法は俺は知らん
0798デフォルトの名無しさん2016/02/09(火) 18:26:15.97ID:wyjSQA63
IEを操作することが最終目的なら、Excelじゃなくて別のもの使えば
0799デフォルトの名無しさん2016/02/09(火) 18:36:42.40ID:j0ZWcdvL
>>791
ファイルをオープンせずにSQLとかでデータを取得してもダメなの?
0800デフォルトの名無しさん2016/02/09(火) 19:07:19.84ID:FJrhS/CA
>>799
レスありがとうございます。
そのようなやり方もあるのですか。。
ちょっと勉強してみます。
0801デフォルトの名無しさん2016/02/09(火) 19:45:15.29ID:EIWW8KSR
複数のエクセルファイルが同じフォルダに入っています。
全てのブックの全てのシートに書き込まれた、ある一つのセル(AL列の一行目)
をクリアにしたい。

セルの場所はおなじですが、複数のブック複数のシートに書かれたデータを
クリア(削除)したいのです。

ExcelVer2010で動くVBAを教えてください。
0802デフォルトの名無しさん2016/02/09(火) 22:58:04.18ID:LDceDFt4
>>801
下のコード中の変数 pth に
処理したいファイルが入ってるフォルダのパスを指定して実行すると
フォルダ内の全てのエクセルファイルをひらいて、
その全てのシートでセルAL1の値をクリアしてからファイルを上書き保存する
ただし、自分自身 (このマクロを実行するブック) と同じ名前のファイルは開けないから消せない

Sub test()
Dim pth As String
Dim obj As Object
Dim wb As Workbook
Dim sh As Worksheet

pth = ThisWorkbook.Path & "\test" '処理したいフォルダをここで指定する
With CreateObject("Scripting.FileSystemObject")
 If Not .FolderExists(pth) Then Exit Sub
  For Each obj In .GetFolder(pth).Files
   On Error Resume Next
   Set wb = Workbooks.Open(obj)
   On Error GoTo 0
   If Not wb Is Nothing Then
    For Each sh In wb.Worksheets
     sh.Range("AL1").Clear '消すセルはここで指定する
    Next sh
    wb.Close SaveChanges:=True
    Set wb = Nothing
   End If
  Next obj
 End With
End Sub
0803デフォルトの名無しさん2016/02/09(火) 23:54:47.06ID:EIWW8KSR
ありがとう。かりにVBAのかかれたブックがそのフォルダにあるとしたら
パスはどうかくの?
0804デフォルトの名無しさん2016/02/10(水) 00:17:10.65ID:UeLxeYgc
その場合は

pth = ThisWorkbook.Path & "\test" '処理したいフォルダをここで指定する

ここを

pth = ThisWorkbook.Path

こうする
0805デフォルトの名無しさん2016/02/10(水) 00:33:55.52ID:GKs+LxV+
ほんとうにありがとう。いろいろいじってみます。
0806デフォルトの名無しさん2016/02/10(水) 00:48:04.83ID:6coiY0M2
リテラルの末尾に付ける&H80000000の&とか%とかの一覧みたいな資料ってどっかにありませんか?
ぐぐろうとしてもどう検索したらいいのか判らないし
0807デフォルトの名無しさん2016/02/10(水) 02:43:57.94ID:u/mYzECS
>>797>>798
ありがとうございます
仕様なら諦めるしかないかなぁ
そもそもVBAってIE操作にあんまり適してないんですかね
0808デフォルトの名無しさん2016/02/10(水) 04:19:50.96ID:Urx/IePR
>>806
識別子(しきべつし)

VBの資料だからVBAでは使えないものもある
https://msdn.microsoft.com/ja-jp/library/s9cz43ek.aspx
0809デフォルトの名無しさん2016/02/10(水) 04:50:17.97ID:GKs+LxV+
Cなら
if(条件A && 条件B){
}
と書く条件文ですが、この&& (且つ)に対応する符号は
なんになりますか?
0810デフォルトの名無しさん2016/02/10(水) 05:02:45.87ID:7rRZYeUj
AND
0811デフォルトの名無しさん2016/02/10(水) 08:30:07.58ID:Urx/IePR
>>807
実験環境を用意するのが面倒なんで、思い付いたことだけ

参照設定を変えてもいいんなら「Microsoft Internet Controls」でなんとかなるかも
ならないかも
0812デフォルトの名無しさん2016/02/10(水) 09:05:55.41ID:FkM1RfeE
>>789
JavaScriptの場合、var kinoko = [];といった具合に配列を用意して、あとは適当
にpushするだけでいい。なのでRedimだのしなくていいし、例えば、

var kinoko = [simeji, matsutake, nameko, kawatani]

といった具合にして、別の配列にそのまんまpushができるので、すごく楽。取り出し
もkinoko[3]でkawataniが取り出せる。初期化ももう一度、例えばループ内でそのま
ま、var kinoko = [];と宣言するだけでいい。

物凄く楽にプログラム内でデータテーブルを使えるので、柔軟性がある。こういった
形で楽にメモリ上で配列を扱えると最高なんだけれどね。
0813デフォルトの名無しさん2016/02/10(水) 09:19:59.78ID:Bjt40mVK
>>812
Dim kinnko as variant
kinoko = split("simeji, matsutake, nameko, kawatani", ",")


とかになっちまいますね。
0814デフォルトの名無しさん2016/02/10(水) 09:22:25.54ID:FkM1RfeE
>>813
2次元配列とかになっても、

var kinoko = [];

var takenoko = [];

takenoko.push("bekky")
takenoko.push("kiyohara")

で最後に、kinoko.push(takenoko)とかでさくっと実現できたりするから、こういう地味
だけれど、楽にプログラミングできる仕組みを用意してほしいなって思うね。
0815デフォルトの名無しさん2016/02/10(水) 10:30:41.33ID:SL6hIX6J
そのレベルならVBA捨ててnode.jsとかpythonとかrubyでOLE操作したほうが手っ取り早い
0816デフォルトの名無しさん2016/02/10(水) 10:54:16.66ID:Urx/IePR
>>807
気になったんで検索しまくったら、ウィンドウを一時的に隠すとIE11のステータスがリセットされるっぽいことが書いてあった

ie.Visible = False
ie.Navigate "http://ほげほげ"
ie.Visible = True

ってやるとうまくいくらしい?
0817デフォルトの名無しさん2016/02/10(水) 11:01:59.02ID:jozDLnvP
>>809
ANDが近いけど、短絡評価しないので、同じ動きのものはVBAにはないよ
0818デフォルトの名無しさん2016/02/10(水) 11:06:13.33ID:6eyh9AMR
>>812
pushはうらやましいし、実現するにはライブラリ等が必要だけど、配列に配列を突っ込むのはVBAでもできるでしょう。
あと
kinoko = Array("simeji", "matsutake", "nameko", kawatani)
とは書けるけど、それは違うんだろうか。
ところで kawatani って何?
0819デフォルトの名無しさん2016/02/10(水) 13:12:27.48ID:Lsw16fD/
ゲス乙女のボーカルでベッキーの不倫相手
川谷絵音 (髪型がキノコっぽい)
0820デフォルトの名無しさん2016/02/10(水) 13:39:21.10ID:OnEbfKeK
>>817
短絡評価の話なら
If 条件A Then If 条件B Then 〜
でいいでしょ
0821デフォルトの名無しさん2016/02/10(水) 16:31:02.12ID:6eyh9AMR
>>819
ぬるぽ
0822デフォルトの名無しさん2016/02/10(水) 16:38:25.44ID:zs62Z3CJ
>>821
ガッ
0823デフォルトの名無しさん2016/02/10(水) 16:54:10.35ID:YqpZzmVY
すいません、教えてください。
毎日使っているマクロで最近エラーが出るようになりました。
コードの一部を下に貼ります。
C=Range・・・(中略)の行で「実行時エラー '6' オーバーフローしました」が出てしまいます。

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

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

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

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

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

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

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

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

Test = S
End Function

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

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

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

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

FirstRow=1 : LastRow = 200000

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



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

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

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

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

GetTickCountの値:
→190423431〜217241781

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

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

>>853

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

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

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

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

でもエラーになるの?

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

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

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

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

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

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

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

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

で書式が 通貨or会計の時

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

>>914
循環参照とかしてると、使われなくなった後も開放されないんだが
まあ、参照されてるわけだから、使われなくなっていないと言えなくもないが
0917デフォルトの名無しさん2016/02/14(日) 22:58:31.32ID:qwowkzgX
>>910
そういうことを推測すること自体おかしいよ。
言語仕様を規格化していないことは罪だ。
0918デフォルトの名無しさん2016/02/15(月) 01:13:01.96ID:akbmk0Ll
マクロで一通りのこと出来るようになったと思ってたけどここの話を見てると全然何言ってるかわからないわ
0919デフォルトの名無しさん2016/02/15(月) 06:37:55.70ID:Lkye5vJL
言ってる本人達も9割分かってないわw
0920デフォルトの名無しさん2016/02/15(月) 06:39:18.81ID:g9kiXg+i
分からずに会話し続けられるとかどんだけコミュ力高いんだよ。
0921デフォルトの名無しさん2016/02/15(月) 09:44:08.73ID:k3iqvbPm
FileSystemObjectを使うときは、
 Dim fso as FileSystemObject
 Set fso=CreateObject("Scripting.FileSystemObject")
のように「FileSystemObject」や「Scripting.FileSystemObject」という文字列を暗記しておかなければなりません。
さらに参照設定でMicrosoft Scripting Runtimeにチェックした方が便利だから
「Microsoft Scripting Runtime」という文字列も暗記しておかなければなりません。

でもなにごとも暗記するのはイヤです。
数か月ぶりにVBAを使うので忘れていることもあるからです。
これみんなどうしてますか?
いい方法はありますか?
0922デフォルトの名無しさん2016/02/15(月) 12:21:09.82ID:AOCHEijb
もう暗記しちゃったからそれほど困ってないけど、
タイピングする事自体が面倒なので、
よく使う文言をまとめて書き込んであるモジュールを用意してある
fsoの他にも
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Application.Calculation = xlCalculationManual
なんかも全部そこからコピペして使ってる
0923デフォルトの名無しさん2016/02/15(月) 12:36:11.74ID:4OF/mElP
>>921
いちいちググってコピペしてる
あまりにもよく使うやつは、自分の作った古いVBAのソースからコピペ
0924デフォルトの名無しさん2016/02/15(月) 12:52:54.34ID:Mj6OaY8K
>>920
× 分からずに会話し続けられる
○ 分からずに適当なことを言い合ってるだけ
0925デフォルトの名無しさん2016/02/15(月) 14:03:32.87ID:k3iqvbPm
>>922
いいことを教えてあげよう。
F2押してオブジェクトブラウザ出して
左のクラスの欄のApplicationをクリックすると
右の欄に使用可能なプロパティ/メソッド一覧が出て
その中にScreenUpdatingもDisplayAlertsもCalculationも含まれてあるから暗記やモジュール準備は不要になる。

そんな具合で、Scripting.FileSystemObjectやFileSystemObjectやMicrosoft Scripting Runtimeを
暗記しないで使う方法はありますか?
数か月ぶりにVBAやると必ず忘れてる。
0926デフォルトの名無しさん2016/02/15(月) 15:34:29.01ID:OsSn1sDv
>>925
一覧から選べれば良いのか?
いいことを教えてあげよう
ツール-参照設定で一覧にMicrosoft Scripting Runtimeはあるぞ
それを選択すれば、オブジェクトブラウザの一覧にFileSystemObjectはあるぞ
0927デフォルトの名無しさん2016/02/15(月) 16:27:37.25ID:AOCHEijb
>>922
綴りは全部分かってんの
ただ、それをキーボードから打ち込むのが面倒なの

application以降の3つとかは決まりきった並びで
ワンセットにしてるし、それぞれ一覧から選ぶより
まとめてコピペのほうが速いんだよ
0928デフォルトの名無しさん2016/02/15(月) 19:20:33.88ID:Lkye5vJL
>>925
忘れたらまたここで聞いてくれればいいじゃないか
そしたら俺はいつだってMicrosoft Scripting Runtimeと言ってやるぜ!
0929デフォルトの名無しさん2016/02/15(月) 19:45:18.94ID:yxxj5Zwg
参照設定は入力アシストが楽だけど一ファイルずつ設定しやきゃならんのがな
0930デフォルトの名無しさん2016/02/15(月) 20:13:33.20ID:g9kiXg+i
>>925
俺は関数名そのままのクラス作って内部でCreateObjectするようにしてるわ。

ScreenUpdatingとかもInitializeでそれまでの設定を記憶しつつFalseにして、
Terminateで記憶した設定を戻すクラス作って不意のエラーで停止しても大丈夫なようにした。割と便利。
0931デフォルトの名無しさん2016/02/15(月) 20:43:20.75ID:OsSn1sDv
まあ、VBAの言語仕様はもうそのままでいいとしても
VBEはもうちょっと進歩してほしいよな
0932デフォルトの名無しさん2016/02/15(月) 21:22:14.77ID:k3iqvbPm
>>926
参照設定の一覧は多すぎて探すのが大変。
FikeSystemObject使いたいときはMicrosoftで始まることを忘れてて
FikeSystemObjectで探そうとするけど見つからない。
ひさしぶりだと「Microsoft Scripting Runtime」ということはすっかり忘れてる。
0933デフォルトの名無しさん2016/02/15(月) 21:23:09.13ID:k3iqvbPm
>>928
職場だから2chは見れない。
実際、変なサイトばかり見てる人がセキュリティ部門から警告があって上司からかなり怒られてた。
0934デフォルトの名無しさん2016/02/15(月) 21:27:57.34ID:k3iqvbPm
IEを操作したいときも
DOMツリーを使いたいときの諸準備のコードも
暗記せずに思い出す方法はないものか?

・CreateObject("InternetExplorer.Application")
の暗記も大変。

・参照設定はどれにチェックすればいいんだっけ?

・すでに開いてるIEタブを取得するにはどうすればいいんだっけ?
CreateObject("Shell.Application").Windowsだっけかな?

とか数か月さわってないと確実に忘れてる。
0935デフォルトの名無しさん2016/02/15(月) 21:34:34.23ID:k3iqvbPm
>>930
それはどういうことでしょう?
具体的にお教え願えますか?
0936デフォルトの名無しさん2016/02/15(月) 21:45:53.14ID:akbmk0Ll
>>933
にちゃんって変なサイトなのか?
0937デフォルトの名無しさん2016/02/15(月) 21:53:54.62ID:g9kjW0Ge
Variantに入れられる「確実に無効とわかる値」ってないもんですかね?
変数をたプロシージャに渡して、何かが代入されるかもしれないけど、
戻ってきたとき無効値のままだったら代替の値を入れるという処理をしたいです。

EmptyやNullは意味ある値として代入されたかもしれないから使えない、と言う状況。
Private 宣言したユーザ定義型はVariantに入れられないし...
0938デフォルトの名無しさん2016/02/15(月) 21:54:32.39ID:g9kjW0Ge
× 変数をたプロシージャに渡して、
〇 変数を他プロシージャに渡して、
0939デフォルトの名無しさん2016/02/15(月) 22:11:10.90ID:Lkye5vJL
期待する値と違う型ならなんでも良さそうな気もするが
0940デフォルトの名無しさん2016/02/15(月) 23:08:47.52ID:t+u0tvIB
>>937
文字列で"これは無効だよーん"とか入れとけばいいんじゃないか?
0941937代筆2016/02/15(月) 23:18:02.57ID:k3iqvbPm
いや、それじゃ本当に文字列として"これは無効だよーん"を使いたいときにそれと区別ができないじゃないか。
09429372016/02/16(火) 00:11:21.73ID:H4lPH6nF
いろいろ考えたけど、絶対安全なのは無理そうなので妥協しました。
故意に狙ってやらないと代入されないような値を初期値にします。
0943デフォルトの名無しさん2016/02/16(火) 00:18:58.14ID:CDwErKdX
何が入る予定で何がイレギュラーとして想定されるのかよくわからないから答えようが
0944デフォルトの名無しさん2016/02/16(火) 00:25:27.71ID:H4lPH6nF
既存の関数群にVariant変数を渡す。
インタフェースが同等の関数がたくさんあり、色々なことをやっている。
どの関数を使うかは変わりうるし、関数自体他者によって追加されることがある。
つまり、こちらからはブラックボックスとして扱うしかないということです。
0945デフォルトの名無しさん2016/02/16(火) 00:51:59.74ID:iVtNN0Qi
もう一つ別の変数を用意して、それを無効フラグとして使えばいい
0946デフォルトの名無しさん2016/02/16(火) 01:27:30.50ID://sfpAqe
>>944
Notingって使えないんだっけ?
ならテキトーな空クラス作って、それのインスタンスがVariantの引数に設定されてたら
無効ってことでいいと思うけど。
0947デフォルトの名無しさん2016/02/16(火) 02:45:02.01ID:qOZul9Ny
>>937
そういうのは、別に用意したステータスやプロパティで判断するのが普通だよ
初心者はトリッキーなことをやりたがって困るといういい見本
0948デフォルトの名無しさん2016/02/16(火) 02:48:36.36ID:VbbVKCv+
そもそも変数値が無効かどうかなんて状況次第だろ
処理内容も書かずに何が無効かなんてわかるわけない
0949デフォルトの名無しさん2016/02/16(火) 03:22:04.47ID:iVtNN0Qi
そもそも、Ruby, Python, Groovy, Go など、
マルチ代入できる言語では、戻り値とエラー情報を、同時に返す

file, err := os.Open("ファイル名")

if err != nil { エラー処理 }
0950デフォルトの名無しさん2016/02/16(火) 03:47:15.71ID:vhaFMrWy
ふつうはEmptyを意味ない値として使うんだがな
意味ある値として代入されたらって言うなら、意味ない値を自分で定義するか
値で判断しないで別途フラグなり用意しないと無理に決まってるじゃないか
0951デフォルトの名無しさん2016/02/16(火) 04:11:20.91ID:IqEc+Y3y
ファイル名でブックをロードするする命令が全部エラーになってしまいます。

・VBAコマンド例
Workbooks("test.xls").Activate
Workbooks("test.xlsx").Activate
Workbooks("C:\test.xls").Activate

・エラーメッセージ
実行時エラー '9'
インデックスが有効範囲にありません。

EXCELのバージョンは2016です。
どうしても原因がわかりません。
どなたかお助け願えませんでしょうか。
0952デフォルトの名無しさん2016/02/16(火) 05:47:26.50ID:vhaFMrWy
>>951
Activateはブックをロードする命令じゃない
ロードされてない(開いてない)ブックをActivateはできないぞ

まずWorkbooks.Openで該当ブックを開いてからActivateしてみろ
0953デフォルトの名無しさん2016/02/16(火) 07:42:06.56ID:Z4rZSsSX
>>944
既存の関数群に、別なフラグも渡して、値を設定するよう書き換えてもらう。
...ってのは無理だろうなあ。
0954デフォルトの名無しさん2016/02/16(火) 10:02:57.33ID:aYsl0/Pb
そもそも empty が初期値とか未使用とか
そういう役目を持った値なんだから
それに別の意味合いを持たせようとする事が間違ってるんだよ
そんな関数設計する奴が悪い
0955デフォルトの名無しさん2016/02/16(火) 11:42:02.50ID:eXnnZzqM
>>954
「見つかりませんでした」とか
0956デフォルトの名無しさん2016/02/16(火) 14:26:11.65ID:IqEc+Y3y
>>952
ありがとうございます。助かりました。

Workbooks.Open "C:\Test.xlsx"
Workbooks("Test.xlsx").Activate
で通りました。

Workbooks("C:\Test.xlsx").Activateはダメで
Workbooks("Test.xlsx").ActivateはOKなんですね。
0957デフォルトの名無しさん2016/02/16(火) 20:36:53.85ID:Ram+/g8a
>>956

Workbooks.Open したら、その開いたBookがActiveになるから
その後のActivateには意味が無いよ
0958デフォルトの名無しさん2016/02/17(水) 15:20:18.67ID:6+bmS6GM
質問お願いします。
3、4時間かかるプログラムを毎日夜中に走らせたいのですが、今日初実験したところ、途中でフリーズしてしまい完了できませんでした。ESCでの中断もできず、タスクキルしました。

フリーズ回避とESC中断が確実に出来るようにしたいのですが、どういったものが原因にあるでしょうか?内容は
IEからデータ取得(計5回のみ)+データ加工といったものです。
何か小さなことでもいいのでアドバイスお願い致します。
0959デフォルトの名無しさん2016/02/17(水) 15:28:29.31ID:ZHMdTa0o
>>958
まず、ログを適宜出力して、どこで止まったのかを特定すること。
0960デフォルトの名無しさん2016/02/17(水) 15:55:03.95ID:BZc3HBMX
>>959
初めて知りました。ありがとうございます、やってみます!
0961デフォルトの名無しさん2016/02/17(水) 16:10:08.40ID:ZHMdTa0o
>>960
蛇足かも知れないが。

ログはファイルに出力すること。
ここ参照。
http://officetanaka.net/excel/vba/filesystemobject/sample06.htm

どこでログ出力するのかは、
・IEにアクセスするメソッドの前後(これが怪しい)
・各Sub/Functionの入り口と出口
・あと怪しそうな所の前後
0962デフォルトの名無しさん2016/02/17(水) 16:50:50.50ID:ev89C1lU
>>957
ありがとうございます。
ActiveなワークブックにActivateしても特に害とかは無いのでしょうか?
0963デフォルトの名無しさん2016/02/17(水) 17:11:02.35ID:wkre/nrC
>>961
同じページ見てました。
ファイルに書き出すところまでうまく行ってます!
もしかしたら、私の予想3、4時間が甘く、実際は6時間ぐらいかかってまだ正常に動いていたのをフリーズと勘違いしたかもしれません、、そこで中断が出来れば良かったのですが、出来ず、、
ブック保存も適宜加えながら改善してみます。
0964デフォルトの名無しさん2016/02/17(水) 17:23:45.29ID:ZHMdTa0o
>>963
あ、あと、DoEventsを適当な所に入れること。
これを最初に言うべきだったか。

参考ページ:
http://officetanaka.net/excel/vba/function/DoEvents.htm
(OFFICE TANAKAのGoogle Top率高杉w)
0965デフォルトの名無しさん2016/02/17(水) 17:55:29.76ID:Z4Qv/wn8
DoEventsの役割や存在意義について
どなたか詳しく教えていただけませんか?

Sleep関数と関連がありますか?それとも同じですか?
0966デフォルトの名無しさん2016/02/17(水) 18:11:29.39ID:ZHMdTa0o
>>965
DoEventsがないと、そのプログラムは「応答なし」になって固まってしまう。(実際は処理をしてるんだけど)
DoEventsを入れると、そのタイミングでWindowsのイベントを処理してくれる。
Windowsのイベントというのは、キー入力とかマウス操作とか。

以下のコードは合計100万回×100万回のループでいつ終わるかわからないけど、実行中もExcelの操作はできるし
マクロの終了ボタンも押せる。

Sub Sample()
  Dim i As Long
  Dim j As Long
  Dim k As Long
  
  Debug.Print "開始"
  For i = 1 To 1000000
    DoEvents
    For j = 1 To 1000000
      k = Rnd * 10
    Next
  Next
  Debug.Print "終了"
End Sub
0967デフォルトの名無しさん2016/02/17(水) 18:14:40.64ID:Z4Qv/wn8
>>966
じゃあ他の多くのマクロは
コード中にDoEventsを入れてないのに
固まることなく動くのですか?

Windowsイベントについてもっと具体的に詳しくゼロから教えていただけると
0968デフォルトの名無しさん2016/02/17(水) 18:15:11.97ID:Z4Qv/wn8
超うれしいのですが。
0969デフォルトの名無しさん2016/02/17(水) 18:48:59.35ID:P44GJ7CR
http://okwave.jp/qa/q2008316.html
ググるとすぐに出ますよ
0970デフォルトの名無しさん2016/02/17(水) 20:58:21.62ID:63D/Eew4
>>962
やる意味は無いけど、やっても害も無い

まぁ不要な命令が増えてるんだから
厳密には何マイクロ秒とかの無駄な時間を消費してるのかもしれないが
そんなの害とは言わんでしょ
0971デフォルトの名無しさん2016/02/17(水) 22:10:15.48ID:JpNSKx+3
>>964
大変助かりました!ありがとうございます!
0972デフォルトの名無しさん2016/02/18(木) 08:47:39.44ID:IWN3hz7k
>>879
エラー処理で手抜きするな
0973デフォルトの名無しさん2016/02/18(木) 10:27:00.74ID:0J6cOFMi
CALLを多用して、プロシージャを細かく分けているのですが、一定時間を境目に、
参照プロシージャが無限ループしてしまい、
呼び出し元のプロシージャに戻らない問題が起きています。
ステップで確認すると、参照元のEND SUBを通過後、何故かFORの中にあるDOeventsに行った後に頭のsubに戻っていました。この原因が何か分かる方はおりますでしょうか?
0974デフォルトの名無しさん2016/02/18(木) 10:55:35.59ID:l36zGYPb
なんかのイベントでそのプロシージャが呼ばれてるんでないの?
DoEventsの入ったコードではApplication.EnableEventsをFalseにしとかないと
そういう事も起こりえるって死んだじいちゃんがよくいってた
0975デフォルトの名無しさん2016/02/18(木) 11:44:30.07ID:0J6cOFMi
>>974
試してみます。ありがとうございます
0976デフォルトの名無しさん2016/02/18(木) 12:12:27.57ID:eqQ9uyZX
今帰ったばあちゃんが聞いているのですが
Sleep関数ってなんのために存在するのですか?
DoEventsとの違いは?
0977デフォルトの名無しさん2016/02/18(木) 13:23:51.48ID:7/4guD7j
>>976
スリープは、ハチ公前広場で指定時刻まで待機(恋人有り)
DoEventsは、ハチ公前広場で何もしないでボーッと突っ立ってる状態(寂しい独り者)

前者は待機していなければならないので、何があっても待機する。
後者はボーッと突っ立ってるだけなので、他に命令が来ればそれに従う。
0978デフォルトの名無しさん2016/02/18(木) 15:24:56.76ID:niHzXDQD
「SleepとDoEventsはどう違うの?」はレス乞食のコピペ
相手しなくていいよ >>965 >>976
「Subと値を返さないFunctionは以下同文」のパターンもある

「わからないならレスしなくていい」までがワンセット
0979デフォルトの名無しさん2016/02/18(木) 15:46:18.90ID:7/4guD7j
>>978
OK

NGワードにぶっこんだわ
0980デフォルトの名無しさん2016/02/18(木) 19:25:02.56ID:nQtvKuWd
>>978
わからないならレスしなくていい
0981デフォルトの名無しさん2016/02/18(木) 19:36:47.16ID:l9x3v9SX
まぁでも>>977の説明はなかなかに秀逸。
0982デフォルトの名無しさん2016/02/18(木) 21:27:57.74ID:Rl3zK8VE
>>977のDoEventsの説明はさすがに間違いだろ。
「仕事しながら突っ立ってる」ならいいけど。
0983デフォルトの名無しさん2016/02/18(木) 21:53:34.83ID:l9x3v9SX
>>982
もしかして君は、たとえばIfからEnd Ifの間に書かれた複数の命令は、
「命令の優先順位こそあれ、可能であれば全て同時に実行される」と考えていたりしない?
0984デフォルトの名無しさん2016/02/18(木) 22:00:05.61ID:Rl3zK8VE
>>983

>>977には「ボーッと突っ立っている。他に命令が来ればそれに従う」とあるのだぞ?
じゃあ他の命令が来ないときは何をやっていると?
0985デフォルトの名無しさん2016/02/18(木) 22:13:00.56ID:42G1e3Su
そもそもDoEventsがやるのはメッセージの処理であって
ぼーと突っ立てるんじゃなくて、たまってる別の仕事をチェックする事なわけだが
0986デフォルトの名無しさん2016/02/18(木) 22:14:17.77ID:1Ki47seW
ボーッと突っ立ってると言うより
恋人とデート(メインの仕事)中にたまに他のねーちゃんの相手(GUI の処理)する様なもんかな w
0987デフォルトの名無しさん2016/02/18(木) 22:25:41.37ID:Rl3zK8VE
もしかして、「DoEvents関数そのもの」のことを言っているなら、たしかにそれ自体がメインの仕事を持って働いているわけではない。
でもDoEventsは待ったりはしないから「突っ立っている」と表現は当たらない。
0988デフォルトの名無しさん2016/02/18(木) 22:25:55.12ID:l9x3v9SX
>>984
命令が来ない時は命令が来るのを監視するんだよ。

もしC++でウィンドウ付きのWindowsアプリケーションソフトを作った経験がなければ、
閉じるボタンで閉じるだけのウィンドウアプリケーションを作ってみれば感覚がつかめると思うよ。
0989デフォルトの名無しさん2016/02/18(木) 22:27:21.71ID:Rl3zK8VE
>>988
入れ違いになったが>>987
0990デフォルトの名無しさん2016/02/18(木) 22:30:01.18ID:l9x3v9SX
>>987
そもそもがSleep命令との対比だよ?

DoEvents命令でウィンドウプロシージャに制御を戻す行為を(その時に発生する1Tick以上の遅延を)「待つ」と表現しないなら、
そもそもパソコン全体の処理が「待つ」のは電源落ちた時だけって事になるんじゃない?
0991デフォルトの名無しさん2016/02/18(木) 22:36:30.17ID:Rl3zK8VE
>>990
その説自体は否定しないが、>>977
「DoEventsは、ハチ公前広場で何もしないでボーッと突っ立ってる状態(寂しい独り者)」
を擁護するのは厳しいだろ。
0992デフォルトの名無しさん2016/02/18(木) 22:41:25.18ID:l9x3v9SX
>>991
そう? だってDoEvents命令は仮にメッセージキューに何の命令も無かったらすぐに戻ってくるのに対して、
Sleep命令は他にタスクが無くても指定した時間まではOSから呼び出されないから、振る舞いを表現するには適切じゃないかなぁ。
0993デフォルトの名無しさん2016/02/18(木) 23:06:08.58ID:Rl3zK8VE
>>992
適切かねえ...
以下のプログラムのコメントに違和感はない?

Sub test1(ByVal t As Long)
'指定秒数待機
Sleep 1000 * t
End Sub

Sub test2()
'何もしないでボーッと待機
DoEvents
End Sub
0994デフォルトの名無しさん2016/02/18(木) 23:08:06.79ID:XVu7nbkc
入力データ(Excel)のデータを判断し、データを出力するvbaを組んでいます。

入力データを
INとして
出力データは3帳票あるんどえ
OUT(1 to 3)
と仮定します。

INデータは30列で1万行あります。

うち5列目の判定でOUT(1)とOUT(3)を出力します
うち6列目の判定でOUT(3)を出力します

この際一番はやい出力方法はどちらになるのでしょうか?


@INもOUTもcellsで判定し、cellsで出力

AINを配列化し、OUTはcellsで出力

またOUTを配列化して出力する場合
OUTの帳票で一部セルが結合されております
これの対処方法などを教えていただきたいです
0995デフォルトの名無しさん2016/02/18(木) 23:13:01.65ID:l9x3v9SX
>>993
やっぱり君は一度、ウィンドウアプリケーションの作成を経験して考えてみるべきだと思うよ。
Sleep命令とDoEvents命令が同列の機能だと勘違いしている気がしてならない。

>>994
配列で扱ってセルに出力する。
結合に関しては結合されていないテンプレートに、配列を出力した後に結合を行うようにするか、
真っ新なシートに出力した後で、装飾全般をマクロで行うようにする。
0996デフォルトの名無しさん2016/02/18(木) 23:19:16.27ID:Rl3zK8VE
>>995
ん、君こそ>>997の「DoEventsはボーッと突っ立っているだけ」を支持してるんだから、SleepとDoEventsを同等に見てると言うに相応しいのでは?
0997デフォルトの名無しさん2016/02/18(木) 23:27:28.28ID:jiQGl0+C
>>992
何の命令も無かったら「すぐに」戻ってくる  (←これは正しい)
を「ボーッと」と表現してる限り話はかみ合わないと思うの
0998デフォルトの名無しさん2016/02/18(木) 23:29:20.75ID:HG4Fn1co
外部のデバッガからDoEventで何してるか確認できるよね
なんで確認しないの
0999デフォルトの名無しさん2016/02/18(木) 23:31:31.34ID:l9x3v9SX
>>996
while(1){
functionA;
sleep 1; //←Sleep命令
}

void functionA(){
int f = 1;
while(f){
f = 0; //←DoEvents命令
}
}

実際の中身が同等とは思わないけど、おおよそこういう処理の違いだよ?
1000デフォルトの名無しさん2016/02/18(木) 23:46:03.83ID:jiQGl0+C
>>994
INもOUTも配列にして>>995が言ってるようにすればいいと思うけど、
「5列目の判定でOUT(1)とOUT(3)を出力します」の「5列目の判定」ってどういう意味?
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
10021002Over 1000Thread
2ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 2ちゃんねる専用ブラウザからの広告除去
★ 2ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
http://premium.2ch.net/
http://pink-chan-store.myshopify.com/
レス数が1000を超えています。これ以上書き込みはできません。