Excel VBA 質問スレ Part39 [転載禁止]©5ch.io
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2015/11/27(金) 20:36:45.35ID:9HV+ag/s___
___ /____ヽ ____
/____\ | |´・ω・`| | /___ヽ
.l |´・ω・`| ニX二 . ̄ ̄ ̄ 二X二 |´・ω・`| l 俺たちに任せろ
!、 ̄ ̄ ̄ ヽ | | /  ̄ ̄ ̄/
ヽ_/ヽ、 ヽ__) \__/\_/. /_/ ノヽ_/
 ̄  ̄ ̄
このスレはコード書き込みOKです。
作成依頼もOKですが、作成依頼限定ではありません。
コードが嫌な人・作成依頼が嫌な人は別スレ建ててください。
※前スレ
Excel VBA 質問スレ Part38 [転載禁止]2ch.net
http://peace.2ch.net/test/read.cgi/tech/1441619979/
0002デフォルトの名無しさん
2015/11/30(月) 19:06:16.48ID:zHM+I8Nt0003デフォルトの名無しさん
2015/11/30(月) 21:18:18.94ID:QHANvkhd0004デフォルトの名無しさん
2015/12/01(火) 19:27:05.42ID:m+Ed34Zj前スレで大量のセルを処理するときは配列に入れろみたいな書きこみを見ましたが、配列が役に立つ局面を教えていただけないでしょうか。
よろしくお願いします
0005デフォルトの名無しさん
2015/12/01(火) 20:28:12.95ID:eT3ZeD+F配列処理はワークシートのレイアウトとかと無関係に独立したライブラリにしやすい。
0006デフォルトの名無しさん
2015/12/01(火) 21:07:28.65ID:3m4PeF6rZ80エミュレータからやり直せ。
0007デフォルトの名無しさん
2015/12/01(火) 21:20:20.66ID:bdqEzHLJそもそもエクセルのセル自体が広義の意味では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:VMDnA6sJDebug.Print Worksheets("sheet1").Index
ちなみに index値は シートタブの左から 1 2 3 ・・・・
となりますので シートオブジェクトと index値は常に 一致するとは限りませんよ
0010デフォルトの名無しさん
2015/12/01(火) 23:44:42.53ID:6iNC03K1(たとえば、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それではWorksheets(1)というのはシートタブの1番左という意味でいいのでしょうか?
0012デフォルトの名無しさん
2015/12/01(火) 23:49:02.31ID:6iNC03K1w = 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そゆこと
ちなみにこれで確かめてみればどうかな?
Debug.Print Worksheets(1).Name
シート名が返ります
0014デフォルトの名無しさん
2015/12/01(火) 23:57:05.93ID:DoIn4zBFなるるー
イミディエイトで確認できました!ありがと
0015デフォルトの名無しさん
2015/12/02(水) 00:19:38.80ID:iA4P55nLこんなかんじ?
日と曜日は別の列のほうが良い気もするけど(セルの書式が違っちゃうから)
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ありがとうございます
こんなに簡素化できるものなんですね……精進します
0017デフォルトの名無しさん
2015/12/02(水) 00:33:35.11ID:BpyWczK7添削してみた
変数はわかりやすい名前にした方が良いと思うぞ
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
001817
2015/12/02(水) 00:34:44.42ID:BpyWczK7>>12 さんへね
0019デフォルトの名無しさん
2015/12/02(水) 00:38:55.45ID:iA4P55nLとりあえず年(仮に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叩かれること覚悟で書きますが、同じ処理の繰り返しなら配列変数ではなくても、for next
とかfor eachステートメントでは、望ましくないのでしょうか?
00217
2015/12/02(水) 11:33:14.55ID:ZeoaW+75番号で指定すると言うことは
配列変数との親和性が高いと思いませんか?
既に言及したとおり、
エクセルのセルは2次元の配列ですから、
セルに対してfor next で繰り返し処理をするというのは
まさしく配列操作そのものなのです。
もし、広義の配列そのものではなく、
redimで宣言する狭義の配列変数のみについて
有効性を論じたいと言うのであれば、
セルに代入するよりも速度が速いとか
メモリの消費量が少ないとか、
3次元以上の配列を扱いたいケース
(まぁ、多次元配列は遅いらしいですけど)
とか、そんな理由があげられますね。
とはいえ、配列など不要だと思うならば
無理に使う必要は無いですし、
その辺は使う人の自由ですよね。
0022デフォルトの名無しさん
2015/12/02(水) 11:50:42.44ID:tBPWNP4P配列を使わず for next とはどのようなものを想定しているんですか?
00234
2015/12/02(水) 12:15:32.57ID:IdfHYqnbてっきり、配列とは
Dim i(5) as long
みたいなものだけを指すと考えており、上手い使い方がよくわかっていませんでした
0024デフォルトの名無しさん
2015/12/02(水) 12:32:59.22ID:1aVlPH12そういう固定長配列とReDimで作る可変長配列がある。>>21氏の言うところの狭義の配列ですね。
「For Nextも配列だっのですか」という文は意味不明ですが、何かを勘違いしてる?。
0025デフォルトの名無しさん
2015/12/02(水) 13:35:58.72ID:ES2jo2hu演算子を変数に格納することはできませんか?
b = ”<=”
If n & b & 10 then
みたいに使いたいのですが、型が一致しませんというエラーとなります。
00267
2015/12/02(水) 14:29:54.99ID:xdo22nBPでいけます
0027デフォルトの名無しさん
2015/12/02(水) 15:59:46.36ID:IdfHYqnb自分にとって配列とは狭義のものと、(A1:C5)みたいなものだけをだけだと思ってました。
Fornextは、配列と関係ないと考えてました
0028デフォルトの名無しさん
2015/12/02(水) 17:50:57.38ID:megPAB6Iありがとうございました!
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:1aVlPH12varA = a、varA = bでいい。後ろの()は不要。varAはVariantだからそれでいける。
代入したものは元の配列のコピーであって別物だよ。コピーする意味はあまりないと思うけど?
0031デフォルトの名無しさん
2015/12/02(水) 19:26:54.23ID:UPwzPe+Lありがとうございます。助かりました!
a.bは既に要素が入ってる配列のつもりでした。
後に場合分けで参照するときにコード短縮の為に変数格納しました。
少し書き方が悪かったですね。すいません。
0032デフォルトの名無しさん
2015/12/04(金) 14:58:36.71ID:R21wXbu/0033デフォルトの名無しさん
2015/12/04(金) 17:23:30.92ID:gPECvysoできるシリーズのヤツ
お勧めはしないけど
0034デフォルトの名無しさん
2015/12/04(金) 18:25:37.86ID:R21wXbu/0035デフォルトの名無しさん
2015/12/04(金) 19:42:49.81ID:otf7riqF0036デフォルトの名無しさん
2015/12/04(金) 19:59:12.15ID:sb8rC8Nqある程度使える様になってから逆引き辞典買ったけど余り役には立ってない
0037デフォルトの名無しさん
2015/12/05(土) 04:12:41.80ID:CzoZcA89ネットが今ほど充実してなかった大昔ならいざ知らず
ほとんどマクロの記録とネットでの検索で十分だしね
ま、構文の文法すら分らない超初心者なら
適当な入門書は読んだ方が良いとは思うけど
0038デフォルトの名無しさん
2015/12/05(土) 07:09:21.83ID:r4Zj1qpg入門書なら最近でたVBAの神様オススメ
小説仕立てで楽しく読み進められる
0039デフォルトの名無しさん
2015/12/05(土) 09:12:30.30ID:R3VpKF0Eやはり一度はしっかりとした言語仕様とリファレンスの本読みたいね
自分も知らずにEvaluateとか自作してしまったし
0040デフォルトの名無しさん
2015/12/05(土) 18:36:02.45ID:kpxGhXzNスゲー
どうやったら出来るのかソーゾーも出来ない。
俺だったら精々不等号のパターン4つかそこらの場合分けで条件分岐させるのが関の山で、evaluateみたいに文字列で自由に式評価させるなんてとても無理だ。
0041デフォルトの名無しさん
2015/12/05(土) 19:51:10.55ID:xfTuOD8g第三者に見られる環境ならば逆に他人のコードも見れるって事じゃないか、見て盗め
0042デフォルトの名無しさん
2015/12/05(土) 22:14:54.16ID:2rD0PXa4Evaluate自作なんて無理でしょ。というか目指すべきことじゃないよ実行時に意味が確定するなんて。
0043デフォルトの名無しさん
2015/12/06(日) 01:02:05.80ID:RRzw5NLa乗算の度に小数点以下の切り上げを行う(しない場合もある)必要があって、
しかも計算式をユーザーが入力するというツールを作る際に使った
0044デフォルトの名無しさん
2015/12/06(日) 01:19:20.97ID:Rb3lVfqw0045デフォルトの名無しさん
2015/12/07(月) 09:13:19.44ID:jD12UvhK寿司奢るって言われて
コンビニの納豆巻き一本渡されるぐらいのガッカリ感だな
0046デフォルトの名無しさん
2015/12/07(月) 21:09:19.70ID:6aFt31sh四則計算のみ(括弧対応)のEvaluate
https://ideone.com/imts1M
あまり使ってないから正しく動くかどうかは保証しない
0047デフォルトの名無しさん
2015/12/08(火) 11:48:40.10ID:W1o0a1vT0048デフォルトの名無しさん
2015/12/08(火) 19:21:03.28ID:ZPfyD2axhttp://i.imgur.com/ctFP56p.png
0049デフォルトの名無しさん
2015/12/08(火) 19:24:33.40ID:eOnXmxYQ0050デフォルトの名無しさん
2015/12/08(火) 19:45:20.81ID:WQt5IVqj3 とか -3 をそのまま打てばいいやん w
0051デフォルトの名無しさん
2015/12/08(火) 19:52:00.68ID:8bkF9KCf例えばVBAで
A1に○○代入(数値)
A2に○○代入(数値)
〜
A20に○○代入(数値)
B1セルの値をB2に代入
みたいなVBAがあるとして
ここでB1セルにはA1〜A20を使ってifとか色々な関数使った長い式があるとする
この場合にB1セルの計算が終わる前にVBAが追い越して数値を代入することってありえるの?
0052デフォルトの名無しさん
2015/12/08(火) 19:55:43.49ID:ZPfyD2ax=if(a3>a2,3,-3)を入力しても無理だった・・・
0053デフォルトの名無しさん
2015/12/08(火) 19:57:18.42ID:J4OFLa1h同時には実行されないから、関数よりもマクロが先に実行される仕組みならマクロが先に代入する。
>>52
VBAの話題ではない。
0054デフォルトの名無しさん
2015/12/08(火) 20:50:48.64ID:4cJ0X+3R無理って何だよ?それでいけるだろ
0055デフォルトの名無しさん
2015/12/08(火) 21:36:53.02ID:KvNJeD9mセルの書式が文字列とかじゃね
0056デフォルトの名無しさん
2015/12/08(火) 21:49:08.87ID:46EuwWyR計算方法が自動なら
> A1に○○代入(数値)
で再計算が行なわれる
以下
> A20に○○代入(数値)
まで、20回計算される
なので
> この場合にB1セルの計算が終わる前にVBAが追い越して数値を代入することってありえるの?
なんてことはない
20回も計算するのは時間がかかってしょうがないと言う時は、最初に Application.Calculation = xlCalculationManual とかして計算しない様にしておいて、A20 に代入したあとで、Application.Calculate とか実行しすると計算は1回ですむ
0057デフォルトの名無しさん
2015/12/09(水) 01:33:16.84ID:bb4JBp1rなるほどなー
要するに、VBAでセルに数値が代入される→数値が変わった時点でセル内の再計算→またVBAに戻る
って感じか。なるほどなるほど。ありがと
0058デフォルトの名無しさん
2015/12/09(水) 01:56:13.57ID:A8KFlPn0=if(c3>c2;3;-3)
どうもありがとう
0059デフォルトの名無しさん
2015/12/09(水) 02:02:30.52ID:ZB9BGZbY0060デフォルトの名無しさん
2015/12/09(水) 11:36:59.80ID:NOtadkaSどうすればよいですか?
マクロにしたいのは数式の上書き部分だけです
0061デフォルトの名無しさん
2015/12/09(水) 12:25:31.08ID:ZB9BGZbY例えばC列に数式を入れたいときは
Range("C1").Formula = "=VLOOKUP(B1,A:A,1)"
みたいに数式を文字列にしてセルのFormulaに入れればいい
0062デフォルトの名無しさん
2015/12/09(水) 16:22:59.08ID:NOtadkaSありがとうございます。
0063デフォルトの名無しさん
2015/12/09(水) 16:59:02.21ID:bb4JBp1r0064デフォルトの名無しさん
2015/12/09(水) 17:09:37.89ID:h+7RpR46マジレスすると、ギャンブルするような学生はいらんってことになるな
0065デフォルトの名無しさん
2015/12/09(水) 17:21:13.51ID:bb4JBp1rやっぱり印象悪いかな
データ集めて統計使って指数出したりするの好きなんだよな
0066デフォルトの名無しさん
2015/12/09(水) 17:57:02.43ID:h+7RpR46さらにマジレスすると、独創的なアルゴリズムを使った予想をしているならそのアルゴリズム
その、実装がむずかしいとされているものを既存のアルゴリズムを用いて実装したり(遺伝的
アルゴリズムで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できる新人なんてほんと稀
できますって入ってきた奴が作ったものはバグだらけ
未経験のほうがよっぽどバグが少ない
まあこんなこともあるから経験の有無なんてほとんど誤差
0071デフォルトの名無しさん
2015/12/10(木) 08:00:18.24ID:+sdtvmJJ面白がってはくれるだろうね。
採用につながるかは分からんが。
0072デフォルトの名無しさん
2015/12/10(木) 13:03:32.27ID:uuSHmo9z画面ロック中(スリープ後など)だけ、なぜかSELECT要素が参照できなくなります
他のINPUT要素などは問題なく参照できます
IE8からIE11に変えてから起きるようになった気がします
できるだけIE11で行いたいのですが、何が原因でこのようなことが起きるのでしょうか
0073デフォルトの名無しさん
2015/12/10(木) 16:23:47.48ID:vMPjIzZKセルにコピペした、上記のようなラベルを含むハイパーリンクを正常に機能させたいのですが、
「#」が「-」に置き換わっているような挙動をして意図したページが開けません。
ハイパーリンクの編集で確認しても上記の通り入力されています。改善方法はあるでしょうか?
0074デフォルトの名無しさん
2015/12/10(木) 16:26:05.28ID:kl2q0NOfこのリンクはクリックするなよ
007573
2015/12/10(木) 16:30:40.32ID:vMPjIzZK0076デフォルトの名無しさん
2015/12/10(木) 20:33:09.52ID:GTbd/bMS連想配列が使えることを知ったのだけど
動的配列(要素を放り込むと勝手に伸びていく配列)はないですかね
普通の配列は、要素数を決めてDimなりReDimなりしてからでないと
使えなくて不便で…
0077デフォルトの名無しさん
2015/12/10(木) 20:37:45.04ID:m24vGLChないと思うけどDictinaryではダメなポイントは何?
0078デフォルトの名無しさん
2015/12/10(木) 20:39:24.26ID:CRNEQuUV標準で使えるのはCollectionかな。
動的配列はByRefで渡した先で要素数を変更出来るので、
これを利用して自分で配列伸ばす関数作る事も出来るけど。
0079デフォルトの名無しさん
2015/12/10(木) 21:02:59.81ID:GTbd/bMSDictionaryは要素の格納順が保証されないというのがネックです
例を挙げると、印刷すべきシート名を条件判断で選別しながら配列に放り込んでいき
最後にFor Eachで格納順に印刷する、というような処理があります
>>78
Collectionを調べてみます
ありがとうございます
0080デフォルトの名無しさん
2015/12/10(木) 21:11:34.59ID:CRNEQuUV0081デフォルトの名無しさん
2015/12/10(木) 21:50:20.75ID:LgWPhvQBなんだ、その程度の配列サイズと頻度か。
だったら (配列, 追加する要素) を引数にとって、要素がひとつだけ大きい配列を返す関数を作ればいい。
効率なんか考えなくてOK。
0082デフォルトの名無しさん
2015/12/10(木) 22:14:34.44ID:Ek2aQ7ctmyArray(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:CRNEQuUVk = 1
For i = 1 To 10
If myArray(5, k) < myArray(5, i) Then k = i
Next
Debug.Print k
End Sub
よく分からんがこういう事か?
0084デフォルトの名無しさん
2015/12/10(木) 22:39:25.36ID:Ek2aQ7ct早速どうも。コードありがとうございます。
myArray(1,1) = 3
myArray(1,2) = 5
myArray(1,3) = 4
のとき、For文でしらみつぶしに調べることなく、
最大値となる(1,2)などを返す方法はないかなと思ったのです。
0085デフォルトの名無しさん
2015/12/10(木) 22:48:15.01ID:CRNEQuUV既にソートされているとか、そういう前提条件がない場合は虱潰し以外の方法はない。
素人くさいコードを書きたくないなら、VBAを見よう見まねで触る前に電子工学を学ぶ事をお勧めする。
0086デフォルトの名無しさん
2015/12/10(木) 23:06:09.69ID:Ek2aQ7ct端的な回答ありがとうございました。
前提条件はないので、シラミ潰しします。
素人なので素人臭くないスマートなコードに憧れます。
この発想が素人臭いのかもしれませんがw
0087デフォルトの名無しさん
2015/12/11(金) 01:01:09.23ID:Gc5rivvs0088デフォルトの名無しさん
2015/12/11(金) 12:01:23.27ID:e4IICcKihttp://officetanaka.net/excel/vba/tips/tips98.htm
0089デフォルトの名無しさん
2015/12/11(金) 12:29:13.10ID:Wogf6bzXMSDN見てみたが、これ使えるのかな?
ArrayList.Sort (IComparer)
指定した比較演算子を使用して、ArrayList 全体内の要素を並べ替えます。
0090デフォルトの名無しさん
2015/12/11(金) 13:44:45.39ID:mI4o0uWv帰って調べてみよ。
0091デフォルトの名無しさん
2015/12/11(金) 14:19:39.54ID:UJeMV01i>>82です。Match引数を配列とすることもできるんですね。
でもあるサイトで配列を引数とするとちょっと遅いみたいな記述がありちょっと心配ですが。
>>88
横からですが便利そうですね。
0092デフォルトの名無しさん
2015/12/11(金) 22:44:49.09ID:fIX9Jv1V式は適当です
条件1の時
if cells(1,1) = cells(2,1) then
条件2の時
if cells(1,1) = cells(2,1) and cells(1,2) = cells(2,2) then
条件3の時
if cells(1,1) = cells(2,1) and cells(1,2) = cells(2,2) and cells(1,3) = cells(2,3) then
条件nの時
if cells(1,1) = cells(2,1) and cells(1,2) = cells(2,2) and ... and cells(1,n) = cells(2,n) then
てな具合に、判断する項目が増減する時、
スマートな条件式を記述する方法ってありませんか?
0093デフォルトの名無しさん
2015/12/11(金) 23:03:48.59ID:Kp08ZeACもっと具体的でないとスマートな(効率的な)式が分からないけど、
例にしているものをコードにするなら
Function Test() as Boolean
For Each x In Range(Cells(1, 1), Cells(1, Columns.Count).End(xlToLeft))
If x <> x.Offset(1, 0) Then Exit Function
Next
Test = True
End Function
か
Function Test(cond As Long) As Boolean
For i = 1 To cond
If Cells(1, i) <> Cells(2, i) Then Exit Function
Next
Test = True
End Function
かな。
0094デフォルトの名無しさん
2015/12/12(土) 01:48:04.85ID:FuRVZgYl1.表示されたページのAタグの中からキーワードを抽出してクリック
2.ページが表示されたら、そのままプルダウンなどを選択してクリック
と連続して操作させたいのですが、Aタグから抽出してクリックはできるものの、
その後デバッグになってしまい以降の処理が連続で行えません。
Set objA = objIE.Document.getElementsByTagName(
0095デフォルトの名無しさん
2015/12/12(土) 01:49:15.80ID:FuRVZgYlFor n = 0 To objA.Length - 1
If InStr(objA(n).OuterHTML, "キーワード") > 0 Then
objA(n).Click
Exit For
End If
Next
Set objA = Nothing
このあとにデバックしてしまいます…
0096デフォルトの名無しさん
2015/12/12(土) 02:09:55.86ID:D2WGnzzU>>デバッグになってしまい
エラーになるって意味かな?
エラーになるコードはどれ?
もしかして
Set objA = Nothing
した後でobjAへオブジェクトをセットしないで
objA使ってたりしない?
0097デフォルトの名無しさん
2015/12/12(土) 13:20:27.33ID:7OCEnpiZこれってどうやって作ってる?
0098デフォルトの名無しさん
2015/12/12(土) 13:33:18.20ID:Yc8YF04u作った本人に聞くべきだけど、たぶん普通のゲームの作り方そのままじゃないの。
0099デフォルトの名無しさん
2015/12/12(土) 20:28:13.88ID:/A1wTFJW回答ありがとうございます。
やってみます。
0100デフォルトの名無しさん
2015/12/12(土) 22:56:55.45ID:rj6YNvj2全く分からない。最初見たとき、エミュレータにExcelに見えるガワみたいなものを持たせたのかと思ったけど、
選択されたCellに対してのみBGが配色されているところ、BGの中でも木やブロックに配色の影響がないところを見ると、単純にエミュレータと言う訳でも無さそう。
ただ2面目でExcelの操作中にマリオが少し動くところを見ると、Excelとマリオは別スレッドで動いているのかもしれない。そうなると、
マリオはExcelの機能で動かしている訳ではないのではないかと思える。
でもここまできっちり作るには、もしエミュレータを利用していたとしても、少なくともファミコンのパレット機能を知っていなければならないし、
エデイト機能も持たせてあると言っていることから、
BGとその当たり判定のメモリへの展開も知っていることになる。
でも多分この人は自前で作ってるっぽい。何故ならCellの配色がBGの更に後ろにあって、Excelの機能と思しきものがファミコンの機能と思えるところの
更に奥に食い込んでいるように見えるから。
結論を言うとちょっと信じがたい話だけど、見よう見まねか、解析したか分からないけど、マリオをOpenGLみたいなものでキチンと作って
それをExcel上で動かしているのではと推測する。でもあくまで俺の推測だから本当のところは分からないよ。
0101デフォルトの名無しさん
2015/12/19(土) 09:12:27.95ID:C2ZsZsZchttp://hayabusa3.2ch.net/test/read.cgi/news/1450395043/
0102デフォルトの名無しさん
2015/12/19(土) 11:11:30.68ID:9nLc0qec0103デフォルトの名無しさん
2015/12/19(土) 17:17:12.17ID:t89iAcrUIComparer インターフェイスが使えるかってこと?
よくわからないけど無理なんじゃないかな。
自分はArrayList知らなかったので比較演算子も含めてライブラリでほげふがしてる。
0104デフォルトの名無しさん
2015/12/20(日) 00:57:16.89ID:zSz2t60X試してないけど出来るんじゃないかな
.Netフレームワークインストールしてること前提だけど
0105デフォルトの名無しさん
2015/12/20(日) 01:05:44.36ID:3zlmhSVS出来るのなら可能性とし色々広がりそうだ。
ただソートやreverseするため(だけ)にデータ構造としてArrayListクラスを使うのを強いられるのはちょっといやだな。
0106デフォルトの名無しさん
2015/12/20(日) 14:32:56.31ID:JRgauTa2エラーが出て困っています
エラー内容は引数は省略できません
というものなのですが
引数は特に指定していないので間違っていないと思うのですが
何がまちがっているのでしょうか?
-呼び出し側
Dim myDic As Dictionary
myDic = CreateDictionary()
-関数
Function CreateDictionary() As Dictionary
Dim aDictionary As Dictionary
Set aDictionary = New Dictionary
With aDictionary
.Add Key:="key1", Item:="value1"
.Add Key:="key2", Item:="value2"
End With
Set CreateDictionary = aDictionary
End Function
0107デフォルトの名無しさん
2015/12/20(日) 14:35:48.69ID:JRgauTa2呼び出し側にsetって書いたらエラーが消えました
でも理由がわかりません
functionの場合は常にsetで代入しないといけないんでしょうか?
0108デフォルトの名無しさん
2015/12/20(日) 15:42:29.15ID:g0mIqi7V関数の戻り値の型がオブジェクトだから(Dictionaryオブジェクト)
0109デフォルトの名無しさん
2015/12/21(月) 11:44:54.68ID:0jWvYEdMとやっていって最高いくつまで足せますか?
0110デフォルトの名無しさん
2015/12/21(月) 11:53:17.32ID:dc09zofZVBEの文字数限界の話?やってみるしかないんじゃね?
0111デフォルトの名無しさん
2015/12/21(月) 12:57:48.76ID:VBR60bJo次の行に継続した場合の制限は非公開
0112デフォルトの名無しさん
2015/12/21(月) 13:31:34.58ID:VBR60bJo物理行は1024バイト
論理行は65535バイト
0113デフォルトの名無しさん
2015/12/21(月) 21:17:23.77ID:GVmX1WAGaaaaaaaaaaaaaaaaaaaaaaaaaaaa・・・
a
となったから1023バイトまでだな
0114デフォルトの名無しさん
2015/12/21(月) 22:31:21.13ID:ilnG5VR/行継続文字は2バイト消費するから、実際に使えるのは1021*24+1023=25527バイトってことになる
MSDNに書いてある「1行=65535バイト」ってのは到達できないと思われる
0115デフォルトの名無しさん
2015/12/21(月) 23:10:27.03ID:ilnG5VR/こんな簡単な足し算一つで落とせるとは、意外だったわ
もしかして>>109は、このことをわかってて質問したのか?
0116デフォルトの名無しさん
2015/12/21(月) 23:13:43.52ID:ilnG5VR/とりあえずCells(r, 453)までは大丈夫
今んとこソースの計算式は1023文字×7行
0117デフォルトの名無しさん
2015/12/21(月) 23:20:59.48ID:ilnG5VR/というわけで、1論理行の計算式で足せるのは512まで
つまり右辺に書けるRangeオブジェクトは511個まで
Cells(r, 1) = Cells(r, 2) + ・・・ + Cells(R, 512) まで
どうやら式が長すぎると一時的に作られるRangeオブジェクトがワークエリアを食い尽くすらしい
VBEの文字数の限界とはまったく関係ないところでひっかかるとは知らんかった
まだまだ勉強が足らんな
0118デフォルトの名無しさん
2015/12/21(月) 23:34:01.24ID:ilnG5VR/http://codepad.org/Dx6bniP1
0119デフォルトの名無しさん
2015/12/21(月) 23:55:25.73ID:GVmX1WAG0120今日から俺は
2015/12/22(火) 00:29:32.95ID:1Uckp5vQhttp://ww10.puny.jp/uploader/download/1450711580.zip
パスワード:abc
エラー処理に問題がないか、
アドバイス頂けませんでしょうか?
標準モジュールの
'<サブ処理(1)>
Sub 画像貼付〜
のエラー処理なんですが、
プログラマーの方のアドバイスを頂きたいです。
0121デフォルトの名無しさん
2015/12/22(火) 11:18:45.06ID:1IjfeHrTメイン関数が600行もあるので、内容は見る気まったくしない。
気づいた点:
・2行とか3行の連続した空行があるが、気持ち悪いのでやめて欲しい
・1個50行未満程度のFunction/Subに分けろ。そうすれば第三者も読む気になる
個人的な好み:
・変数宣言は必要になった場所で行え。そうすれば多少関数が長くなっても何十も変数宣言が続くことはなくなる
0122デフォルトの名無しさん
2015/12/22(火) 11:30:47.44ID:71TpXAZk0123デフォルトの名無しさん
2015/12/22(火) 11:37:34.62ID:1IjfeHrT・Tabキーでインデントしろ(普通は4つのスペースでインデントされる)
・不明な変数名(いきなりDnameって何?となって読む気かなりダウン)
→ コメントを入れるより、適切なネーミングで
・Dim CellWidth, CellHeight As Long
CellWidthはLongにならない
・SheetをActivateする必要があるか?(RangeをSelectする必要があるか?)
・コメントされたコードは削除しろ
・「一旦画像をシートに貼り付け」とか書いてるが、なぜそうするのか意図不明
内容を全く知らないコードを読むのは、100行あたり10分から1時間程度かかる。
人に見てもらいたいなら、見てもらえるように努力しろ。
0124デフォルトの名無しさん
2015/12/22(火) 12:08:50.62ID:71TpXAZkFunction/Sub名と引数名は重要だけど。
0125デフォルトの名無しさん
2015/12/22(火) 12:29:08.69ID:eV+iF7ba仕事なら他人のソースでも必死に解読するけど、これは暇つぶしにできる範疇を超えてるは
0126デフォルトの名無しさん
2015/12/22(火) 13:06:10.62ID:1IjfeHrTDnameは画像貼付()の第一引数。
引数名もひどいが、ローカル変数名もひどい。
> 一般論だがローカル変数名なんてどうでもよくない?
一般的にはどうだかわからないが、個人的にはどうでもよくない。
ネーミング超重要。
0127デフォルトの名無しさん
2015/12/22(火) 13:28:33.58ID:71TpXAZkそうなのか。
自分は逆だ。
名付けることが必要なローカル変数が発生すること自体避けたいタイプ。
0128デフォルトの名無しさん
2015/12/22(火) 13:47:37.98ID:1IjfeHrT一般論じゃないの?
それは一般的なのかみたいな不毛な議論したくないから曖昧な表現にしたが、
ローカル変数とはいえ、ネーミングに気を遣うのは良い習慣。
0129デフォルトの名無しさん
2015/12/22(火) 14:15:48.13ID:6+FfHGxJ0130デフォルトの名無しさん
2015/12/22(火) 14:25:32.96ID:toHtA+zz結局1関数内に複数の処理があって、2箇所以上で使う変数は関数の先頭で宣言してる
0131デフォルトの名無しさん
2015/12/22(火) 14:56:45.78ID:1IjfeHrTローカル変数のスコープとコードの読みやすさについては、「変数のスコープを小さくする」で
ググることをお勧めする。
ローカル変数宣言・定義を関数の先頭で行うのを強制される言語以外では、スコープを最小と
することが推奨される。
0132デフォルトの名無しさん
2015/12/22(火) 15:12:03.64ID:71TpXAZk確かにその点は困りものだ。
別な変数を使えばよいのだが、あまり綺麗ではない。
0133デフォルトの名無しさん
2015/12/22(火) 17:04:33.32ID:EK9FZmu1>ローカル変数宣言・定義を関数の先頭で行うのを強制される言語
べつにVBAは関数の先頭での宣言を「強制」なんてされないが、スコープは狭い方が良い
ただし、VBAにはブロックレベルのスコープがないだけ
関数の先頭での宣言が「薦められていた」のは
スコープの先頭で、そのスコープ内の変数まとめて宣言した方がわかりやすいよね、って言う事
つかローカル変数定義を関数の先頭で宣言する事を強制される言語ってたとえば何?
>>130,132
まあ、そういう時は関数分けろってのが一般的な解決法なんじゃね
0134デフォルトの名無しさん
2015/12/22(火) 17:24:02.60ID:1IjfeHrTVBAの「変数のスコープ」は、宣言・定義した位置から下だよ。
だから、関数の先頭じゃなくてもっと狭められる。
0135デフォルトの名無しさん
2015/12/22(火) 17:48:13.32ID:nxtSgXHpブロックレベル、というのが通じてないのかな?
つまりひとつの関数の中で、
For Each z ・・・
Dim tmp As Variant
・・・
Next z
For Each z ・・・
Dim tmp As String
・・・
Next z
というように変数tmpが2回宣言出来ればいいのに、それが出来ないことを嘆いている。
0136デフォルトの名無しさん
2015/12/22(火) 17:50:28.23ID:1IjfeHrT> ブロックレベル、というのが通じてないのかな?
いや、通じてるよ。
だからといって
> 結局1関数内に複数の処理があって、2箇所以上で使う変数は関数の先頭で宣言してる
とするのではなくて、もっと変数のスコープを狭めた方が良いといってるんだけど。
0137デフォルトの名無しさん
2015/12/22(火) 17:57:48.82ID:1IjfeHrTローカル変数定義を関数の先頭で宣言する事を強制される言語(*1)は
しかたがないので変数の宣言は関数の先頭でするしかない。
*1) Ada由来言語とか。PL/SQLとか。
そうではない言語では、なるべく変数のスコープを狭めるのが良い。
・関数ブロック内のどこででも変数定義できるのなら、なるべく利用する直前で宣言する
・ブロックスコープが存在する言語では(C系とか)は、そのブロック内で宣言する
VBAはブロックスコープが存在しないが、関数ブロック内のどこででも変数定義できるので、
なるべく利用する直前で宣言するのが良い。
例外はJavascriptで、ホイスティングによりブロックスコープ内で宣言した変数のスコープは
関数スコープにまで拡大する。
それにより
・それでも利用する直前で宣言するよ派
・知らない人がいるかもしれないので、関数の先頭でまとめてするよ派
が存在する。
0138デフォルトの名無しさん
2015/12/22(火) 18:50:23.05ID:EK9FZmu1厳密には、VBAでは変数宣言(定義)は必須ではないので
変数定義の位置によってスコープが変更されるようなことはないだろう
Option Explicitオフで宣言前に変数を使用してた場合、エラーになるのは変数宣言の方
つまり変数宣言以前にそのスコープにその変数が存在している
まあ、Option Explicitはオンで使うべきではあるんだが
>>137
VBAではブロックスコープは存在しないので
「関数ブロック内のどこででも変数定義できる」(ただし利用は定義後のみ)
が
「なるべく利用する直前で宣言する」のではなく、関数の先頭で宣言する事が薦められていた
MSがそう勧めてたこともあるので、VBAプログラマの多くは関数先頭宣言派だと思うぞ
まあ俺は最近は使う直前宣言に改宗したがw
0139デフォルトの名無しさん
2015/12/22(火) 19:27:38.21ID:nxtSgXHpというかプロシージャの長さによるね。10行越えたらちょっと考える。
0140デフォルトの名無しさん
2015/12/22(火) 19:41:14.20ID:eV+iF7baVBAの変数宣言は記述を省略できるだけで、変数を使った時点でVariant型として自動的に宣言される
コードに書かなかった場合はシステムが代わりに宣言しといてくれるんだよ
このソースを実行してみればわかる
Sub Macro1()
a = 1 ' ← 変数を使おうとした時点で、書かなくても自動的に Dim a As Variant が実行される
Dim a As Variant '←宣言が重複するのでエラーになる
End Sub
0141デフォルトの名無しさん
2015/12/22(火) 19:54:40.62ID:7wWwuT9q> Option Explicitオフで
今時あり得ん
議論する価値もない
0142デフォルトの名無しさん
2015/12/22(火) 19:57:05.43ID:EK9FZmu1スコープを狭めるとかいうのは間違いで、スコープは言語によって定義されていて
宣言位置や方法なんかによってどのスコープか決定されるだけだ
VBAで一番狭いスコープはプロシジャレベルなので、どこで宣言しようがそれよりスコープが狭まることはない
狭まるのは利用可能範囲だけ
まあ、利用可能範囲をスコープというならそれでも良いかという気がしてきたからもうどうでもいいやw
0143デフォルトの名無しさん
2015/12/22(火) 20:04:19.43ID:nxtSgXHp0144デフォルトの名無しさん
2015/12/22(火) 20:10:47.37ID:nxtSgXHpならそんなものほとんどつける意味ないし無駄。
0145デフォルトの名無しさん
2015/12/23(水) 00:21:34.23ID:e7byjM9n必要の根拠しめせないけど、
意味ないし無駄という根拠示せる?(Option Explicitを付けないメリット)
煽りじゃないですよ。
0146デフォルトの名無しさん
2015/12/23(水) 00:41:23.47ID:M5GRmAfS自分の経験上、一度も役立ったことがないというのが根拠。
付けないことにメリットがあるとまでは言ってない。
エディタの設定でOption Explicitはついているのだが、これまで一度も「変数が定義されていません」のエラーを出したことはない。
つまりDimし忘れることなんて普通は起こらないし、それへの保険なんて任意保険で十分。やらないのはあり得んみたいな言説はおかしい。
0147デフォルトの名無しさん
2015/12/23(水) 05:36:21.78ID:zGgTg8AL変数宣言しなくてもエラーにならないなんて忘れてたわ。
田中さんはこんな風に言ってるな。
http://officetanaka.net/excel/vba/beginner/11.htm
因みに余談だけど、.NetになるとOption Strictと言うのがあって、Option Explicitと一緒に書かれることが多い。
これは実行時バインディングで型が決まるものや、暗黙の変換を許可するかしないかを決めるものだけど、
型推論によって実行時バインディングで型を決めざるを得ないときもあるので、基本、付けると言うスタンスに留まることが多いかな。つまり、絶対ではない。
ただ、VBAであれ.Netであれ、Option Explicitに関しては今まで付けておいて困ったことはないな。
変数宣言も型も、明示的に設定していることが前提なら付けておいた方がいいだろな。
大丈夫な人は大丈夫なんだろうけど、それは「俺は今まで簡単なロジックでバグを出したことが無いから、
簡単なロジック部分のテストケースは作らない」と言ってるのと同じだな。
その人の信用性も有るんだろうけど、Option Explicitが付いていれば「ちゃんと変数宣言してますよ」と言うことの担保にもなる。
それでも、「いや、俺は絶対そんなミスは犯さないから付けない」と言うのであれば、もうそれ以上言うこと無いし。
最も大概の仕事場のコーディングルールでは付けることになっていると思うけどね。
0148デフォルトの名無しさん
2015/12/23(水) 09:46:21.95ID:QfnO5T+O若いっていいなあ
0149デフォルトの名無しさん
2015/12/23(水) 10:49:34.08ID:e7byjM9nみなさんレスどうもです。
俺はつける派かなOption Explicit
0150デフォルトの名無しさん
2015/12/23(水) 10:54:12.55ID:M5GRmAfSつけて助かったことあるの?
結局Optiob Explicitなんてシートベルトの価値ではなくて、チャリンコの補助輪の価値しかないと思う。
デフォルトで付けいて放置してるけどさ。
0151デフォルトの名無しさん
2015/12/23(水) 12:18:30.14ID:QfnO5T+O0152デフォルトの名無しさん
2015/12/23(水) 12:29:09.66ID:MZJ58G0+VBAのConstは定数式を与えなきゃならないので使いにくい。
0153デフォルトの名無しさん
2015/12/23(水) 19:56:05.25ID:M5GRmAfS引数もByRef Const受けできればいい。
0154デフォルトの名無しさん
2015/12/24(木) 10:15:31.90ID:+bsSlAyH> 狭まるのは利用可能範囲だけ
それを一般には変数のスコープという。
「第3回 スコープを意識したプログラミング―その2 変数のスコープ」
http://gihyo.jp/dev/serial/01/code/000302
0155デフォルトの名無しさん
2015/12/24(木) 10:17:46.35ID:+bsSlAyH> エディタの設定でOption Explicitはついているのだが、これまで一度も「変数が定義されていません」のエラーを出したことはない。
> つまりDimし忘れることなんて普通は起こらないし、それへの保険なんて任意保険で十分。やらないのはあり得んみたいな言説はおかしい。
typoは検出できる。
これ重要。
0156デフォルトの名無しさん
2015/12/24(木) 10:33:42.93ID:acHF714F正しいが、スコープの始まりはコントロールできても終わりはプロシージャの最後までと決まってるのが惜しいところだね。
0157デフォルトの名無しさん
2015/12/24(木) 10:59:36.15ID:+bsSlAyH> MSがそう勧めてたこともあるので、VBAプログラマの多くは関数先頭宣言派だと思うぞ
これか。
「変数とメソッドのスコープ」
https://msdn.microsoft.com/ja-jp/library/ms973875.aspx
> プロシージャ レベル スコープ
>
> 変数を宣言するための最も一般的な場所は、プロシージャの先頭です。これらの変数は、
> プロシージャ全体で利用することができます。プロシージャの先頭に変数を置いておけば、
> どのプロシージャでも変数宣言を簡単に見つけることができます。すべての変数宣言を
> 先頭に置くという習慣を身に着けていないと、変数がどこで宣言されているかがわからず、
> 変数に関連するバグを追跡するのに余分な時間がかかる可能性があります。
2001年12月の記事だけど、今でもMSはこう思ってるんだろうか。
0158デフォルトの名無しさん
2015/12/24(木) 11:34:44.56ID:acHF714Fそう思う
>>155
そう思う
自分はtypoはその場ですぐ見つけたいので、Option Explicitだけじゃなく他の方法も取ってる。
>>157
記憶がおぼろだけど、ずっと昔のVBEは先頭でのDimしかできなかったよね?
0159デフォルトの名無しさん
2015/12/24(木) 15:57:20.63ID:ta6MMntYVBAにおいて推奨するスタイルが変わったって記事は見たことが無いから
たぶん今でも一応そのスタイルが推奨なんじゃね
言語が変わればまた話は変わるけどな
VBAはVB6とほぼ同じスタイルが推奨されてたけど
VB6のスタイルはVB.NETでは推奨されてない奴も多いし
>>158
おれの記憶ではVBAは当初からずっと、先頭以外でもDim出来たが
0160デフォルトの名無しさん
2015/12/24(木) 16:00:38.09ID:Xid/rDIR0161デフォルトの名無しさん
2015/12/24(木) 16:30:39.57ID:+bsSlAyH2001年の古い記事に従うこともないと思うがな。
0162デフォルトの名無しさん
2015/12/24(木) 17:04:02.10ID:acHF714Fそうだっけ?なら自分の記憶違いかな。
使用直前の宣言はもちろんいいんだけど、VBAって初期化を同時にできないのがすごく残念だと思う。
Dim rootPai As Double = 2 * Atn(1#) ^ 0.5
って書きたいし、もっと言えば
Const rootPai As Double = 2 * Atn(1#) ^ 0.5
としたい。
0163デフォルトの名無しさん
2015/12/24(木) 21:25:39.16ID:ta6MMntY>リテラル値、その他の定数、Is を除く算術演算子や論理演算子を組み合わせた式を指定します。
らしい
関数とか使わん単純な計算式しか書けないのね
まあ、定数なんだから関数とか呼ぶなってことか
0164デフォルトの名無しさん
2015/12/24(木) 22:14:19.63ID:ZMYfZV7G0165デフォルトの名無しさん
2015/12/25(金) 00:23:24.10ID:H9I2iCjo>結局Optiob Explicitなんてシートベルトの価値ではなくて、チャリンコの補助輪の価値しかないと思う。
Optiobなんて書き間違えるくらいだし
そっちにはチャリンコの補助輪程度でも必要なんじゃないの?
0166デフォルトの名無しさん
2015/12/25(金) 00:55:16.56ID:QRbvg4rg「補助輪なんていらねーよ」と言いながら実際は補助輪を外したことがないというオチがもう付いてるじゃないかw
0167デフォルトの名無しさん
2015/12/25(金) 01:04:21.93ID:VYJL9Hpsって宣言をして、プロシージャ内でその変数を使うときは "camelcase" ってタイプする。
その直後に "camelCase" になったらtypoしてないし、でなきゃypoがある。
いつのまにやらそういう癖がついた。
0168デフォルトの名無しさん
2015/12/25(金) 08:22:37.15ID:pG0WUl9G0169デフォルトの名無しさん
2015/12/25(金) 08:25:15.59ID:zlW/tpNm0170デフォルトの名無しさん
2015/12/25(金) 16:52:37.89ID:WI9GtdKx変数名が間違っててそれぞれ別の変数として判別されてたのはみた事がある
コードが短かったからすぐ気がついたけど
長いコードだったら気付かず見過ごしてたかもしれない
後自分で書いたコードでは Option Explicit は必ず付けてるんだけど、
配列変数の宣言は
Dim Hoge() As Long
みたいに動的に宣言して、後から
Redim Hoge(5)
みたいに要素数を再定義してた
そしたら Redim の所で変数名間違えてて
最初の変数が要素数不定のままでエラーになってしまい、
原因が分らずに悩んだ事があった
Redimだけでも変数宣言として認められちゃうから
Option Explicit 使ってても
こういうパターンの間違いだとエラーにならんのよね
0171デフォルトの名無しさん
2015/12/25(金) 19:17:09.01ID:zlW/tpNm0172デフォルトの名無しさん
2015/12/26(土) 07:11:55.98ID:4Qu0RrtJ.Netのインテリセンスのこと?
.Net暫くやってて久しぶりにVBAでコーディングすると
余りの入力補助の利かなさにメモ帳に書いてるんじゃないかと錯覚するときあるよね。
特に打ち掛けのとき、変数名とか忘れて離れたところからコピーで取ってこようとすると
「ぷりん」とか音たててエラーメッセージが出て、元の行に飛ばされるのにはカチンとくる。
0173デフォルトの名無しさん
2015/12/26(土) 07:39:57.84ID:c6cv0MwcDim list_1 という宣言に対しては、liST_1 とか入力するの。
慣れると小指が勝手にシフトキーを押すようになるw
0174デフォルトの名無しさん
2015/12/26(土) 18:14:13.26ID:0Oe8t7C6自動構文チェック外せよ
0175デフォルトの名無しさん
2015/12/28(月) 09:45:36.91ID:6hjtvMur0176デフォルトの名無しさん
2015/12/28(月) 10:05:26.91ID:aQp7bRaK処理が終わったらPCをスリープ状態にする方法を教えたまえ
0177デフォルトの名無しさん
2015/12/28(月) 10:39:16.43ID:FcSlXts61 2 3 4
. __ __ _
,i,_,i_ ,-,_ ,-i,_,l 、 :.. :. ≡=-i'__l,
| `i /'-' `i //l l iコ==ラ`'i ti
| lヽi li, → | lヽl li → l i,,l l | → ./ /l/
| l-'l |,l | | // l `"|iコ='' / /
. 'Fヲ|,H E三l_l_A | .i .| / /
,i_| .| | | || | i' /l .l,
-'‐' | || |_ l l .ヽ,ヽ,
‐' ' `‐' -'-' -'-'
脱ぐ たたむ コーヒーを 砂糖と塩を
つくる まちがえる。
0178デフォルトの名無しさん
2015/12/28(月) 12:05:07.13ID:6hjtvMurやってみましたがうまくいきません
0179デフォルトの名無しさん
2015/12/28(月) 12:15:06.34ID:ylUAFX7e0180デフォルトの名無しさん
2015/12/28(月) 13:10:18.21ID:ehrXe3tWDeclare定義してやれば 使えたよ
ちなみに(Windows8.1 + Excel2013)
0181デフォルトの名無しさん
2015/12/28(月) 13:16:09.60ID:ylUAFX7eじゃあSetSuspendstate使ってみれば?
仮想環境とかだと上手くいかないかもしれないが。
0182180
2015/12/28(月) 14:13:12.83ID:ehrXe3tW専ブラスレの騒動に見舞われたので詳しく書けないけど
https://msdn.microsoft.com/en-us/library/aa373201(VS.85).aspx
あたりが参考にならないかな?(VBAじゃないけどね)
あとは ぐぐって
0183デフォルトの名無しさん
2015/12/29(火) 10:58:22.65ID:u34Ypxabその夢がかなわない単語1つのときはどうしたらいいですか?
[通常]
createSheet
fillData
[問題]
initialize
0184デフォルトの名無しさん
2015/12/29(火) 11:42:28.29ID:WJw28H2b単語2つ目をひねり出すか…
そのままでも問題なさそうだけど
0185デフォルトの名無しさん
2015/12/29(火) 15:31:29.70ID:fz57zrCLふと思ったんだけど
[通常] の方は "どうする"+"何を" になってるけど
[問題] の方は "どうする" だけなんよね
だったらこっちも "どうする" + "何を"にすればよくね?
initializeData
initializeCell
とかとか
こう出来ない理由とかあるの?
0186デフォルトの名無しさん
2015/12/30(水) 14:22:33.58ID:WC2i3iyl一番最初のループだけ特別なコードを1行書きたいのですが
その判別はどうします?
ノーマルなFor i=1 to構文では、If i=1 Thenと単純ですが。
0187デフォルトの名無しさん
2015/12/30(水) 14:34:26.62ID:PBmz2gbU0188デフォルトの名無しさん
2015/12/30(水) 14:43:38.04ID:JPIixvGPだいたい同一処理を分かりやすくする為にEachがあるのであって、違う処理するならEachに含めちゃダメだろ。
0189デフォルトの名無しさん
2015/12/30(水) 15:23:36.66ID:yH9ydeBOforでやらない理由は?
0190デフォルトの名無しさん
2015/12/30(水) 15:37:44.87ID:WC2i3iylなにそれ?
>>188
For eachがわかりやすいので可能な限り絶対この構文を使っています(For i=1は古い)。
でもそんなときでも最初のループだけ実行したいステートメントがあるというのはVBAの経験の浅い人じゃなければよくあると思うのですが。
>>189
Forでやると言ってるのですが
0191デフォルトの名無しさん
2015/12/30(水) 15:42:53.87ID:WC2i3iylSet objTest = Nothing
という解放処理をするべきかどうかの議論がときどきありますが、
そもそもメモリ使用に関してこのSet objTest = Nothingはなにをやっているのでしょうか?
これがはっきり分かっていないままで議論しても意味がないと思うのですが。
基本的にオブジェクト変数の場合でもプロシージャ内の変数はプロシージャを抜けると役目を終えたということで消えますが
その参照先であるオブジェクトの実体はメモリに残ったままですよね?
Javaのガベージコレクションの機能があるという話はこのVBAで聞いたことが無いので
もしその実体をSet objTest = Nothingで消せるということなら
いかなるオブジェクト変数を使ったあとは必ずSet objTest = Nothingを書くべき、というのが(もし上の仮定が正しい場合)わたしの見解なのですが。
0192183
2015/12/30(水) 15:47:44.59ID:WC2i3iyl>>184
>>185
それはinitializeという英単語が引数を2つとる動詞、つまり1つ目の引数は「実行する主体」、2つ目の引数が「初期化される物」でうまくいきますが
例えば引数を1つしか取らない英単語、例えばrunだとかdieだとかappearの場合どうしたらいいのですか?
0193デフォルトの名無しさん
2015/12/30(水) 15:50:40.47ID:WC2i3iylinitializeの場合は、うんこをひねり出すかのごとく
initiializeDataやinitializeCellのようにDataやCellをひねり出すことができましたが
先にも書いたrunやdieやappearなどのときはどうしますか?
0194185
2015/12/30(水) 16:18:23.99ID:0l8puLjU全部英文で考えれば "何を"の君のゆう所の 実行主体 が付けれると思うが
・・・をrun 何を実行?(runProcess)
・・・をdie 何を殺す(が死ぬ)? (dieProcess)
・・・をappear 何が出る?(appearBigin)
※英単語の訳等の間違いはスルーして下さいね
これ以上 君に付き合うつもりは無いので あしからず(年末なんで)
0195デフォルトの名無しさん
2015/12/30(水) 16:27:23.62ID:Y9esFwyMFirstTime とかのフラグかな
0196デフォルトの名無しさん
2015/12/30(水) 18:39:36.91ID:PBmz2gbUFor i = 1 は古いって言われても、
m(i) = m1(i) + m2(i)
をどう実装するんですか?
0197デフォルトの名無しさん
2015/12/30(水) 18:58:26.89ID:JPIixvGP別の処理を施したいなら、別のForEach文なり、Do文なりを利用すべき。
そもそもForEachはオブジェクト型を扱わない場合は処理が重いので必要が無い限り極力使わない方がいい。
別の処理なら別のループとして分けられるはず。変なこだわりを持っているせいでややこしい事になっているだけ。
0198デフォルトの名無しさん
2015/12/30(水) 19:05:08.95ID:yH9ydeBO0199デフォルトの名無しさん
2015/12/30(水) 20:02:26.27ID:bRclVw7x何回目の処理かをループ内で知ることの出来る機能を持ったものがある
VBAは残念ながらそれがないから、自分でカウンタ変数を用意するか
一個目のデータに特有の項目があるならそれを判定するか、だろうね
0200デフォルトの名無しさん
2015/12/30(水) 22:00:46.01ID:yDP/mW46最初の時だけ何らかの値を計算してとっておくということであれば
Dim val As Variant として、ループの中で
If IsEmpty(val) Then val = ...
とやればいい。
余計なフラグなしにできるl。
0201デフォルトの名無しさん
2015/12/30(水) 23:44:51.92ID:RDoNJfseで
マクロ"更新"の最後にまた上のコード
以前教えてもらった1時間毎にマクロを起動するコードですが
23時になると狂って連続で"更新"マクロを繰り返してしまいます
23時から0時へは跨げないということでしょうか? 対策をお願いします
0202デフォルトの名無しさん
2015/12/31(木) 00:00:57.74ID:yJLj8/Bn対策をお願いします(キリッ
上から目線だなオイ
0203デフォルトの名無しさん
2015/12/31(木) 00:47:01.17ID:2YFGdsnlDim 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:EUZydMuqHourは、0〜23を返す。最後には、
23 + 1 = 24
これで値を見てみれば?
Debug.Print TimeSerial(24, 0, 0)
0205191
2015/12/31(木) 08:06:51.15ID:D5b/7JR8答は、For eachループに入る直前にその1回目の書きたかったコードを書けばいいだけでした。
0206186 (=191)
2015/12/31(木) 08:07:43.82ID:D5b/7JR80207デフォルトの名無しさん
2015/12/31(木) 08:13:13.18ID:xcpAmXWKひとつ目の値を使うんじゃないのか?それをどうやって取得するんだよ?
0208デフォルトの名無しさん
2015/12/31(木) 09:43:58.89ID:18DEmBMjもしかして「僕はVBAにとても詳しいんだ」ってプライドを崩されてへそ曲げたのか。
0209デフォルトの名無しさん
2015/12/31(木) 11:11:22.46ID:xcpAmXWKFor 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:3FCNx6UT1.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もうその通りだろうね。稚拙すぎて笑える
0212デフォルトの名無しさん
2015/12/31(木) 14:10:55.55ID:KhBichDlこんなかんじで指定するんじゃなかったっけ
Controls("TextBox" & i).Value
0213デフォルトの名無しさん
2015/12/31(木) 15:23:07.54ID:18DEmBMjFor 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使って判定すれば特定のものだけ除外できるし。
0214210
2015/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のように指定すればいいみたいだけど?
0216デフォルトの名無しさん
2016/01/01(金) 08:16:43.96ID:sVrrx3Fuプログラムが終了するまでずっと有効ですか?
ある区間だけ有効にしたい、あるいはずっと有効しておきたい、のように使い分けたいこともこれから出てくると思うのです。
0217デフォルトの名無しさん
2016/01/01(金) 08:18:12.65ID:sVrrx3Fu0218デフォルトの名無しさん
2016/01/01(金) 09:06:31.31ID:HVUfaNaTあけおめ
On Error はプロシージャ内のみ有効
Application.DisplayAlertsは Excel終了するまで継続のハズ
ちなみに
On Error Resume Next
は短い範囲でかつどうしても実行時エラーの可能性が排除できない
時のみ使う方が良いとおもうよ
ステートメント毎に Errオブジェクトを見てればいいけど
不具合発生してもスルーされるからどこでどんなエラーが発生したか分らなくなる
せめて
On Error Goto ラベル
でトラップ処理するなら別だけど
0219デフォルトの名無しさん
2016/01/01(金) 10:06:58.64ID:sVrrx3Fuどもあり、ことよろ。
そうなんですか、スッキリしました。これでこれから使い分けができそうです。
0220デフォルトの名無しさん
2016/01/01(金) 10:17:22.33ID:NO+H6ZMg> ある区間だけ有効にしたい、あるいはずっと有効しておきたい
On Error Goto 0
0221デフォルトの名無しさん
2016/01/01(金) 19:56:00.98ID:xpOY3CWT個人的にはErr.Raiseをthrowのように使いたいんだけどね
0222デフォルトの名無しさん
2016/01/01(金) 20:52:55.76ID:sVrrx3Fuなるへそありがとう。
0223デフォルトの名無しさん
2016/01/01(金) 20:55:39.83ID:sVrrx3Fuどこに書けばいいとか注意点はありますか?
自分で作ったクラスの中ででもその列挙型定数は使いたいです。
0224デフォルトの名無しさん
2016/01/01(金) 21:04:54.88ID:+cD+YD5u0225デフォルトの名無しさん
2016/01/01(金) 23:06:06.65ID:+cD+YD5u0226デフォルトの名無しさん
2016/01/02(土) 01:20:56.54ID:jWkoNf5r>自分で作ったクラスの中ででもその列挙型定数は使いたいです。
やめたほうがいいです。
ライブラリとして再利用する為なんじゃないの?
むしろ、そのクラスで使うならそのクラスに実装すべきで、他でも使いたいなら
公開すればいいだけ。
クラス以外で実装した列挙型をクラス内で使いたい場合は、クラスの中で再定義
するか、橋渡しするようなプロシージャを用意する必要があるかな。
めんどくさいけどね。
>>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素直にテキストに落としてみては?
0230デフォルトの名無しさん
2016/01/02(土) 09:58:15.99ID:vN/+lOC5確かクラスでパブリックな列挙体を指定すると、クラス.列挙体.列挙値の記述が出来ないはず。
そもそも列挙体はそのクラスから生成したインスタンスで挙動が変わるものでないので、クラスに記述すること自体が微妙。
VBAは.Netと違ってSheardがないので、標準モジュールに記述して使うのが変な挙動をしなくていいと思う。
VBAでクラスを使おうとすると、まだ考え方が確立され切れていないときの状態を引きずった言語だから使い方に戸惑うことが多いよね。
ユーザー定義型なんてもっと顕著にそう言うことが起こるよ。
0231デフォルトの名無しさん
2016/01/02(土) 21:54:01.64ID:MhjWcLlUどういう使いどころあるかな?
0232デフォルトの名無しさん
2016/01/04(月) 06:20:47.61ID:D+zYtfMVまとめて管理するとかもVariantの配列に突っ込めばいいし
もうちょと互換性があれば使ったかもしれないけど
0233デフォルトの名無しさん
2016/01/05(火) 00:10:29.99ID:USCQ6V11Activeってどうやって判断しますか?
UserForm_Click()だとボタンをクリックしたときにはそれが発動されないし。
0234デフォルトの名無しさん
2016/01/05(火) 02:05:35.42ID:Kvov8i6k0235デフォルトの名無しさん
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普通はそのまんまのActivateイベント使うんじゃないかね
>>235
じゃあそれでいいんじゃない
0238デフォルトの名無しさん
2016/01/05(火) 03:22:29.47ID:cUCC3uaz2013だとイベント拾えないなActivateイベント
フォームロード時には発生するんだが…
0239233
2016/01/05(火) 03:30:01.47ID:Kvov8i6kそのActivateがくせもので
フォームが複数あったときにそのフォームがActivateになったときはそのイベントをひろうけど
フォームが1つだとmodelessで開いたとき普通のExcelワークシートからそのフォームにActiveが移動しても
Acticateに書いたコードは実行してくれず無反応なんですよ。
0240デフォルトの名無しさん
2016/01/05(火) 12:34:15.92ID:Kvov8i6k他の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無理だと思う。
Functionにはしたくないんだよね?
0242デフォルトの名無しさん
2016/01/05(火) 12:41:34.28ID:Kvov8i6kFunctionにしてもいいですよ。
でも同様にできなそうです。
0243デフォルトの名無しさん
2016/01/05(火) 12:45:32.43ID:33a1opJu0244デフォルトの名無しさん
2016/01/05(火) 12:51:11.49ID:Kvov8i6k0245デフォルトの名無しさん
2016/01/05(火) 13:01:18.99ID:LntnFA7dああ、戻り値を捨てるってことか。それも無理だと思う。
Functionにして繋げてしまえば?
result = Func1(Func2(Func3(...Addition(5, 8))))
どこにも副作用がなく、無駄な戻り値も無いようにすればいい。
0246デフォルトの名無しさん
2016/01/05(火) 13:02:44.78ID:LntnFA7dJavaを捨てて関数型に移行するのだ。VBAならそれができる。
0247デフォルトの名無しさん
2016/01/05(火) 13:16:48.58ID:YLBFKxeK気持ち悪いのは君の勝手
言語には言語の流儀がある。それが嫌ならやらなきゃいいだけ。逆に、JavaでVBAっぽく
やりたいとかアホ抜かせって話。
そして、普通みなそういう言語毎に流儀は慣れる。気持ち悪いなんて言ってるような奴は
プログラマーとしては三流。
0248デフォルトの名無しさん
2016/01/05(火) 13:56:27.25ID:LntnFA7d>>247ってプログラマなの?
0249デフォルトの名無しさん
2016/01/05(火) 16:31:17.21ID:mlWeSkma非常にレアなケースでしかメリットが出てこないが、消費するヒープがSubの方が少ないから再帰の回数が多くできる
厳密には戻り値の変数エリアを初期化する手間がなくなるので実行速度も誤差程度には速い、はず
0250デフォルトの名無しさん
2016/01/05(火) 19:25:18.04ID:LntnFA7dなるほど
s/ヒープ/スタック/
だよね?
0251デフォルトの名無しさん
2016/01/05(火) 20:12:50.80ID:KIPOXvA0・プリプロセッサを作って変換する
・MSに入社してVBAの言語仕様書を書き換える
・MSを買い取ってVBJをサボートさせる
・…
ただ、こう言う本質的でないところに突っかかる奴はたいてい適性がないので、素直にマをやめた方が本人も周りも幸せになれる
0252デフォルトの名無しさん
2016/01/06(水) 03:05:54.21ID:IHMGmJSjプログラムの覚え始めってインプリンティングみたいな愛着が湧くから、そんな時期なんでしょ。
0253デフォルトの名無しさん
2016/01/06(水) 06:08:03.77ID:wTjSz+NM逆を言えばそれしか出来ないんでしょ?wwwこんな程度で気持ち悪いとか吐いてる程度だから、Java自体のレベルも知れてる。
0254デフォルトの名無しさん
2016/01/06(水) 09:24:36.49ID:qs2eqDcnExcel VBA(windows7 Excel2010 VBA7,0)で パソコンがミュート状態かどうかを
判定したいのですが・・・
ミュート状態だと if 〜 Else で処理(ミュート解除)させようと思っていますが
ミュートかどうかを判定する方法がわかりません
みなさんのお力をお借りしたく書き込みさせて
頂きました。
よろしくお願いします 22歳OL
0255デフォルトの名無しさん
2016/01/06(水) 10:01:38.51ID:nVjV76XEmixerGetControlDetailsを使う
0256デフォルトの名無しさん
2016/01/06(水) 10:04:22.66ID:/XlzX9bHMMDevice API とかでぐぐってみる
0257デフォルトの名無しさん
2016/01/06(水) 10:36:47.15ID:qs2eqDcn>>256
早速の返信ありがとうございます
質問する前にgoogle先生に質問して
mixerGetControlDetails や
API などを使うと出来そうな感じの事が書いてあったのですが・・・
最近VBAを独学で勉強しだした私には難しくどうしたらいいか
よくわからず・・・ここで質問させていただきました
また、お時間ある時でいいのでアドバイスお願いします
まだどうしtらいいかわからないです
22歳OL
0258デフォルトの名無しさん
2016/01/06(水) 10:49:05.08ID:f2GjMEVM最後の1行 なんかバカにされてる気がするぞ
0259デフォルトの名無しさん
2016/01/06(水) 11:47:08.51ID:/XlzX9bH0260デフォルトの名無しさん
2016/01/06(水) 11:48:38.02ID:/XlzX9bH独学はよくない。
明日からavivaに行きなさい。
0261デフォルトの名無しさん
2016/01/06(水) 11:51:57.78ID:nVjV76XEだったらこれからも独学でやれや
俺はグーグル先生みたいに甘くねーぞ
0262デフォルトの名無しさん
2016/01/06(水) 11:57:47.28ID:9dwHBHIu喧嘩売ってんの?
0263デフォルトの名無しさん
2016/01/06(水) 12:48:37.88ID:uGhm1id+0264デフォルトの名無しさん
2016/01/06(水) 12:54:07.42ID:IHMGmJSjオートメーションと呼ばれる手法で、たとえばAccessでCreateObject("Excel.Application")して、
そこで得られたエクセルオブジェクトを利用するっていうんじゃなきゃ不可能じゃないの。
あとはVBSにでもするしか。
0265デフォルトの名無しさん
2016/01/06(水) 13:12:52.54ID:YDWhVPVuまずは誠意を見せたまえ。
おっ○いうp
0266デフォルトの名無しさん
2016/01/06(水) 16:16:54.72ID:uGhm1id+やはり普通には使えないようですね、残念
ブラウザ上で動くサーバーサイドExcelみたいなのがあれば便利だったのですが
0267デフォルトの名無しさん
2016/01/06(水) 16:26:44.21ID:uGhm1id+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:9dwHBHIuGoogle Spreadsheetでも使って下さい。
0269デフォルトの名無しさん
2016/01/06(水) 18:33:10.74ID:jZfE0I4kReset list(1).Item(1), "key", 456
とかなら呼び出せるっぽい
デフォルトプロパティの評価あたりでおかしな事になってるのかもしれん
実はItemは真のデフォルトプロパティじゃないし
0270デフォルトの名無しさん
2016/01/06(水) 20:01:54.35ID:uGhm1id+そういう方法がありましたか
ありがとう
0271初心者A
2016/01/06(水) 20:04:38.71ID:tBMwYmRtうまくいかなくて、悩んでます。
■■■■質問
'SH2のE列に、次のように出力するためには、どのようにコードしたら
いいか教えてもらえませんでしょうか?
0272初心者A
2016/01/06(水) 20:05:11.36ID:tBMwYmRt2
3
4
5
-----
1
3
4
5
-----
1
2
4
5
-----
1
2
3
5
-----
1
2
3
4
-----
0273初心者A
2016/01/06(水) 20:06:39.51ID:tBMwYmRtNo(1)=1
No(2)=2
No(3)=3
No(4)=4
No(5)=5
の配列を、違うシート(シート名:sheet2name)に出力したい。
動的配列ですが、NUM1=5として考えやすくしてみました。
計算結果を出力するシートを、
Set SH2 = Worksheets(sheet2name)とする。
0274初心者A
2016/01/06(水) 20:07:07.71ID:tBMwYmRt1
1
1
1
-----
2
2
2
2
-----
3
3
3
3
-----
4
4
4
4
-----
5
5
5
5
-----
0275初心者A
2016/01/06(水) 20:07:24.26ID:tBMwYmRtと出力するために、次のようにコードしました。
--------------------------------------------------
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真っ当な技と言えるんでしょうか?
0277デフォルトの名無しさん
2016/01/06(水) 20:37:10.97ID:cINiOzEy質問がとっちらかっててよくわからん
とりあえず>>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 num
の間違い
0279初心者A
2016/01/06(水) 21:15:55.49ID:tBMwYmRtやってみます。ありがとうございます。
http://ww10.puny.jp/uploader/download/1452081929.xls
パスワード:abc
Module1で試行錯誤中です。
SH2(シート名:計算結果)の【F列】
SH2.Cells(u + 2, 6).Value=
にデータ出力したいです。
初心者なんで難しいです(>_<)
時間かかりそうです。
0280初心者A
2016/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:GoyK1MG8Cellsの親を省略するみたいな書き方って気持ち悪いと思いませんか
扱うシートが増えたりしたらどうするんですか
0282デフォルトの名無しさん
2016/01/07(木) 01:36:13.89ID:w0ujcVRl好きな方を使えばよい
0283デフォルトの名無しさん
2016/01/07(木) 08:35:20.93ID:bWvRU8750284デフォルトの名無しさん
2016/01/07(木) 09:09:34.45ID:QNCWlpNpどちらでもよくない。
処理中にシートが切り替わると副作用があるので、必ずsheet1.cellのように指定する。
個人で作って使うなら何してもいいが、人に渡す時はそんな舐めたことすんじゃねーぞ
0285デフォルトの名無しさん
2016/01/07(木) 09:29:17.60ID:bWvRU875人に渡すってどういう意味?
0286初心者A
2016/01/07(木) 12:18:16.88ID:pq62efvo下記のURL先のエクセルファイル
(ファイル名:2点間距離の差011)の
計算結果シートにて、
●D値が多い順の表を完成させたい。
●D値の合計が大きい順の表を完成させたい。
どうコーディングすればいいか、アドバイス
頂けると幸いですm(_ _)mぺこり
http://ww10.puny.jp/uploader/download/1452136421.xls
パスワード;abc
0287初心者A
2016/01/07(木) 12:19:39.64ID:pq62efvo点間距離の差を計算結果シートの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+0Iqya1-b1
a2-b2
a3-b3
の表完成させて並び変えたら
0289初心者A
2016/01/07(木) 18:17:44.40ID:pq62efvoここまで、できました。
現状で満足してますが
できれば、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初心者A
2016/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:v5mg4Nrt0293デフォルトの名無しさん
2016/01/07(木) 19:11:08.03ID:bWvRU875どこのソース?
一般企業での利用者の存在数から考えて無理だと思う。
0294デフォルトの名無しさん
2016/01/07(木) 19:37:43.86ID:2nH+0Iqyしかしエクセルでマイナンバーとか管理されたら
それに近いところでVBAが動いてたらまずいでしょ
だから時代についていくためにVBAを切り捨てる必要がある
0295デフォルトの名無しさん
2016/01/07(木) 19:47:50.85ID:bWvRU8750296初心者A
2016/01/07(木) 19:54:26.63ID:pq62efvo0297初心者A
2016/01/07(木) 19:57:16.31ID:pq62efvoそうでした。マクロの記録がありましたね。
やってみます。2行〜最終行を選択ればいいのかな?
0298デフォルトの名無しさん
2016/01/07(木) 19:58:23.02ID:2nH+0Iqyサポートじゃなくてセールス文句だから
ネットにつないでも安全なエクセルって感じかな
0299初心者A
2016/01/07(木) 23:46:18.98ID:pq62efvo0300初心者A
2016/01/07(木) 23:47:38.29ID:pq62efvoSub 並べ替え()
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初心者A
2016/01/07(木) 23:49:14.75ID:pq62efvoSH2.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:ZpBAcVz8http://jobinjapan.jp/job-listing/keyword-vba.html
0304デフォルトの名無しさん
2016/01/08(金) 15:12:20.20ID:9Hdlf+duそのテクニックというもの自体知らないので、
よろしかったらもっと詳しく教えてください
0305デフォルトの名無しさん
2016/01/08(金) 16:51:24.45ID:VkXSxnl8Dim 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これ一回じゃあかんのか
0307デフォルトの名無しさん
2016/01/08(金) 18:07:13.41ID:VkXSxnl8なぜかダメ。
長さが変わらないからやる意味なしと判断されるのか...は不明。
0308デフォルトの名無しさん
2016/01/08(金) 18:20:31.18ID:u+GM9q1y意味がよくわからない。
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えー?
下の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ヘルプ(2007)には
>キーワード Preserve を使用した場合、動的配列のサイズを変更するために変えられるのは、添字の上限だけです。添字の下限を変更しようとすると、エラーが発生します。
って書いてあるな
>これが仕様的に正しいと言えるのか
やってみたが2007では出来てるみたいだが、ヘルプには出来ないと書いてあるのだから
仕様的に正しいとは言えないと思うが
過去のバージョンではホントにエラー出てたような気もするんだが
いつの間にかこっそり拡張されたのかねぇ
0311デフォルトの名無しさん
2016/01/08(金) 18:53:30.77ID:ujpdqUME2007の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検索するとこんなのがあったけど
a)キーワード Preserve を指定した場合、変更できるのは、動的配列の最後の次元のサイズに限られます。
また、次元数は変更できません。
b)つまり、キーワード Preserve を使用した場合、動的配列のサイズを変更するために変えられるのは、添字の上限だけです。
添字の下限を変更しようとすると、エラーが発生します。
つまりだからbはaの2以上の次元配列の話
v(3,5)
の3は変えられなくて5は変えられる
添え字の上限とは5(数値じゃなく一番右にあるって意味)のこと
0314デフォルトの名無しさん
2016/01/08(金) 19:09:45.61ID:ujpdqUMEもし2次元以上の配列に限る話だったとしても、その意味は
(3, 1 To 5)を(3, 0 To 5)に出来ませんって事
次元と添字の上限下限は別の話。上限下限は次元ごとに存在んするんだよ
0315デフォルトの名無しさん
2016/01/08(金) 23:46:16.59ID:EVmIpiZQアホな
0316デフォルトの名無しさん
2016/01/09(土) 09:51:48.56ID:eE0tOkYTExcelの自動操作をしたければ外部からやれってことらしいね
ついでにワードみたいに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:DEcEG5aT0320デフォルトの名無しさん
2016/01/09(土) 20:11:29.37ID:h3R10OzOそれを確実にすべて変更する方法ってありますか?
置換は確実じゃないのでダメです。
例えば、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文字列とかコメントとかまで考えると…
0323デフォルトの名無しさん
2016/01/09(土) 22:01:41.40ID:sD5C6F8wVBAのエスケープやコメント処理って比較的楽な気がするし
既にそういうのありそうだけど
0324デフォルトの名無しさん
2016/01/09(土) 22:02:50.59ID:h3R10OzO割引してくれるの?
0325デフォルトの名無しさん
2016/01/09(土) 22:03:52.65ID:h3R10OzO0326デフォルトの名無しさん
2016/01/09(土) 22:07:18.41ID:sD5C6F8w自分で書けば100%割引でお得だよ
0327312
2016/01/09(土) 22:16:44.24ID:CpCNnIMMお騒がせしましたがうまくいったみたいです。
0328デフォルトの名無しさん
2016/01/09(土) 22:22:59.10ID:sD5C6F8w探してみなよ
0329デフォルトの名無しさん
2016/01/09(土) 22:29:04.87ID:1IbXuGB2コメントが「グローバル変数や、Public Subの名前」の説明だったり、文字列を Eval( ) に渡してるとか…
変換しなきゃいいって訳でもなかったりするし
0330デフォルトの名無しさん
2016/01/09(土) 22:32:15.76ID:h3R10OzOなければ探してもしかたがないもんな。
Do Until 見つかる 〜 Loop の無限ループに入ってしまう。
0331デフォルトの名無しさん
2016/01/09(土) 22:36:03.89ID:sD5C6F8wコメントやEvalがあったら置換した上で警告でも出せばいいんだし
こういう場合どう処理するの?なんて本人にしか判らんこと気にしても仕方ない
0332デフォルトの名無しさん
2016/01/09(土) 22:42:38.50ID:enMYG2pF0333デフォルトの名無しさん
2016/01/09(土) 22:43:54.04ID:sD5C6F8wそれで大きな問題が起きるとは思えないし
0334デフォルトの名無しさん
2016/01/10(日) 00:31:35.36ID:hZikTLMsてか、vba編集するのにeclipse立ちあげるとかキチガイにもほどがある
0335デフォルトの名無しさん
2016/01/10(日) 10:18:26.27ID:MoheO9k00336デフォルトの名無しさん
2016/01/10(日) 13:09:04.97ID:2foMUWB4> それで大きな問題が起きるとは思えないし
よほど小さなソフトしか組んだことないか、ぬるい仕事しかしたことないんだろうな…
うらやましい
0337デフォルトの名無しさん
2016/01/10(日) 13:29:33.20ID:vlDN8AGa0338デフォルトの名無しさん
2016/01/10(日) 13:34:42.61ID:AcnVMiQc0339デフォルトの名無しさん
2016/01/10(日) 15:06:14.04ID:NoYOPUfs普通にExcelで書くよな?背景とか文字色も一応変えられるし
ちなみにおまえらの配色構成どうしてる?俺はこんな感じの配色にしてるんだけど、目疲れに良いおすすめあったら教えて
http://uproda.2ch-library.com/913125j4t/lib913125.jpg
0340デフォルトの名無しさん
2016/01/10(日) 15:21:55.12ID:VlwFWjx70341デフォルトの名無しさん
2016/01/10(日) 17:00:44.21ID:NoYOPUfs0342デフォルトの名無しさん
2016/01/10(日) 17:51:41.19ID:wKvoM5NG他言語どころか
Excelのピボットテーブルも入力規則も使ったことが無い
それどころかワークシート関数すら覚束ない
でもVBAだけで給料もらえるから問題なし
0343デフォルトの名無しさん
2016/01/10(日) 18:07:03.32ID:W+alusTR幾ら貰ってるかは知らないけど。
0344デフォルトの名無しさん
2016/01/10(日) 18:43:22.48ID:KeJgEHCD0345デフォルトの名無しさん
2016/01/10(日) 21:31:31.28ID:NoYOPUfs「VBAがプログラムwwあれをプログラムと呼んだら駄目っしょ笑」みたいな人たまにいる
0346デフォルトの名無しさん
2016/01/10(日) 22:07:49.93ID:fKRpFEpVマイクロソフトは勿体ないよな
ビジネスに発展させるには素人にスゲーと思わせてナンボなのに、
新卒の研修にちょっくら使わせてみるかみたいなイメージになってしまっている
0347デフォルトの名無しさん
2016/01/10(日) 22:08:12.25ID:xRSSZTjvExcelは入出力のインタフェースに過ぎないっていう使い方かな?
>>345
一種のコンプレックスのあらわれなんだろうか。
VBAは言語としてダメな点は多いけどね。
0348デフォルトの名無しさん
2016/01/10(日) 22:55:42.57ID:agiL7Ileエクセルがあればすごいんです(キリ って感じ?
OS上で直接動く言語から見たら頭ポンポンしたくなるだろ
0349デフォルトの名無しさん
2016/01/10(日) 23:08:46.92ID:+vbjBZah0350デフォルトの名無しさん
2016/01/10(日) 23:12:22.88ID:+vbjBZah0351デフォルトの名無しさん
2016/01/10(日) 23:32:51.77ID:nfQKqPqr>>344
0352デフォルトの名無しさん
2016/01/11(月) 01:59:22.45ID:AWAF7CGx0353デフォルトの名無しさん
2016/01/11(月) 07:21:46.06ID:gsKg8O84出来ること全く変わらんのだが
0354初心者A
2016/01/11(月) 08:26:22.84ID:HLjXNd8wOption 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初心者A
2016/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初心者A
2016/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素のままのVBAじゃなくて、そういう弄らなきゃいけないところをマイナスポイントにするかどうかで変わってくるな。
むしろプラスポイントと見なす人もいるかも知れんが。
自分は不満点いろいろある。
0358デフォルトの名無しさん
2016/01/11(月) 14:09:09.67ID:np4MR6nOノートPCを閉じてスリープ状態になってしまってもvbaプログラムが止まらないようにする方法はありますか。移動や別の仕事で常にPCを開いとくことができません。よろしくお願いします。
0359デフォルトの名無しさん
2016/01/11(月) 14:11:54.26ID:6idxIuPkhttp://blogs.msdn.com/b/ayatokura/archive/2016/01/09/ga.aspx
0360デフォルトの名無しさん
2016/01/11(月) 14:32:56.61ID:grtS6L7Lそんな過去ネタを今更。
ハッキリ言って糞。使いたいとも思わない。
0361デフォルトの名無しさん
2016/01/11(月) 14:38:18.74ID:qDZy1U6Zスリープって眠るってことだよ
閉じても眠らない設定にしなさい画面だけ消すとか
0362デフォルトの名無しさん
2016/01/11(月) 14:49:09.64ID:db4WHs280363デフォルトの名無しさん
2016/01/11(月) 15:21:48.39ID:Fkm8B5dx電源オプション→カバーを閉じたときの動作の選択→バッテリー駆動/カバーを閉じた時の動作を「何もしない」に設定すれば
パソコンを閉じてもプログラムは動き続ける
0364デフォルトの名無しさん
2016/01/11(月) 15:43:06.72ID:grtS6L7L元々、MSQUERYではやれていたが、実に古臭いUIと仕組みだったからねぇ。
どうなることやら。Accessを殺しに来るのかどうかが注目だがね。
0365デフォルトの名無しさん
2016/01/11(月) 16:02:56.77ID:Fkm8B5dx0366デフォルトの名無しさん
2016/01/11(月) 16:17:41.70ID:grtS6L7Lそもそも、前からAccessについてはその存在について、実際に無くすっていう議論は
出てるんだよ。ユーザの間でも有名な話だぞ。2013が出た時はホッとしたがあの直前
当たり、下手するとそろそろAccessはユーザ数も減ってきており、Excelに統合されて
消えるんじゃないかってね。
この手のアプリってAccessしか実質的に存在しないし、Excelよりもとっつきにくいという
こともあってね。既にテーブル機能は実装されているし、ここにクエリーが本格的に実装
となると、Accessのポジションは危うくなる。
0367デフォルトの名無しさん
2016/01/11(月) 17:00:49.67ID:d/8QAidvむしろこれからはビッグデータの時代なので、accessは逆に更に改良されていかないのかな
0368デフォルトの名無しさん
2016/01/11(月) 17:23:46.95ID:np4MR6nO>カバーを閉じた時の動作を「何もしない」に設定
ありがとうございます。
こちらは、プログラムは動きつづけ、バッテリーも若干節約になるという認識でかまいませんでしょうか?
0369デフォルトの名無しさん
2016/01/11(月) 19:03:39.63ID:U/eWhfN7そうすりゃ無駄に空列とか入れるヤツとか排除できる。
0370デフォルトの名無しさん
2016/01/11(月) 19:43:34.53ID:Fkm8B5dx基本は液晶が消えたままになるだけだから、そんなに節約にはならない
あと機種によっては閉じたまま計算を続けさせると熱暴走するんで、持ち歩くときはケースに入れず通気に注意すること
0371デフォルトの名無しさん
2016/01/11(月) 21:16:15.69ID:N366RwDJ.Netで使いたければ外部から触ればいいだけの話だからな。
いつまでもこのままって訳にも行かないだろうけど、そもそもモジュールをフォルダ階層化して扱えない
VBAは
クラスとか沢山作って管理するのに向いてない。
0372デフォルトの名無しさん
2016/01/11(月) 23:15:43.34ID:JhD6lfDm前後のスペースごと置換すればいいんじゃね
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+wRH2JNRange("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おお
なるほど、そうやるんですね。ありがとうー
0376デフォルトの名無しさん
2016/01/12(火) 06:54:03.50ID:ZPc78C3iA=グローバル変数
って書かれてるともうダメだし
0377デフォルトの名無しさん
2016/01/12(火) 07:49:37.59ID:/ZqCERvoVBE上では必ず前後に半角スペースが入ると思うが?
0378デフォルトの名無しさん
2016/01/12(火) 08:46:16.41ID:ZXe+fB4P俺としては消えてほしくないんだけれどねww
ただ、扱えるカラムや行数増やしたのも、その布石。ただスピードがなwww 現時点
では話にならないし、データベース関数も全く充実していない。
ただ随分前からAccess消えるかもって話は出てるね。
0379デフォルトの名無しさん
2016/01/12(火) 09:47:13.68ID:MvXD/tOc直後がコンマやカッコだとスペースが入らない
0380デフォルトの名無しさん
2016/01/12(火) 10:12:53.76ID:/ZqCERvoなるほど。
両側スペースと . と , と ( を個別にやればいいかな。
プレフィクス・ポストフィクスなんてないよね?
0381デフォルトの名無しさん
2016/01/12(火) 10:34:26.94ID:+GqIZBzhVBAのコードを変更(置換)する VBAコードを作っちゃえば?
0382デフォルトの名無しさん
2016/01/12(火) 10:57:36.37ID:MvXD/tOc0383デフォルトの名無しさん
2016/01/12(火) 12:48:46.20ID:ZPc78C3i行末には入らないし、>>379 の言うように , ( ) とかもダメ
>>380
そんなことするぐらいなら「完全に一致する単語だけ検索する」にチェック入れた方がいい
0384デフォルトの名無しさん
2016/01/12(火) 12:53:56.70ID:ZPc78C3iDBの機能が欲しいだけなら SQL-Server の Compact Edition, Express Edition, LocalDB とかでやればいい
Access って入力画面とか帳票をお手軽に作るツールでしょ
0385デフォルトの名無しさん
2016/01/12(火) 14:03:34.59ID:kdR1XWYYこれ実行すると、v(1) => 1, v(2) => 2, v(3) => Nothingにならないんだ。
わかりづらい。
0386デフォルトの名無しさん
2016/01/12(火) 14:33:05.97ID:1Tg2WctI0387デフォルトの名無しさん
2016/01/12(火) 15:09:45.03ID:/ZqCERvoああ、「前後の空白」の"後"の方は行末の場合ダメってことか。失礼した。
>>385
うん、データをシフトする訳じゃなくて見かけ上のインデックスが変わるだけ。
だからデータをコピーしたり範囲を広げたり縮めたりするのは本来は不要な動作。
もうメモリを直接書き換えることにした。
0388デフォルトの名無しさん
2016/01/12(火) 15:28:05.64ID:WkQGbLg90389デフォルトの名無しさん
2016/01/12(火) 15:50:17.33ID:FWKIiayM0390デフォルトの名無しさん
2016/01/12(火) 16:10:53.83ID:1Tg2WctIAmazonのレビューもわりと高評価だが、VBAの参考書ならもっと他にいいのあるだろう
0391デフォルトの名無しさん
2016/01/12(火) 17:56:50.78ID:wYSSDoUNhttp://jobinjapan.jp/job-listing/keyword-vba.html
0392デフォルトの名無しさん
2016/01/12(火) 19:36:12.43ID:/ZqCERvoMsgBox ("こんにちは") の大間違いって何なん?
0393デフォルトの名無しさん
2016/01/12(火) 23:53:13.87ID:iltzJQ7p0394デフォルトの名無しさん
2016/01/13(水) 00:08:28.28ID:NbxXZYkh0395デフォルトの名無しさん
2016/01/13(水) 00:12:12.63ID:NbxXZYkhWorksheets("Sheet1").Range("A1").Value = "こんにちは"
まだこっちだ
0396デフォルトの名無しさん
2016/01/13(水) 05:12:39.94ID:6j8B4A3/EXCEL VBAでやるなら、な
他の言語でもhello worldなんて、MsgBoxで表示と大差ないけど
ちなみに間違いってのは
MsgBox (こんにちわ)
が間違ってるって話じゃないのか
0397初心者A
2016/01/13(水) 06:27:10.38ID:hFbJh3ij2点間距離の差(22).xls
パスワード:abc
http://ww10.puny.jp/uploader/download/1452633400.xls
そのうち削除します。
もっと、わかりやすくプロシージャを分けた方がいいんだろうけど。
素人が見様見真似で作成したものです。
アドバイスなどありましたら、コメント願います。
0398初心者A
2016/01/13(水) 07:54:34.97ID:hFbJh3ij閉じるボタンが表示されないので、以下のように修正。
Sub 印刷プレビュー()
Application.DisplayFullScreen = False
ActiveWindow.Zoom = True
DoEvents
ActiveSheet.PrintPreview
End Sub
0399初心者A
2016/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初心者A
2016/01/13(水) 08:31:29.89ID:hFbJh3ijhttp://ww10.puny.jp/uploader/download/1452641324.zip
2点間距離の差(23).xls パスワード:abc
0401デフォルトの名無しさん
2016/01/13(水) 13:48:54.18ID:2tOFPV9Bまたお前か。
人に見てもらうようなコードを書こうとは思わないのかね。
0402デフォルトの名無しさん
2016/01/13(水) 14:02:28.80ID:LYjGdwXlひとつの関数に詰め込みすぎ
もっと分割する
そして20行くらいに収めてforやifのネストは2つまでにする
変数も多すぎて見にくい
0403初心者A
2016/01/13(水) 15:46:31.62ID:hFbJh3ij>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プロシージャってのは、別に行数が多いから分けるってもんじゃないぞ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なんつー嘘つくねんこいつww
0410デフォルトの名無しさん
2016/01/14(木) 12:52:34.23ID:q8GDBYq30411デフォルトの名無しさん
2016/01/14(木) 12:53:35.54ID:hDrEawni11インチくらいのMBAで作業でもしてるんじゃね?
0412デフォルトの名無しさん
2016/01/14(木) 13:04:14.50ID:q8GDBYq30413デフォルトの名無しさん
2016/01/14(木) 13:13:29.52ID:lO54s+mO行数が機能の目安になるなんて言ってねーだろww
機能を絞れば行数が短くなるって言ってるんだよw
0414デフォルトの名無しさん
2016/01/14(木) 13:23:17.24ID:QLA7f99bたぶんマックブックエアーの略
0415デフォルトの名無しさん
2016/01/14(木) 13:48:12.51ID:kariNJk1自分の場合は10行超えたら不満、30行超えたらリファクタリングを試みる。
ただし機能を外出しするためにPrivateなプロシージャを作ることは極力しない、という方針。
それをしたらただ分けてるだけだからね。
0416デフォルトの名無しさん
2016/01/14(木) 13:51:57.39ID:q8GDBYq3そのSub内で繰り返しのコードが見つかったので
それをさらにそのSubから呼ばれるSub(サブSubと呼ぼう)にしたいとき
単にそのサブSubをPrivate Subにするしか方法はないですか?
理想はそのSubからしか呼ばれないからそのSubの内部にそのサブSubを置きたいのですが。
0417デフォルトの名無しさん
2016/01/14(木) 14:15:35.60ID:hDrEawniJavaScriptだとそういう書き方は無名関数ってのを使ってよくやるけれどね。
VBAで出来るのかね
0418デフォルトの名無しさん
2016/01/14(木) 17:11:17.68ID:ZyMeHqvf推奨はされてないけど こんなのはある
GoSub...Returnステートメント
http://officetanaka.net/excel/vba/statement/GoSubReturn.htm
0419デフォルトの名無しさん
2016/01/14(木) 18:15:46.06ID:QLA7f99bいっそのことモジュール単位で考えて、
ひとつのモジュールの内容をそのSubとサブSubだけにしちゃうとか
メインのSub以外全部Privateにしとけば
他のモジュールにあるSubからは呼べなく出来るじゃん
0420初心者A
2016/01/14(木) 18:50:08.19ID:sGJ4yhp5解像度: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そう言うことができる言語はあるけど VBA では無理
そもそもそんな機能をつけるぐらいならその前に改善してほしいところは山ほどあるだろ
我慢して付き合っていくしかない
0422デフォルトの名無しさん
2016/01/14(木) 20:47:13.19ID:b/ISwWkGコンボボックスからアクセスできる
main1グループはかためてテキストでつなげておくと
まとまり具合でsubルーチンと状況は変わらん
0423デフォルトの名無しさん
2016/01/14(木) 21:18:50.57ID:6VSn4vPy0424デフォルトの名無しさん
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列書式文字列ってなんだ
>>425
詳しくなる必要ないぞ
このスレのおっさんすら1割も理解してるか怪しい
0427デフォルトの名無しさん
2016/01/15(金) 00:07:51.17ID:+wAhFI3fとにかく、WEBから拾ったサンプルプログラムを動かして、さらに改造して動かす。なんでも良いのでVBAでシステムを組んで効率的なアルゴリズムを考える
0428デフォルトの名無しさん
2016/01/15(金) 00:23:44.72ID:OqTq8akB皮肉なものでVBAはある程度理解したら他の言語をやった方がいい。そうしないと超え辛い一線がある。
>>418
それは止めとけ。N-BASIC時代からの負の遺産だ。
他で呼ばれていないからその処理を関数、またはメソッドにしないと言う考え方そのものが
既に構造化言語の考え方から離れていることに気付かないと。
0429デフォルトの名無しさん
2016/01/15(金) 01:04:34.92ID:ln/l6pM0その言い方だとラムダ式も否定しているように聞こえるが、そういう意図じゃないよね?
0430デフォルトの名無しさん
2016/01/15(金) 01:34:55.99ID:qCDtweIzRPGツクール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の 《 オンライン化ツクール系ソフト 》 制作の企画。
例えば、ガチンコ・ジャッジを直ぐにでも導入できる機能を持っておりながら、
当面それを扱わず単純化させておいて、事後的に導入拡張する際に当該システムを
ブロック構造の組み合わせで後付け挿入できるように予めシステム化してあるソフト(エディター)。
既存の非電源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秒待ちが発生し、その後にプリンタの設定に移ります。
なぜコードの順番と実行順序が逆になってしまうんでしょうか?
理由と解決方法をご存知でしたら教えてください。
Sub test()
Application.SendKeys "^p", True
Application.Wait Now + TimeValue("0:00:03")
End Sub
0433デフォルトの名無しさん
2016/01/15(金) 19:11:48.10ID:GaD4rXA1Application.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設定画面出てから3秒何もできないようにしたいです。
あとこの現象の理由も知りたいです
0435デフォルトの名無しさん
2016/01/15(金) 19:58:32.80ID:KZg44ccIApplication.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:GaD4rXA1DoEvents
Application.Wait Now + TimeValue("0:00:03")
これで様子が変わったけど
0437デフォルトの名無しさん
2016/01/15(金) 20:17:56.81ID:JNdiAV22それを実現するためにプロシージャを分割しようとすると
元のプロシージャで使ってたローカル変数が使えなくなって困ります。
そのへんみなさんはどう対処してますか?
たくさんの引数を使ってわたしてる?
さらにプロシージャ分割を行うとさらに引数を使い、たらいまわしになってしまうのですが。
0438デフォルトの名無しさん
2016/01/15(金) 20:54:52.19ID:GaD4rXA1ローカル変数が使えなくなるの意味がわからないが
参照渡しで何の損もなく長い部分を外に追い出すことは
できると思うけど
0439デフォルトの名無しさん
2016/01/15(金) 21:52:28.32ID:FuCtvVW7VBAでコードの長さを気にしたら負け
変数宣言・初期化・代入だけで10行くらい使う言語なのだから
短くすることより機能単位にまとまっている方がメンテしやすい
ローカル変数を引数に与えてプロシージャ間でたらい回しするのは
グローバル変数を使うことと同じくらい融通の利かないコードになる
0440デフォルトの名無しさん
2016/01/15(金) 22:10:39.54ID:kSdf5HWG0441デフォルトの名無しさん
2016/01/15(金) 22:21:10.91ID:bPOQG/pm0442初心者A
2016/01/15(金) 23:08:24.77ID:frMDKvbE1つ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/pm0444デフォルトの名無しさん
2016/01/15(金) 23:13:30.81ID:bPOQG/pm0445デフォルトの名無しさん
2016/01/16(土) 01:02:35.49ID:ycK3j5Q3リファクタリングでは、カプセル化・疎結合にする
引数をたらい回しにしているのは、密結合になっていて、
分割する場所が悪い
その引数を、クラス・構造体にまとめられないのか?
0446デフォルトの名無しさん
2016/01/16(土) 03:40:59.69ID:jFPwREdtSendKeysはOSにそのキー入力を送ってねってお願いする命令
EXCELがOSからキー入力を受け取るには、マクロがひと段落する必要がある
マクロの途中でOSからの処理を受け取るにはDoEventsつかう
0447デフォルトの名無しさん
2016/01/16(土) 04:26:02.48ID:fCKattgx0448デフォルトの名無しさん
2016/01/16(土) 09:41:21.78ID:17wph6Lkその辺が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だとクラスのメリットが出にくいと思う。
0451デフォルトの名無しさん
2016/01/16(土) 13:32:03.98ID:djcR4kojお前の作ったライブラリを使わさせる時点でこの上ない苦痛なのだから
そんな事考えるだけ時間も無駄だ、好きにしろ
0452デフォルトの名無しさん
2016/01/16(土) 13:43:22.10ID:/WAAZPFPVBAは環境が特殊なので普通のプログラムと同じような勉強の仕方すると混乱する。
クラスって名前がついているだけで、型安全の為に存在しているわけではないと気づけば応用範囲が広がると思う。
0453デフォルトの名無しさん
2016/01/16(土) 14:25:05.94ID:BVnENxs2食わず嫌いせずに使ってみてくれよ
0454デフォルトの名無しさん
2016/01/16(土) 17:52:22.66ID:djcR4kojそこまで言うなら使ってやるからどっかに上げといてくれ
0455デフォルトの名無しさん
2016/01/16(土) 19:16:02.12ID:TOLCMvfB新入社員が仕事になるようクラスで必要なことを整理
するのも有効利用してると思うが
3Dレンダリングとかなるとクラスがないと
人と人とのコミュニケーションすらとれない感じだろ
必要とする度合いと取られる時間で決めたらいいのでは
0456デフォルトの名無しさん
2016/01/18(月) 22:03:45.12ID:IuIvKytx0457デフォルトの名無しさん
2016/01/18(月) 22:24:26.01ID:FooX/JpX0458デフォルトの名無しさん
2016/01/18(月) 23:03:13.57ID:5Km6QlG1スマートにforeachで処理したつもりで全く反映されてなくてぐぎぎぎぎ
0459デフォルトの名無しさん
2016/01/19(火) 00:05:50.65ID:XjyMc5tevbaのclass使えば出来るんじゃないか?
0460デフォルトの名無しさん
2016/01/19(火) 05:48:35.72ID:Knai0l7PVBAにオブジェクト以外の参照型なんて無いからな
0461デフォルトの名無しさん
2016/01/19(火) 08:57:29.57ID:hKwHZ0ioとにかく、場数を踏んで1個1個のメソッドについて使えるようにするしかないよ。
どうすれば車の運転が上手くなりますか? なんて質問と大差ない。
0462デフォルトの名無しさん
2016/01/19(火) 11:40:00.29ID:1yi9x6jx長いプロシージャを分割する作業をしているのですが、10個ある配列をモジュールレベル変数に置くか、その都度値渡しをするか、どちらがスピードは速くなるでしょうか?
パソコンが低スペですが、現在1分ぐらいかかるプログラムです。
0463デフォルトの名無しさん
2016/01/19(火) 11:48:45.64ID:jGMD02BB分割したプロシージャを数千万回とか呼ぶのでなければ、どっちにしても処理時間1分に
与える影響は1秒未満だと思う。
処理時間1分の中の10msとか100msの処理時間の違いなんて、気にしてもしょうがない。
0464デフォルトの名無しさん
2016/01/19(火) 12:03:42.10ID:moFYOEmO参照渡し(ByRef)でダメな理由は?
0465デフォルトの名無しさん
2016/01/19(火) 12:57:02.14ID:1yi9x6jx>>464
ありがとうございます。
値渡しする数が多すぎて、エラーを招きそうな気がしたもので、、、
0466デフォルトの名無しさん
2016/01/19(火) 12:59:39.91ID:jGMD02BBクラス使うと解決するかもね。
0467デフォルトの名無しさん
2016/01/19(火) 13:32:37.47ID:hKwHZ0ioたとえば、var array = []; として、この配列のarrayをbayrefで渡せるの?
0468デフォルトの名無しさん
2016/01/19(火) 13:58:55.16ID:Knai0l7Pお前は何の言語の話をしてるんだ?
0469デフォルトの名無しさん
2016/01/19(火) 16:22:46.20ID:moFYOEmOえーと、参照で渡すと意図しない書き換えが起こり得るって話かな?
でもそれはモジュールレベル変数にしても同じだし、何を問題にしてるのかよくわからない。
0470デフォルトの名無しさん
2016/01/19(火) 17:49:50.46ID:1yi9x6jxスピードとメモリの解放等が気になります。
実際はこの1分のプログラムを60〜120回ぐらいループさせたいのが目標で、0.1秒でも速くなると助かります。
また、一度モジュール変数多用でメモリ不足エラーが出てしまいました。
0471デフォルトの名無しさん
2016/01/19(火) 18:12:17.93ID:jGMD02BB何度も言うようだけど、速度改善を目標にするのは意味ないって。
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わかりやすいご回答ありがとうございます。
メモリの解放タイミングが気になっていました。
まだまだ初心者で分かりにくい書き方ですいません。頑張ってみます。
0474デフォルトの名無しさん
2016/01/19(火) 19:06:30.07ID:moFYOEmO今現在データをどう渡しているのか書いてよ。
0475デフォルトの名無しさん
2016/01/19(火) 19:36:21.61ID:1yi9x6jxモジュール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たぶんAccess VBA覚えた方が幸せになれる
0477デフォルトの名無しさん
2016/01/19(火) 20:01:16.49ID:1yi9x6jxスピードも変わるんでしょうか?
0478デフォルトの名無しさん
2016/01/19(火) 20:36:15.66ID:Knai0l7P結局配列何個確保してメモリ不足なんだよ
ちなみに
private tableA() as currency,tableB tableC
はたぶんBとCの間にカンマ抜けてるんだろうと思うけど
これでCurrencyになってるのはAだけで、BとCはVariantだぞ
0479デフォルトの名無しさん
2016/01/19(火) 20:38:53.39ID:moFYOEmOその10個の配列はずっと残っていてほしいということか?
ならいいんじゃね。
そうでなければ Sub 全実行のなかで作って各処理に参照渡しすればいい。
何も考え込むようなことじゃないら。
0480デフォルトの名無しさん
2016/01/19(火) 20:39:52.19ID:moFYOEmO0481デフォルトの名無しさん
2016/01/19(火) 20:54:20.44ID:5AOetSsn実際のデータをどう扱ってるのか分からないから解決出来ないもどかしさ。
ダミーデータと処理方法(VBAのではなく手作業的な)があれば効率のいいマクロ書けると思うんだけどな。
0482デフォルトの名無しさん
2016/01/19(火) 20:58:28.16ID:Knai0l7P何やってるか分からんけど、SQL一発で出来るような内容なら
ACCESS(とか他のDB)使えば速くなるかもしれん
ACCESSでも、VBAで自分でロジック組んでループまわすようなら、速くはならんと思うが
0483デフォルトの名無しさん
2016/01/19(火) 21:06:55.44ID:UlyMCfxAexcelから値取ってくるのに時間掛かってましたとかなら正直どうにもならん
0484デフォルトの名無しさん
2016/01/19(火) 22:02:40.69ID:fUVEQkdbvbaだろうがcだろうが案外計算速度に違いはないが
variantとかだとそれはやめたほうがいいって感じ
0485デフォルトの名無しさん
2016/01/19(火) 23:39:15.43ID:1yi9x6jxみなさんありがとうございます。
上のコードは省略しすぎているので、型などは間違っていません。その他各部門のスピードは計測しなが改善しようと思います。
最後に質問なのですが、
上のモジュール2の
CALL 実行 が終わった場合、モジュール1の配列で使っていたメモリは解放されるということで間違いないでしょうか?
0486デフォルトの名無しさん
2016/01/20(水) 00:11:38.99ID:XFqYG3t7Private 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の作業が中断してしまうのですが
どうにかなりませんか!
0488デフォルトの名無しさん
2016/01/20(水) 00:41:59.97ID:uYf8rD9kつまりモジュールレベルの変数は明示的にNothing代入するなりRedimするなりしないと開放されない気がする
0489デフォルトの名無しさん
2016/01/20(水) 01:20:01.65ID:7T123+WAもう一つ別に、Excelプロセスを起動したら?
0490デフォルトの名無しさん
2016/01/20(水) 02:06:12.29ID:3JHsYJhz配列マジックを極める(ASCII)
って本をアマゾンでジャケ買いしたんだけど
VBAのことほとんど触れてねー
VBAでいうところの配列のテクニックを期待してたんだが残念。
やっぱ本はジャケ買いするもんじゃないな
0491デフォルトの名無しさん
2016/01/20(水) 03:44:21.39ID:gC8iY3QIループ処理にDoEvents入れればループ処理宙は実行中に他の作業が出来る。
0492デフォルトの名無しさん
2016/01/20(水) 07:11:18.99ID:xfIx1JoDそんな本があるのか。
息するように配列を弄りまくっている俺でも、VBAの配列にはよくわからないところがある。
0493デフォルトの名無しさん
2016/01/20(水) 08:21:54.61ID:biOEENiSサブルーチンの中で定義したいと言う話
ファイル単位のスコープならモジュールでもできる
0494デフォルトの名無しさん
2016/01/20(水) 10:03:37.62ID:TOXNslUJ今気がついた。
普通にJavaScriptの構文で書いてた。最近VBAよりそっちの仕事のほうが多くて
ガチで気が付かなかった。
0495デフォルトの名無しさん
2016/01/20(水) 10:37:40.75ID:HskUHurd配列のarrayってVBAでいうジャグ配列(配列を要素とする配列)のことだろうか?
ByRefで関数に渡せるよ。
要素を参照で持てるか?という意味だとしたら、それはできない。
0496デフォルトの名無しさん
2016/01/20(水) 11:25:41.73ID:TOXNslUJなるほどねぇ。
JavaScriptやってると配列関係の取扱いがVBAとはちょっと違うので、混乱するね。
0497デフォルトの名無しさん
2016/01/20(水) 11:53:53.10ID:HskUHurdarray1
array2
array3
をまとめて、
array_all = Array(array1, array2, array3)
なんてものを作ると、全部コピーになってしまう。
参照にしたくて色々試したが成功しない。
どうやら不可能なようだ。
0498デフォルトの名無しさん
2016/01/20(水) 12:46:25.59ID:V5TARUOi度々ありがとうございます。
念のため、全てnothingで終わらせてみる実験をしてみます。長く走らせると不手際で解放されてないのかも知れません。
0499デフォルトの名無しさん
2016/01/20(水) 18:19:33.52ID:xdXYdVv+判定することはできるのでしょうか。
参照先のセルを得るのではなく、
「参照されているか、否か」を判定する方法です。
シート内の不要データの整理に使いたいと考えています。
0500デフォルトの名無しさん
2016/01/20(水) 18:34:15.12ID:XFqYG3t70501499
2016/01/20(水) 18:45:24.37ID:xdXYdVv+あわせて調べてみました。
ttp://excel.onushi.com/function/isref.htm
isref()の引数で判定対象のセルを指定すればいいのですかね。
isref(cells(i,j)) みたく。
0502デフォルトの名無しさん
2016/01/20(水) 19:48:55.16ID:XFqYG3t7参照できたかどうかの関数らしい
ので間違いだった
セルの内容が参照の場合trueって説明だったから
isref使った時点で参照してるじゃんってミスでもないらしい
考えるにデータの入っていないセルに参照されてるかどうかの
プロパティつけるのは無駄かもしれないので
アイディアがないと無理そう
0503デフォルトの名無しさん
2016/01/20(水) 20:55:20.57ID:uYf8rD9kRange.Dependents プロパティ
0504499
2016/01/20(水) 22:25:06.28ID:xdXYdVv+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各列から1つずつ取って、それらを左から繋げた文字列(順列)を作りたいのですが、どのように書けば良いのでしょうか。
各列に何個要素があるかをカウントするところまでは書けたのですが、そこからよくわからなくなってしまいました
0506デフォルトの名無しさん
2016/01/21(木) 01:06:23.00ID:X7n9A0oTこんな感じか?
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:0jk7vnPhFunction 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ありがとうございます
そういう感じで必要十分なのですが、余談ですが同じような処理を繰り返すのでもう少しうまく処理できるのでしょうか?
0509デフォルトの名無しさん
2016/01/21(木) 06:18:36.49ID:0jk7vnPhSub 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だせぇ
0511デフォルトの名無しさん
2016/01/21(木) 08:30:12.04ID:epD6nfy/なぁ、出来もしないのなら、無理に回答しなくていいぞ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入出力2行、 桁数可変で本体処理2行。
右からやるか左からやるか...
0514デフォルトの名無しさん
2016/01/21(木) 10:15:19.09ID:f+IaIVwa0515デフォルトの名無しさん
2016/01/21(木) 12:00:32.16ID:tGM9G3/Pありがとうございます。
条件を書くと、以下のようです。
1)各列に何個の要素があるかは動的(
2)何列あるかも動的(>>506のネストの数は3だが、ここが何回ネストするかが動的になる)
3)組み合わせの仕方は左から順にのみで、並び替えの必要はない(樹形図的)
4)要素の文字数も動的で、何桁か決まってはいないし、数字もあれば文字列もある
私は条件2のうまい書き方がよくわからず、結局、何列あるかを調べて、if文で1列なら〜2列なら〜3列なら>>506というようにしています。
0516デフォルトの名無しさん
2016/01/21(木) 12:06:31.84ID:X7n9A0oTそういう場合は再帰を使え
0517デフォルトの名無しさん
2016/01/21(木) 12:13:08.74ID:pkb4zgJkかなり無理があるのでは?
組み合わせの数だから相当の量になる。
0518デフォルトの名無しさん
2016/01/21(木) 12:15:50.60ID:epD6nfy/つーか、そんなのユーザ定義関数でいいだろ。
0519デフォルトの名無しさん
2016/01/21(木) 12:54:35.53ID:jus49kmC組合せの数だけネストするわけじゃないだろ
0520デフォルトの名無しさん
2016/01/21(木) 13:30:20.23ID:X7n9A0oT再帰ってのはこんなふうに書くんだよ
ループのネストの段数が不定でも問題なく動く
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/減価償却費の計算とかではよくつかってる。
0523デフォルトの名無しさん
2016/01/21(木) 20:02:04.58ID:RqTcmjez聞きたい事は分かったが残念な事に答えが分からんのだよw
0524デフォルトの名無しさん
2016/01/21(木) 20:35:34.37ID:0jk7vnPhSub 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:xJzWoKjV28列目で降順に並び替える
3removeduplicate
41の列で並び替える
51の列を削除
0526499
2016/01/21(木) 23:00:34.27ID:0tyN2uzx下記は、セル(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:gKLeKKXnSub 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遅くなりました。ありがとうございます。忙しくてまだ試せていませんが、勉強します!
0529デフォルトの名無しさん
2016/01/22(金) 07:09:40.91ID:hQb40WO/何度もだせぇの書くなよ
質問者に悪いと思わんのかw
0530デフォルトの名無しさん
2016/01/22(金) 08:58:29.38ID:1YiOGDCqでもそれ、別に別の関数に投げるんでも全く問題ないわけだが。わざわざそういう
書き方した所で、大したメリットがない。
0531デフォルトの名無しさん
2016/01/22(金) 09:52:25.70ID:p0qaIBjS右からの畳み込みで表現するといいと思う。
0532デフォルトの名無しさん
2016/01/22(金) 11:27:13.63ID:aQA1bWN9遅くなってすいません。
思い通りに実行出来ました!ありがとうございました!
0533デフォルトの名無しさん
2016/01/22(金) 12:38:57.86ID:6pvUxBV3elseifを使うと、該当したら他のelseifコードはスルーしますが、1行書きifを使うと、一応ぜんぶ判定しにいくので。しかし可読性は1行書きの方なんですよね〜
0534デフォルトの名無しさん
2016/01/22(金) 13:04:43.89ID:1YiOGDCqselect文も使うのが普通ですよ。
0535デフォルトの名無しさん
2016/01/22(金) 13:27:56.38ID:KXk9pxmd100万回実行して、10ms未満の違いしかないようなことを気にしてもしかたがな。
0536デフォルトの名無しさん
2016/01/22(金) 14:29:53.04ID:p0qaIBjS複数の if が排他的でなかったら論理的に違うことをやってるのはわかるよね?
スピードなんかより
0537デフォルトの名無しさん
2016/01/22(金) 19:44:34.49ID:turD6O79'セルの値と該当しない場合、その行を削除するみたいなことをやりたいのですが、
'こんなことは可能でしょうか?
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ただそのキーワードというもののあり方によってはフィルタ系の機能を使ったり正規表現を使った方がいいかもしれないぞ
0539デフォルトの名無しさん
2016/01/22(金) 20:15:48.39ID:turD6O79Filter使ったことないですが挑戦してみます。
キーワードは、文字列で完全一致のもので絞り込めたらいいのですが、filterで問題ないでしょうか?
0540デフォルトの名無しさん
2016/01/22(金) 20:16:29.80ID:50X4sy+nvbaでやればあとはどうやってもできるんじゃないか
手動でキーワードを入れるってのをできるだけ
自動化するって問題だけだろ
0541デフォルトの名無しさん
2016/01/22(金) 20:40:19.73ID:KhXVHsnGより良いコード書いてからほざけ、ボケ
0542デフォルトの名無しさん
2016/01/22(金) 20:43:53.69ID:turD6O79mycollection(1000)として、filterをどのように使えばよいのでしょうか?
初心者ですいませんが、よろしければご教授お願いたします。
f = Filter(mycollection,.Cells(i,2).Value)
f(0)がエラーとなるならばといったようなコードでしょうか?
0543デフォルトの名無しさん
2016/01/22(金) 21:11:50.86ID:pRZKDnHiSub 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:p0qaIBjS0545デフォルトの名無しさん
2016/01/22(金) 21:18:48.91ID:d8M8QDrI「らんま1/2」みたいな演算子っぽいのが混ざった名前も変数にしたいんだけど何か方法ある?
0546デフォルトの名無しさん
2016/01/22(金) 21:44:34.68ID:50X4sy+nstrcollection=",佐藤,田中,長谷川,"
if instr( strcollection,"," & cells(n,1)) & ",")=0 then
cells(n,1).entirerow.delete
end if
0547デフォルトの名無しさん
2016/01/22(金) 22:34:02.46ID:d8M8QDrI0548デフォルトの名無しさん
2016/01/22(金) 22:35:11.31ID:d8M8QDrI全角を演算子と認識したりはしないよねさすがに
0549デフォルトの名無しさん
2016/01/22(金) 22:46:22.46ID:tiw7VxmHデータとしてはあり得るけど変数名にしたいってのは考えにくいが
たくさんあるなら var1div2 とかでいいかも知れん
0550デフォルトの名無しさん
2016/01/22(金) 23:24:56.91ID:d8M8QDrIVBAコードで漢字の変数名見ただけでアホだコイツと思うわけじゃん
ローマ字だか英語だかよくわからん変数名をこれからも使っていくわ一生
0551499
2016/01/22(金) 23:26:21.02ID:uYyrweLrありがとうございます。
なるほど、on errorステートメントというのがあるのですね。
同一シート内の参照はこれで問題ないのですが、
シートをまたいだ参照先を得ることは、当然できませんでした。
やはり不可能なのでしょうか。
dependents以外に何か方法がありましたら教えてください。
0552デフォルトの名無しさん
2016/01/22(金) 23:29:20.57ID:d8M8QDrI0553デフォルトの名無しさん
2016/01/22(金) 23:32:30.77ID:TWMQPGy9これいいね
0554デフォルトの名無しさん
2016/01/22(金) 23:38:00.02ID:r3UK0uLRそれやるならSplitで配列に変換した方が、その後の処理が簡単になりそう
0555デフォルトの名無しさん
2016/01/22(金) 23:54:33.37ID:ax/jel29今回問題なのはfilter(, , true, )のとき該当するものが無いと空の配列が返るってんで、それをどう数えたもんか?
ヘルプで言うと「配列に関するキーワード一覧」に書いてある(最近のバージョンでどういう目次構成か知らんけど)
UBound()で配列添字の最大値、LBound()で添字の最小値を取得できる、というのが使えるわけです
UBound()を使えばいいんだけど、ヘルプの該当ページにはどういうわけか
ここで知りたい空っぽのとき何が返るのかということと、Option Baseに言及していないという
VBA初見の人間を惑わすクソドキュメントになっている(もしかしたら最近のには書いてあるのかも)
そういうわけでどういうときどういう値が返るか試して、なんで-1なのか覚えてから使ってやってください
0556デフォルトの名無しさん
2016/01/23(土) 00:27:23.02ID:5faR9SkP今日は仕事が疲れすぎたので明日使わせて頂きます。
0557デフォルトの名無しさん
2016/01/23(土) 03:58:47.08ID:NKVsIEv5これは単純に見えて根深い問題で例えば 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標準のフィルタ機能で十分だろ
0563デフォルトの名無しさん
2016/01/23(土) 14:42:09.66ID:YJo138Ig"エクセルでシートの参照先を調べたい"
でググってみると幸せになれるかも
0564デフォルトの名無しさん
2016/01/23(土) 15:40:45.44ID:xVQLFIqOListP()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本来だったら配列を昇順ソートしてからバイナリサーチやれば圧倒的に速くなるがね。
0566デフォルトの名無しさん
2016/01/23(土) 17:20:35.71ID:Ub1PC2hCCurrencyならEmptyチェックする必要ないんじゃない
後はそこだけで速くするのは難しそう
俺なら配列に値セット/変更する時に値チェックしてカウントするようにするかなぁ
案外配列じゃなくセルに展開して、カウントする数式入れたセル見た方が早いかもしれん
0567デフォルトの名無しさん
2016/01/23(土) 18:14:06.44ID:5/HkQk/m配列数式でできた
0568デフォルトの名無しさん
2016/01/23(土) 19:34:03.73ID:7fmpCrJtこの状態でどれぐらいの時間がかかってるのか教えろハゲ
0569デフォルトの名無しさん
2016/01/23(土) 19:41:11.42ID:UyBsumDJ調べてみましたが、やや難しそうです。(:;)
>>566
Emptyは必要ないですね//
配列をA列とB列にいったん貼り付けてワークシート関数で調べる方法ですよね。
ひとまず、やってみます!
>>567
使い方教えていただけますでしょうか?
SHL = WoksheetFunction.Countifs(Range( ),">60",Range( ) ,"HL")みたいな形で使えそうです。
0570デフォルトの名無しさん
2016/01/23(土) 19:45:35.16ID:G5thoHAj0571デフォルトの名無しさん
2016/01/23(土) 19:46:50.85ID:UyBsumDJ他のループも合わせてからの推測ですが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サンプルで作ってみたのですが、思った通りの動作ができません・・・
改善点をお分かりになりますでしょうか?
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たぶんSheet1に書いてない
0575デフォルトの名無しさん
2016/01/23(土) 22:41:50.10ID:rT+4QcAA使ったことないけどODBCでExcel読めるんだから同じように出来るんじゃなかろうか
0576デフォルトの名無しさん
2016/01/23(土) 22:56:00.52ID:VVSBE+9kODBCだけど
Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)}
で普通にWHEREが効いたよ。
0577デフォルトの名無しさん
2016/01/23(土) 23:11:55.10ID:Lyhv/FJb0578デフォルトの名無しさん
2016/01/23(土) 23:31:40.97ID:d6eRWlmR>>576
成る程!
エクセルからODBCする発想はありませんでした。
ありがとうございます。
0579デフォルトの名無しさん
2016/01/24(日) 00:52:16.69ID:3BacWB5Qunion(range("A1:A3"),range("A4:A6")).select
とすると A1:A6がセレクトされてしまいます
A1:A3,A4:A6とばらばらに選択させるにはどうしたらいいのでしょうか
0580デフォルトの名無しさん
2016/01/24(日) 01:02:59.65ID:8yNc66kpRange("A1:A3, A4:A6").Select
0581デフォルトの名無しさん
2016/01/24(日) 01:24:07.69ID:3BacWB5QRangeを使った場合
少ないと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:QDUQ11dLunion使いたくないってことなら適当な長さで区切って処理していくしかないね
0583デフォルトの名無しさん
2016/01/24(日) 08:31:19.18ID:P3FwbSRP0584デフォルトの名無しさん
2016/01/24(日) 08:43:14.19ID:OLLhmKw50585デフォルトの名無しさん
2016/01/24(日) 10:14:46.19ID:EERzV+Td0586デフォルトの名無しさん
2016/01/24(日) 10:17:27.22ID:U2BkwJ1U0587デフォルトの名無しさん
2016/01/24(日) 10:54:59.26ID:jAR/7hik理研の職員が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:OLLhmKw5Selection.Offset(1).Insert
0589デフォルトの名無しさん
2016/01/24(日) 12:16:54.98ID:CzW7EpCeRange("A1:A168").Select
0590デフォルトの名無しさん
2016/01/24(日) 13:20:11.62ID:9Re4pm4/これ誰かわかりませんかね?
単純にループで要素をとって変換してるんですけどもっと効率よく書く方法知りたいんですけど
0591デフォルトの名無しさん
2016/01/24(日) 14:43:43.40ID:kddwELVpまず目的がわからない。Variant配列のままではできないことが何かあるの?
0592デフォルトの名無しさん
2016/01/24(日) 14:48:25.07ID:Qp0DBCKEそれでいいだろ
型が全然違うものをどうやってキャストするつもりなんだよ?
0593デフォルトの名無しさん
2016/01/24(日) 19:54:05.71ID:ZDzZlqZ2なんでできないんだってクレームだろうね
0594デフォルトの名無しさん
2016/01/24(日) 21:03:26.31ID:bw3MWu8t> ダブルからバリアントはできるから
はあ?
0595デフォルトの名無しさん
2016/01/24(日) 21:18:18.78ID:kddwELVpそれは原理的に無理だ。
0596デフォルトの名無しさん
2016/01/24(日) 21:31:15.52ID:LpWoFh+wオブジェクト指向はそういうの普通にやりますけど。
あれですか?
C言語しかしらない人ですか?
0597デフォルトの名無しさん
2016/01/24(日) 21:51:00.06ID:kddwELVpつ 配列
0598デフォルトの名無しさん
2016/01/24(日) 22:03:39.50ID:ZDzZlqZ2ポインタ渡すだけじゃないの
int型をオブジェクト指向のバリアントに渡すのは結局ループさせてると思うけどw
0599デフォルトの名無しさん
2016/01/24(日) 22:39:14.22ID:ZDzZlqZ2できるなら、そこからはじめよう
0600デフォルトの名無しさん
2016/01/24(日) 22:42:25.30ID:vxhR0ZQc今やってるのはセルのレンジをvbaでvariant配列として受ける→doubleの配列に変更したいというわけです。
0601デフォルトの名無しさん
2016/01/24(日) 22:46:42.39ID:kddwELVpdllを改変してVariant配列を受け取るようにしなさい。
C++側で工夫すれば中身がdouble配列でもinteger配列でもハンドリングできる。
0602デフォルトの名無しさん
2016/01/24(日) 22:49:15.03ID:kddwELVp0603デフォルトの名無しさん
2016/01/24(日) 23:16:09.36ID:ZDzZlqZ2valiantは仕組みがわかったとしてプログラムは難しいというか
メリットがあるのかどうか結局
doubleの配列に渡してdllに渡すプログラムになるだろ
正規ユーザーならマイクロソフトに聞いたらどうだ
0604デフォルトの名無しさん
2016/01/24(日) 23:31:31.52ID:CzW7EpCeそれがVBAの決まり
0605デフォルトの名無しさん
2016/01/25(月) 00:00:11.24ID:OVAwI95a自己レス
名前機能を組み合わせて最大1291の連続するセル範囲を選択することに成功しました
連続する単一セルならば最大2788
マクロだとこれが限界なのかなぁ
0606デフォルトの名無しさん
2016/01/25(月) 03:16:47.81ID:x8k2PtIT0607デフォルトの名無しさん
2016/01/25(月) 06:54:36.14ID:ZbEgu09Eそもそも変換どころか、キャストしたい
って話だしな
「自分のやりたいことは簡単に書ける方法が絶対あるはず教」の信者さんでしょ
0608デフォルトの名無しさん
2016/01/25(月) 07:04:40.46ID:ZbEgu09EVariant の仕様は MSDN に書いてあるし、API もあるから難しくはないよ
double しか渡されない(double 以外は保証しないよ)と言う仕様でいいなら double の配列の読み書きとたいして変わらん
お前は、それ以前に
> doubleの配列に渡してdllに渡すプログラムになるだろ
と言うワケわからん日本語書くのをやめれ
0609デフォルトの名無しさん
2016/01/25(月) 07:25:28.63ID:kQZEtAkwへえ。Object指向に普通にVariant型があると思ってるのか?
馬鹿だろお前。Object指向だろうがなんだろうがキャスト出来ないものはキャスト出来ねーよ。
Variant型変数にDouble型の配列を入れたと言うなら型変換しなくても使えるが、
Variant型の配列に突っ込んだ値をと言ってるんだろ?
て言うか、C++なんて糞言語ここで持ち出すなよ。ここ何のスレだか知ってて書いてるのか?
0610デフォルトの名無しさん
2016/01/25(月) 07:58:42.36ID:PYOqNH8O0611デフォルトの名無しさん
2016/01/25(月) 08:16:46.72ID:Ymzzk2Ep0612デフォルトの名無しさん
2016/01/25(月) 10:30:52.42ID:Ymzzk2Epでも一度作ってしまえばそれだけで対応できるから、型別に配列を扱うより結局ラクになる。
0613デフォルトの名無しさん
2016/01/25(月) 19:45:11.59ID:h5WdPhTZ以下の「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スペルミス よく見てみ
0616デフォルトの名無しさん
2016/01/25(月) 20:30:20.64ID:S6u4QlwXこんな数学的に説明できない糞言語使いにくいでしょ。
0617デフォルトの名無しさん
2016/01/25(月) 20:32:24.39ID:h5WdPhTZバカでした。すみません。ありがとうございます。
0618デフォルトの名無しさん
2016/01/25(月) 21:35:58.44ID:bhGrjqTq言語を覚えるだけで人生終わっちまう
しかもHaskellって関数型ってヤツで、地球人でも特別な人間にしか理解できないヤツだろ
0619デフォルトの名無しさん
2016/01/25(月) 21:39:21.69ID:6cjSwNuYカーソル移動するとエラーメッセージボックスがでてうっとうしいんですが
どうすればいいですか?
0620デフォルトの名無しさん
2016/01/25(月) 21:43:55.44ID:tSs+i5nu0621デフォルトの名無しさん
2016/01/25(月) 21:44:00.33ID:EI0NNUYr自動構文チェックを off にする
0622デフォルトの名無しさん
2016/01/25(月) 22:02:38.95ID:zDVscmGV0623デフォルトの名無しさん
2016/01/25(月) 22:06:25.75ID:xK2Lk5XQありがとうございます!
0624デフォルトの名無しさん
2016/01/25(月) 22:34:29.77ID:tSs+i5nu0625デフォルトの名無しさん
2016/01/25(月) 23:39:17.97ID:zDVscmGVHaskellでワークシートのデータに簡単にアクセスできてDBも読めるんなら使ってもいいぞ。
0626デフォルトの名無しさん
2016/01/26(火) 03:57:19.80ID:iVTpdqcA0627デフォルトの名無しさん
2016/01/26(火) 08:43:18.81ID:qqVXY/GV説明できないっけ。結構なレベルまで出来るけどなあ
0628デフォルトの名無しさん
2016/01/26(火) 09:18:40.01ID:5vRCDG8F使う環境が違うんだからそもそも比較の対象にならん。
純粋に言語部分だけで比較するんだと言うなら勝手だけど。
0629デフォルトの名無しさん
2016/01/26(火) 18:43:46.24ID:ZKGLEkP4この特殊記号をVBEに書き込む方法を教えてください
0630デフォルトの名無しさん
2016/01/26(火) 19:08:50.23ID:Le1AWrDO0631デフォルトの名無しさん
2016/01/26(火) 20:11:57.90ID:s2VOqCHE0632デフォルトの名無しさん
2016/01/26(火) 20:21:55.06ID:Ss3eGzB+関数型が難しいとか嘘まき散らしてるのはF欄卒の低能だよ。
国立の情報系出てれば普通に使える。
0633デフォルトの名無しさん
2016/01/26(火) 20:35:20.49ID:s2VOqCHE0634デフォルトの名無しさん
2016/01/26(火) 20:36:17.62ID:an9o+4d6自分のVBAには貼り付けできないんです…
なんでだろう…
0635デフォルトの名無しさん
2016/01/26(火) 20:44:20.93ID:s2VOqCHEエディターの設定でフォントは何になってる?
0636デフォルトの名無しさん
2016/01/26(火) 20:47:22.36ID:an9o+4d6まずいのでしょうか?
0637デフォルトの名無しさん
2016/01/26(火) 20:53:14.53ID:s2VOqCHEそのフォントだったら自分のとこでも大丈夫だなあ...
0638デフォルトの名無しさん
2016/01/26(火) 23:13:32.78ID:XA1jjBiE0639デフォルトの名無しさん
2016/01/26(火) 23:59:27.82ID:Ss3eGzB+0640デフォルトの名無しさん
2016/01/27(水) 02:32:20.61ID:FFJgZUiX0641デフォルトの名無しさん
2016/01/27(水) 09:55:13.64ID:AxnKqjSh0642デフォルトの名無しさん
2016/01/27(水) 16:56:55.10ID:M2nAG8/tcnt = 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:peQY74NrVBAでのドキュメントが見つからないが
Forの終了条件の変数ははじめに評価されたあと再評価されないはず
つまりその例ではcntを書き換えてもnは1から5までしかループしないはず
試してもそうなってるけど、そうならないようなら環境とそのコード教えてくれ
0644デフォルトの名無しさん
2016/01/27(水) 21:23:26.05ID:Tz0t5sQ9怪しかったので、cntを先に求めるよう修正しました。勘違いがあったかもしれません。
再評価をしないということがわかり勉強になりました。ありがとうございます。
0645デフォルトの名無しさん
2016/01/27(水) 21:59:35.79ID:i9TI+OhTFor i = LBound(x) To UBound(x)
って書けるという面もある。
0646デフォルトの名無しさん
2016/01/27(水) 23:03:39.45ID:8GEb3XG20647デフォルトの名無しさん
2016/01/28(木) 00:16:58.40ID:w3bB+ovg実際使うかどうかはまた別だわな
0648デフォルトの名無しさん
2016/01/28(木) 20:19:00.28ID:l8d43dgOFor i = 1 to i
Next
みたいにリサイクルしちゃう事はよくある。
0649デフォルトの名無しさん
2016/01/28(木) 20:55:34.37ID:87VXcHukたまにあるならまだしもよくあるなら向いてない
特にループ変数に i とか使うのはまだわからんでもないが
> i = UBound(arr)
とか書く奴は単なるバカ
0650デフォルトの名無しさん
2016/01/28(木) 21:00:56.80ID:YELEWwrcはたまにやるけどな
0651デフォルトの名無しさん
2016/01/28(木) 21:22:27.24ID:l8d43dgOVBAは変数を宣言するともれなく初期化がついてくるから
これを抑制する為に可読性を損なわない様に工夫しつつリサイクルというのは割と普通だと思うんだけどな。
あとそれなりにVBAをいじってきて何か自負が芽生えてきた時期なんだとは思うけど
非常に限定された例でバカだの向いてないだの言うのは止めた方がいいぞ。
0652デフォルトの名無しさん
2016/01/28(木) 21:22:55.28ID:9fWHkl7Rメモリとか考えずにどういう仕様か注釈なくても
わかるように書け
i = UBound(arr) To LBound(arr) Step -1
と徹底してたら
i = UBound(arr) To 0 Step -1
が特別だと区別がつく
0653デフォルトの名無しさん
2016/01/28(木) 21:27:03.38ID:NmcV3G4Iこれって何かいいことあるの?何か悪いことあるの?>>651
0654デフォルトの名無しさん
2016/01/28(木) 21:28:24.36ID:Px8oTJsB0655デフォルトの名無しさん
2016/01/28(木) 21:41:49.39ID:Og0hCXDt他の言語だとループの終了値が再評価されてループ回数がおかしくなる場合があるし、
それを逆手に取るようなコードをわざと書く場合もある
言語仕様をいちいち確認しなきゃならんようなコードは悪手かなあ
0656デフォルトの名無しさん
2016/01/28(木) 21:58:29.74ID:BRaPySJX良いことなんて特に無い
だって普通に
For i = 1 To UBound(arr)
って書いたほうが読みやすいし行数も少ない
0657デフォルトの名無しさん
2016/01/28(木) 22:11:22.26ID:w3bB+ovgWith New とかやるって旧VBスレで言ってたのを思い出した
0658デフォルトの名無しさん
2016/01/28(木) 22:36:03.92ID:zD2EcWsW> VBAは変数を宣言するともれなく初期化がついてくるから
> これを抑制する為
抑制する理由書いてみ
君のアホさがわかると思う
> 非常に限定された例で
限定されてると思ってる時点で何も理解してないことが良くわかる w
0659デフォルトの名無しさん
2016/01/28(木) 23:00:29.67ID:D0vEBF/42つセルのアドレスを取得したのですが、
そこまで何列離れているかが知りたいのですが、
どうやって求めれば良いでしょうか?
0660デフォルトの名無しさん
2016/01/28(木) 23:25:11.76ID:BRaPySJXその二つのセルのColumnを引き算したら分かるんでないの?
0661デフォルトの名無しさん
2016/01/28(木) 23:27:32.34ID:D0vEBF/4ありがとうございます。
0662デフォルトの名無しさん
2016/01/28(木) 23:32:05.18ID:YELEWwrc0663デフォルトの名無しさん
2016/01/28(木) 23:33:03.80ID:YELEWwrc正 LBound も UBound も
0664デフォルトの名無しさん
2016/01/29(金) 00:42:17.43ID:/cWmSx8U宣言時の初期化を抑制する構文もないから
宣言と同時に変数を初期化するのを抑制なんてできないわけだが
まあ変数の数を減らす事によってその分のメモリと初期化時間を節約できるのは確かかもしれんが
それを当たり前にやらないとダメなような環境なら、VBA使うのがそもそも間違ってる
巨大な配列ならまだしも、可読性落としてまでやるような事じゃない
0665デフォルトの名無しさん
2016/01/29(金) 00:47:48.27ID:/cWmSx8UFor i = 1 to i
なんてコード書いて可読性が落ちてないとか言う主張してるのか
俺とは完全に別次元の人だわ
俺の意見も、このスレのほとんどの人の意見も忘れてくれていいんじゃない
0666デフォルトの名無しさん
2016/01/29(金) 00:52:17.65ID:u6PJbYuv0667デフォルトの名無しさん
2016/01/29(金) 00:57:19.20ID:mcgCrfPKそれ以外に効率的にやる方法あんの?
0668デフォルトの名無しさん
2016/01/29(金) 01:38:47.60ID:u6PJbYuv0669デフォルトの名無しさん
2016/01/29(金) 01:52:49.80ID:DJFadGs/VBAではその存在を知らない人さえいるんじゃないかな
0670デフォルトの名無しさん
2016/01/29(金) 02:08:08.30ID:EuNL8AInループの対象がRangeとかであれば有効だろうけど、配列の中をガラガラと回す機会も少なくは無いだろう。
そうしたとき、配列の代わりにCollectionやScripting Dictionaryを使ってまでFor Eachを使うことによって
何の恩恵が受けられるのだろうか?
そもそもそれを言ってしまうのであればVBA自体が時代遅れの言語な訳だから
それに合わせて使い分けなければならないんじゃないかな。
0671デフォルトの名無しさん
2016/01/29(金) 02:19:34.89ID:u6PJbYuv0672デフォルトの名無しさん
2016/01/29(金) 03:03:52.29ID:EuNL8AIn受け取り側をVariantに設定すれば出来るんだな。済まん。
0673デフォルトの名無しさん
2016/01/29(金) 04:05:19.53ID:vu3Qsjkg0674デフォルトの名無しさん
2016/01/29(金) 06:41:43.06ID:zKTo8s/wまずひとつのシーケンスしか扱えないのがつらいし、コピーベースだから効率的でもない。
結局はカウンタを使うことが多い。
0675デフォルトの名無しさん
2016/01/29(金) 06:49:02.29ID:zKTo8s/w0676デフォルトの名無しさん
2016/01/29(金) 08:18:18.44ID:n4JmA3/20677デフォルトの名無しさん
2016/01/29(金) 10:09:18.99ID:eO+SXLpFループの変数にiではなくて何を使うの?
素朴な疑問です。
行をループさせるときはrとか使うけど、なんてない?ループのときはiって書く癖が付いてる。
0678デフォルトの名無しさん
2016/01/29(金) 10:21:38.80ID:n4JmA3/20679デフォルトの名無しさん
2016/01/29(金) 10:26:37.59ID:Cfolpywfよく詠め
0680デフォルトの名無しさん
2016/01/29(金) 11:26:35.90ID:zKTo8s/w0681デフォルトの名無しさん
2016/01/29(金) 12:41:18.50ID:OZjYu77z>>658 の
> > VBAは変数を宣言するともれなく初期化がついてくるから
> > これを抑制する為
> 抑制する理由書いてみ
に答えてからほざかないとかわいそうな奴にしか見えないぞ w
0682デフォルトの名無しさん
2016/01/29(金) 15:51:56.92ID:zKTo8s/wVBAではループカウンタを使うのがベター、という結論でいいのか?
0683デフォルトの名無しさん
2016/01/29(金) 16:10:50.46ID:u6PJbYuv0684デフォルトの名無しさん
2016/01/29(金) 16:23:04.02ID:zKTo8s/w使いにくさは認識しているだろババア
0685デフォルトの名無しさん
2016/01/29(金) 16:33:33.32ID:u8nDFqF+要素の順序に合わせてやりたい処理がある → ただのFor
それぞれ使いどころが違うんだから
こっちがベターとか、あっちは時代遅れとか
どちらも的外れな気がするけど
0686デフォルトの名無しさん
2016/01/29(金) 18:20:31.74ID:/cWmSx8U今まで問題になった事ないけど、これからも問題にならないように祈ろう
0687デフォルトの名無しさん
2016/01/29(金) 19:11:10.65ID:zKTo8s/wひとつのシーケンスしか扱えない
→ 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トレードオフという言葉の使い方が変だと思う
矢印の前後が同じ事の言い換えにすぎないので
そういうのはトレードオフとは言わない
0689デフォルトの名無しさん
2016/01/29(金) 21:08:56.19ID:zKTo8s/wおお、そうだな。
違うことを書いたり消したりしてるうち「トレードオフ」だけ変に残ってた。
「というような難点もある。」
に言い換えます。
0690デフォルトの名無しさん
2016/01/29(金) 22:26:51.74ID:vu3Qsjkg0691デフォルトの名無しさん
2016/01/29(金) 22:41:31.80ID:Cfolpywf記憶違いだったかなあ
0692デフォルトの名無しさん
2016/01/29(金) 22:46:41.43ID:3bay7YeG0693デフォルトの名無しさん
2016/01/29(金) 22:56:37.31ID:xL/2dOZ20694デフォルトの名無しさん
2016/01/29(金) 22:59:33.85ID:SzcTnZpoできるはずだけど
0695デフォルトの名無しさん
2016/01/29(金) 23:03:44.66ID:x5GxlBbmどのようにやるのか教えていただけませんか?
0696デフォルトの名無しさん
2016/01/29(金) 23:11:05.17ID:zGtXhGWMそれはトレードオフだな
0697デフォルトの名無しさん
2016/01/29(金) 23:33:04.61ID:SzcTnZpoieオブジェクトから探してみたら
useragentプロパティとかそれらしいの
または偽装のpostデータを送信すれば偽装できる
0698デフォルトの名無しさん
2016/01/30(土) 00:18:29.02ID:WsSatOj8Navigateメソッドに Headersパラメータあるよ ここで指定する
0699デフォルトの名無しさん
2016/01/30(土) 01:09:42.28ID:QZN0GaAw所々にオーバーフローの罠が仕掛けられている
どうしたものか
0700デフォルトの名無しさん
2016/01/30(土) 02:47:34.76ID:wZlCWGLp64bit版ならlonglongをマスクして使う
32bit版ならあきらめてVBを使うとか文字列で処理するとか
0701デフォルトの名無しさん
2016/01/30(土) 21:48:03.29ID:9q1UC1/m0702sage
2016/01/30(土) 22:42:24.01ID:DtupSwoUSub 値貼り付け()
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やりたい事がわからない もうすこし詳細な説明をして下さい
そのマクロとENTERキーの関係とか
0704sage
2016/01/30(土) 23:53:42.67ID:DtupSwoU週のはじめに各従業員が行先と訪問時間などを入力する
表を作りたいのです。
毎週、お客さんのところに行く曜日や時間が変わるので
コピペして運用したいのです。
しかしあまりPCに不慣れな人もいて、コピペしてしまい
関数が乱れてしまいます。
そこで、貼り付けを制御をしたいです。
上のマクロで用意してあるフォームボタンだけなら
問題ないのですが、コピーした後にENTERキーを押してしまう
人がいて困っています。
0705デフォルトの名無しさん
2016/01/31(日) 00:29:23.55ID:GHH7Ytwpデータ入力者が複数いる場合は、ワークシートに時間などを直接入れるんじゃなくて
入力フォームを使うのが定番の方法です
0706デフォルトの名無しさん
2016/01/31(日) 00:43:56.18ID:MM1DiLhbだいたいさ、なんでお前が
考えることを放棄してるような感じになってるの
どこの能力が足りないわけ
0707デフォルトの名無しさん
2016/01/31(日) 00:53:42.54ID:hQeW+ttMコピペ運用そのものを やめて見直すべきだと思うよ
どうしてもというなら
↓のように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皆さんの経験上大体何回ぐらいが限界だとおもいますか?
0709デフォルトの名無しさん
2016/01/31(日) 14:55:35.44ID:fJmO8CE1Dim 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前に書いたけど、分岐はその使い方によって以降の分岐を避けられる場合がある。
Case文の場合は作られたケースを順番に評価するのはトレースすると解るよね。
まずそこで使い分けが発生するんだけど、単純にそれで書くと読みにくくなることがある。
処理のレスポンスと可読性どちらを取るかはケースバイケースで、組んでる人のセンスの見せ処にもなる。
後は上の人がループの切り分けの話をしていたけど俺の感覚からすれば
関数やメソッドは単一責任原則に則って作っていればループや分岐は別に分かれていなくてもいいと思ってる。
つまり何が幾つまでという切り分けで作るのではなく一つの役割で一つの関数やメソッドを作っておけば、
基本スパゲティコードになることはない筈なので
後は分岐数は見やすければお好きにどうぞと言いたい。俺個人の意見としてはね。
0712デフォルトの名無しさん
2016/01/31(日) 21:42:48.93ID:3A1xW7mu>>710
>>711
ありがとうございます。
1行だけの単純命令ならいくらでも入れ子できそうですが
本日多数の関数を持ったelse付きの数行あるコードを4層構造に仕込もうとしましたが
複雑に入り組みすぎて、途中で脳が沸騰しそうになり未だに完成していません。
Caseでやるのもよさそうですね
正直もうくたくたで何もやる気も起きません。
0713デフォルトの名無しさん
2016/01/31(日) 21:49:46.31ID:3A1xW7mu0714デフォルトの名無しさん
2016/01/31(日) 22:37:46.23ID:fN9K6rqb0715デフォルトの名無しさん
2016/01/31(日) 22:44:30.24ID:/MiBgNRG0716デフォルトの名無しさん
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+/YJjg0719デフォルトの名無しさん
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ウェブクエリはテーブルの一部だけを取り込むことは基本的にできないし、
そもそも動作が遅すぎるので大量データの取得には向いてない
「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/l0724デフォルトの名無しさん
2016/02/03(水) 13:23:42.06ID:zCM4JqWj機能していないとは?
0725デフォルトの名無しさん
2016/02/03(水) 21:32:48.21ID:HBzsb+pO各人の最も勉強した科目は何でその勉強はいくらかを計算するプログラムを作りたいのですが、
何か良い案をお教えいただけないでしょうか?
またこのようにプログラムを全く思いつかない場合、どのように検索・勉強すればよいのでしょうか?
宜しければご教授下さい
0726725
2016/02/03(水) 21:34:02.56ID:HBzsb+pO>勉強はいくらか
「勉強時間はいくらか」の間違いです。
申し訳ありません
0727デフォルトの名無しさん
2016/02/03(水) 22:06:22.01ID:owuQJz30検索キーは [VBA クロス集計]
クロス集計はこんな感じ
http://www4.synapse.ne.jp/yone/excel_exercise/exercise_vba_cross.html
0728725
2016/02/03(水) 22:22:33.44ID:HBzsb+pO早速の返信ありがとうございます
おかげさまで解決出来ました
心より感謝申し上げます
0729デフォルトの名無しさん
2016/02/05(金) 00:08:37.08ID:TXCmVTvBExcelのVBAでDo While Cellsを使用して
sheet1のA6セルに入力されたデータをsheet2のS列のデータと比較し
重複データがあれば「重複データが存在します」
なければ「重複チェック終了しました」とメッセージ表記されるようにしました。
これで続けて重複データをsheet1のA10以降に表示されるようにしたいです。
この後にどのように入力したらいいでしょうか。
当初はオートフィルでやってたのですが、cells利用してもできると聞いて
調べて見たのですがよくわからなくて困っています。
数日前に始めたばかりで勝手がわかっていなかったらすみません。
0730デフォルトの名無しさん
2016/02/05(金) 00:36:52.27ID:blBw672Yとりあえず、作ったVBAをどこかに貼って
短ければここでもいいし
0731デフォルトの名無しさん
2016/02/05(金) 00:50:11.46ID:U+VxVXPfウォートホッグなの
0732デフォルトの名無しさん
2016/02/05(金) 04:20:30.65ID:tis1OD9TA10に、A6の値を代入する
A10 = A6の値
0733デフォルトの名無しさん
2016/02/05(金) 04:25:48.17ID:LfaH5pAK0734デフォルトの名無しさん
2016/02/05(金) 04:40:03.69ID:LfaH5pAKccc = 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その度新しくブックを作り直さなきゃならなくなる
0736729
2016/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やりたい事 今一つ分ってないけと なんとなく
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:VJfh6At3Excel2010です。
何が原因なんでしょうか?
0740デフォルトの名無しさん
2016/02/05(金) 15:07:44.85ID:RDrjDYLWWorksheets(2).Select
Cells(target.Row, 5)=Time
Cells(17, 5) = Cells(target.Row, 5)
0741デフォルトの名無しさん
2016/02/05(金) 15:19:29.05ID:VJfh6At3返信ありがとうございます。
sheet2でコピーしたものをシート1に持ってきたいのです。
ご教示お願いします。
0742738
2016/02/05(金) 15:22:59.01ID:7bhw2NUKちょっと確認
>>737 の通り
@ ○
A ×
の動作でいいのよね
俺ん所では 逆だから これ以上は回答できないけど
0743デフォルトの名無しさん
2016/02/05(金) 15:29:10.07ID:RDrjDYLWactivesheetを1にした場合で
copyする範囲がa1〜h1だとした例
With Worksheets(2)
For i = 1 To 8
Cells(1, i) = .Cells(1, i)
Next i
End With
0745738
2016/02/05(金) 15:37:37.09ID:7bhw2NUKなら
https://www.moug.net/tech/exvba/0050103.html
のように
Destination を指定する
0746デフォルトの名無しさん
2016/02/05(金) 15:58:15.69ID:VJfh6At3無事にできました。
ご教示ありがとうございます。
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:blBw672YActiveSheet.Shapes(Application.Caller).Name
あたりで英語の名前が取得できるはず
0749デフォルトの名無しさん
2016/02/05(金) 22:27:47.03ID:RDrjDYLW複数の画像をシートに配置し1画像をクリックしたら個々の処理をしたい
そのマクロを画像数に関係しないで1ルーチンでしたい、、ってことかな?
0750デフォルトの名無しさん
2016/02/05(金) 22:33:57.04ID:qfst1uAU早速の回答ありがとうございます。
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すみません、リロードしてなかったので気付きませんでした
>そのマクロを画像数に関係しないで1ルーチンでしたい、、ってことかな?
そうです、そんな感じです
0752デフォルトの名無しさん
2016/02/06(土) 08:53:13.29ID:P3+owK3wおいらの場合だが、、画像を貼る時
ユニーク(唯一)な画像名を入れ、実行するマクロ名は全て同一にしている
マクロのほうでクリックされた画像名を取得すれば、どうにでもできる
0753デフォルトの名無しさん
2016/02/06(土) 09:06:55.95ID:P3+owK3wobjshape.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質問の答えは>>738の通りと思うけど気になった点を2つほど
・A6以降の値を調べるならループ必要だけど、A6のみなら最初のDoループは不要では?
・最後のExit Subは自分なら書かないかな(なくても問題ないため)
0756デフォルトの名無しさん
2016/02/06(土) 19:26:54.79ID:k9/r4E4xなぜクリップボードに入れる前に普通にValueプロパティで配列化しないの?
0757デフォルトの名無しさん
2016/02/06(土) 19:29:16.46ID:d/rSshNVRangeオブジェクトを使う方向で考えた方がいい
Rangeから配列へはVariant変数にただ代入するだけ
0758デフォルトの名無しさん
2016/02/06(土) 19:48:03.96ID:eyuorlkiググったりしてたんですが意味わからんものでしてそれぞれのプログラムの説明も良かったら頼みます
やりたいことはコマンドプロンプトのコマンドの実行とコマンドプロンプト画面を表示したくないためです
0759デフォルトの名無しさん
2016/02/06(土) 20:00:25.86ID:lnO4bcRF通常なら提言通りの方法でやるのですが
システムの関係でExcelのインスタンスが2つになってるんです
そこでインスタンスAでCtrol+CをしてインスタンスBでマクロを動かし
クリップボードのセル範囲情報を取り出そうとしているんです
0760デフォルトの名無しさん
2016/02/06(土) 20:54:04.56ID:l536E6T4retval = Shell("c:\t\t.bat", vbHide)
0761デフォルトの名無しさん
2016/02/06(土) 21:16:39.44ID:eyuorlkiググったら「ExecかRunをWScript.Shellで実行」できるというのを見たんですがそれらと
>>760の実行は何か違いがあるんですかね?
それとググったら発見したんですが
CreateObject("WScript.Shell").Run "CMD.EXE C:\>コマンドプロンプトのコマンドの実行文", 0
これでも通じますか?また通じたとしたら何か問題ありますかね?
0762デフォルトの名無しさん
2016/02/06(土) 21:25:25.27ID:d/rSshNV基本Excelの中身ってCOMだからGetObjectでBからA見たりできるよ
getobject 複数 インスタンスでぐぐれ
0763デフォルトの名無しさん
2016/02/06(土) 21:29:36.07ID:l536E6T4字数の多いのは機能も多いだろう
軽自動車か高級車の違いで
コンビニ行くなら同じ
0764デフォルトの名無しさん
2016/02/06(土) 21:40:35.45ID:eyuorlkiつまり>>760この実行文は余計なものを省いたような文なんでしょうかね?
それだったらありがたいんですがその実行文は何をしてるんですかね?
良かったら説明お願いします
0765デフォルトの名無しさん
2016/02/06(土) 21:53:20.80ID:P9swx1tr× "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それで実行できました
ところで
CreateObject("WScript.Shell").Run "empty *", 0
この実行文は前に作ったものなんですが違いはなんなんでしょう?
0767デフォルトの名無しさん
2016/02/06(土) 22:14:02.79ID:cR3OuN6O特定のOSの機能を使いたいのかはっきりさせてほしいところだ。
0768デフォルトの名無しさん
2016/02/06(土) 23:55:45.18ID:eyuorlkiタスク機能でバックグランド実行しようとしてたんですわ
0769デフォルトの名無しさん
2016/02/07(日) 00:08:40.73ID:z3M1lb5nPowerShellでええやろ。
PowerShell_ISE でも使って見れば?
WSH, VBScript もあるし
0770デフォルトの名無しさん
2016/02/07(日) 01:04:57.37ID:S151Vk4MExcelの右クリックにメニュー追加したいんですが、右クリックメニューって何種類ありますか?
Application.CommandBars("Cell")とかでRowとかいろいろあると思うんですが。
もしくは右クリックメニューすべてに追加するみたいな方法ってあるのでしょうか。
0771デフォルトの名無しさん
2016/02/07(日) 10:07:38.16ID:GylIyJ2o昔はxp上のエクセル2003で作ってました。
今回はWindows7 32ビット
エクセル2013 32ビット
で作ります。
はあ
0772デフォルトの名無しさん
2016/02/07(日) 12:20:07.64ID:lxD2jtcx0773デフォルトの名無しさん
2016/02/07(日) 13:13:51.34ID:lvVeevWi知らないんだけどExcel使う上でも違いってあるの?
0774デフォルトの名無しさん
2016/02/07(日) 15:50:17.72ID:YehISXuUhttp://qiita.com/sjuny/items/d3bf8e4dd9e609374575
0775デフォルトの名無しさん
2016/02/07(日) 16:04:51.64ID:Ah5srJ1tまあ絶対こないけどな
0776デフォルトの名無しさん
2016/02/07(日) 21:17:08.90ID:8jeH5Cxfこれは酷いな
文字化け起こすわ正規表現使えないわ
ScriptingDictionary使えないから
書き換えたいときはCollectionラッピングしてイテレート使えとか
しれっと言ってるけどVBAの知識しか持ってない奴には
何が何のことか分からないだろうしな
エラーは違うモジュールやクラスまたがるとスコープ外れることがあるから
WindowsのVBAでもRaiseに限らず気をつけるけど
.Netの参照もろくに使えないで、APIも貧弱だとしたらもう
何をどうしろと言うのだという感じになるだろうな。お手上げだ。
0777デフォルトの名無しさん
2016/02/08(月) 08:35:37.46ID:74LZCTztテメェの会社のソフトウェアすらまともにポーティング出来ないってのも
笑えるなww 今時、マルチプラットフォームなんて当たり前の時代に。
0778デフォルトの名無しさん
2016/02/08(月) 12:16:06.90ID:9AywMO4KそのときLayoutをAndroid開発のように手軽にする方法ってないものなのですか?
現状ではいちいち各要素のLeftプロパティやTo@プロバティやWidthプロパティをわざわざ計算して代入していますが。
0779デフォルトの名無しさん
2016/02/09(火) 02:12:59.07ID:fm/+QtdnEXCELVBAからWindowsPhoneにプラットフォームを変える
0780778
2016/02/09(火) 10:27:16.61ID:kyiA5+yGあまりわたしを怒らせないほうがいいぞ。
しばらくこのスレに住みつくんだからな。
0781デフォルトの名無しさん
2016/02/09(火) 11:33:24.91ID:6l1mZ7CBコテ付けておいてくださいね?
0782デフォルトの名無しさん
2016/02/09(火) 12:02:55.92ID:nKvXEyw20783デフォルトの名無しさん
2016/02/09(火) 13:36:12.19ID:nKvXEyw2ファイル名とセル名で特定の場所が一致していた場合そのファイルとセルを紐付けるハイパーリンクを挿入するにはどのような構文が必要でしょうか?
例 abc0001xxxx.pdfというファイル名のファイルとセルがあった場合に
abcとxxxxは参照せずに
0001の部分と .pdfの拡張子のみで判別して合致したものにハイパーリンクで紐付けする。
0784デフォルトの名無しさん
2016/02/09(火) 13:42:51.44ID:f4xX8fNKファイル名の集合は検索前に固定されてるの?
0785デフォルトの名無しさん
2016/02/09(火) 13:55:54.83ID:nKvXEyw2ファイル名は法則はあるけど全部が完全な固定じゃなくて100 -(ハイフン)の後ろ3桁とかで検索したい。
ファイル名の構成は
(特定のものだけいれる単語)(分類別の文字2桁)200-(固有の番号)(分類別の文字2〜3桁.pdf)
って感じ。
200-(ハイフン)は固定
0786デフォルトの名無しさん
2016/02/09(火) 14:23:18.20ID:nKvXEyw20787デフォルトの名無しさん
2016/02/09(火) 14:58:50.32ID:6l1mZ7CBVBAが最近嫌になってきたわ。
0788デフォルトの名無しさん
2016/02/09(火) 14:58:58.23ID:f4xX8fNKそういう文字列のパターンに合致したもの全部にリンクを貼るの?
それとも実際存在しているファイル名かどうかも考慮するの?
0789デフォルトの名無しさん
2016/02/09(火) 15:06:16.15ID:j0ZWcdvLどう違うのか教えて
0790デフォルトの名無しさん
2016/02/09(火) 15:19:03.63ID:nKvXEyw2ファイル名に固有の数字を持ってるから1つしか一致しない。
セル内の固有数字と同じものが存在しない場合っていうのは基本的にあり得ないけど存在しなかったらリンクしないでほしい
0791デフォルトの名無しさん
2016/02/09(火) 17:30:49.91ID:FJrhS/CA実行中のマクロが、
エラーメッセージや中断ダイアログも何も出ずに、
途中で終了してしまうことがあります。
多数の重いブック(大きなもので30M)を、
開いて→シートのデータを取得して→上書きせずに閉じて、
を繰り返す処理ですが、
実行中に他のアプリケーションを使って作業などしていると
この現象が発生するようです。
(但し、作業の重い軽いに必ずしも関係ない様で、起きない時には狙っても起きません。)
今の所、
参照したいブックをオープンしたところで
何のダイアログも出ずに終了しているのを確認しています。
尚、
ブックのオープン・クローズのメソッドの前後のほか、
あちこちにDoEventを配置してます。
色々探したのですが、関連記事が見つかりませんでした。
何かお知恵を拝借出来れば幸いです。
宜しくお願いします。
0792デフォルトの名無しさん
2016/02/09(火) 17:34:59.79ID:fCLnUzKj表示待機(2度目)で無限ループになります。
(なぜかIEのReadyStateは1のまま、LocationNameはYahoo! JAPANのまま)
原因と根本的な対処法を教えてください。
ちなみに以下の場合はなぜか無限ループしません。
・Vista Excel2007 IE9で実行した場合
・ステップインで実行した場合
・Google表示の前にExcelを最前面にした場合(コメントアウト部分の処理です)
・IEのVisibleをFalseのまま実行した場合
0793デフォルトの名無しさん
2016/02/09(火) 17:41:50.26ID:fCLnUzKj'スリープ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'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おれは
ie.ReadyState < 4
を
ie.ReadyState <> 4
で書いてるなぁ。
解説サイトのパクりだから細かいことはわからないけど。
0796デフォルトの名無しさん
2016/02/09(火) 18:00:00.99ID:fCLnUzKjありがとうございます。
<>に変えてみてもやはり無限ループになります。
多分IE11なのが悪い気がするが
OSごとにIEのバージョンが決まってるからダウングレードもできない・・・
0797デフォルトの名無しさん
2016/02/09(火) 18:18:24.28ID:C6IPgLvUWin8.1 + IE11 でReadyStateが取得できないのは既知の仕様です
対処方法は俺は知らん
0798デフォルトの名無しさん
2016/02/09(火) 18:26:15.97ID:wyjSQA630799デフォルトの名無しさん
2016/02/09(火) 18:36:42.40ID:j0ZWcdvLファイルをオープンせずにSQLとかでデータを取得してもダメなの?
0800デフォルトの名無しさん
2016/02/09(火) 19:07:19.84ID:FJrhS/CAレスありがとうございます。
そのようなやり方もあるのですか。。
ちょっと勉強してみます。
0801デフォルトの名無しさん
2016/02/09(火) 19:45:15.29ID:EIWW8KSR全てのブックの全てのシートに書き込まれた、ある一つのセル(AL列の一行目)
をクリアにしたい。
セルの場所はおなじですが、複数のブック複数のシートに書かれたデータを
クリア(削除)したいのです。
ExcelVer2010で動くVBAを教えてください。
0802デフォルトの名無しさん
2016/02/09(火) 22:58:04.18ID:LDceDFt4下のコード中の変数 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パスはどうかくの?
0804デフォルトの名無しさん
2016/02/10(水) 00:17:10.65ID:UeLxeYgcpth = 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ぐぐろうとしてもどう検索したらいいのか判らないし
0807デフォルトの名無しさん
2016/02/10(水) 02:43:57.94ID:u/mYzECSありがとうございます
仕様なら諦めるしかないかなぁ
そもそもVBAってIE操作にあんまり適してないんですかね
0808デフォルトの名無しさん
2016/02/10(水) 04:19:50.96ID:Urx/IePR識別子(しきべつし)
VBの資料だからVBAでは使えないものもある
https://msdn.microsoft.com/ja-jp/library/s9cz43ek.aspx
0809デフォルトの名無しさん
2016/02/10(水) 04:50:17.97ID:GKs+LxV+if(条件A && 条件B){
}
と書く条件文ですが、この&& (且つ)に対応する符号は
なんになりますか?
0810デフォルトの名無しさん
2016/02/10(水) 05:02:45.87ID:7rRZYeUj0811デフォルトの名無しさん
2016/02/10(水) 08:30:07.58ID:Urx/IePR実験環境を用意するのが面倒なんで、思い付いたことだけ
参照設定を変えてもいいんなら「Microsoft Internet Controls」でなんとかなるかも
ならないかも
0812デフォルトの名無しさん
2016/02/10(水) 09:05:55.41ID:FkM1RfeEJavaScriptの場合、var kinoko = [];といった具合に配列を用意して、あとは適当
にpushするだけでいい。なのでRedimだのしなくていいし、例えば、
var kinoko = [simeji, matsutake, nameko, kawatani]
といった具合にして、別の配列にそのまんまpushができるので、すごく楽。取り出し
もkinoko[3]でkawataniが取り出せる。初期化ももう一度、例えばループ内でそのま
ま、var kinoko = [];と宣言するだけでいい。
物凄く楽にプログラム内でデータテーブルを使えるので、柔軟性がある。こういった
形で楽にメモリ上で配列を扱えると最高なんだけれどね。
0813デフォルトの名無しさん
2016/02/10(水) 09:19:59.78ID:Bjt40mVKDim kinnko as variant
kinoko = split("simeji, matsutake, nameko, kawatani", ",")
とかになっちまいますね。
0814デフォルトの名無しさん
2016/02/10(水) 09:22:25.54ID:FkM1RfeE2次元配列とかになっても、
var kinoko = [];
var takenoko = [];
takenoko.push("bekky")
takenoko.push("kiyohara")
で最後に、kinoko.push(takenoko)とかでさくっと実現できたりするから、こういう地味
だけれど、楽にプログラミングできる仕組みを用意してほしいなって思うね。
0815デフォルトの名無しさん
2016/02/10(水) 10:30:41.33ID:SL6hIX6J0816デフォルトの名無しさん
2016/02/10(水) 10:54:16.66ID:Urx/IePR気になったんで検索しまくったら、ウィンドウを一時的に隠すとIE11のステータスがリセットされるっぽいことが書いてあった
ie.Visible = False
ie.Navigate "http://ほげほげ"
ie.Visible = True
ってやるとうまくいくらしい?
0817デフォルトの名無しさん
2016/02/10(水) 11:01:59.02ID:jozDLnvPANDが近いけど、短絡評価しないので、同じ動きのものはVBAにはないよ
0818デフォルトの名無しさん
2016/02/10(水) 11:06:13.33ID:6eyh9AMRpushはうらやましいし、実現するにはライブラリ等が必要だけど、配列に配列を突っ込むのは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短絡評価の話なら
If 条件A Then If 条件B Then 〜
でいいでしょ
0821デフォルトの名無しさん
2016/02/10(水) 16:31:02.12ID:6eyh9AMRぬるぽ
0822デフォルトの名無しさん
2016/02/10(水) 16:38:25.44ID:zs62Z3CJガッ
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"))
0824823
2016/02/10(水) 16:58:27.84ID:YqpZzmVY変数のSourceWS、LastRow、FirstRowには正しく格納されていることを確認しています。
ちなみにLastRowは200000ぐらいでした(これは日によって変わります。10万以上であることがほとんど)
0825823
2016/02/10(水) 17:08:28.76ID:YqpZzmVYA列のセルは今までは空欄でした。
つい最近からA列には整数を格納するように変更しました
(GetTickCountで取得した整数です)
恐らくこの変更が影響していると思うのですが原因がわかりません。
どなたかヒントをお願いします。
0826デフォルトの名無しさん
2016/02/10(水) 17:56:27.46ID:6eyh9AMRCells(FirstRow, "A") ってなんかおかしくない?
0827デフォルトの名無しさん
2016/02/10(水) 20:20:29.77ID:YqpZzmVYすみません。どこがおかしいかわかりません。
変数Cに格納する行範囲をB列で判断しているのですが・・・
その行範囲のA列からJ列をバリアント配列Cに格納し、
その後他のブックに貼り付けています。
0828デフォルトの名無しさん
2016/02/10(水) 21:06:36.31ID:QrO94O6C普通に指定している行が多すぎるんじゃない?
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:5Sg0dwj90830デフォルトの名無しさん
2016/02/10(水) 22:49:55.78ID:CjFlMRzq要素数2百万くらいどうってことない気がするが、何だろうな。
0831デフォルトの名無しさん
2016/02/10(水) 22:56:58.93ID:W4AkdBgm何ですか2百万て?間違ってる上にセンスない回答ですね。
無能は黙っててください。
0832デフォルトの名無しさん
2016/02/10(水) 23:01:11.33ID:UeLxeYgcじゃあまずアンタが黙らないとね
0833デフォルトの名無しさん
2016/02/10(水) 23:01:33.33ID:CjFlMRzqハア?
FirstRowがいつくかわからんが、LastRowが200000ぐらいでA〜J列なんだろ?違うの?
0834デフォルトの名無しさん
2016/02/10(水) 23:02:19.87ID:W4AkdBgm残念ですが僕は無能ではありません。ハズレ!
0835デフォルトの名無しさん
2016/02/10(水) 23:03:08.82ID:W4AkdBgmおいおまえ数字読めないのか!?
0836823
2016/02/10(水) 23:15:33.87ID:YqpZzmVY今回エラーが発生した時の、行数は約20万、列数はA〜Jの10列なので要素数としては約200万でした。
0837デフォルトの名無しさん
2016/02/10(水) 23:16:03.19ID:UeLxeYgcLastRowが200000ぐらい、FirstRowは不明だが最小で1なので
行数は20万前後とする。
A〜Jで10列、
つまり要素数は20万行 * 10列 で200万件
小学生でも出来る計算だぞ
0838デフォルトの名無しさん
2016/02/10(水) 23:19:33.56ID:CjFlMRzq何を言いたいのかわからんが、自分の環境(イミディエイト)でこう出るんだが?
FirstRow=1 : LastRow = 200000
?Range(Cells(FirstRow, "A"), Cells(LastRow, "J")).Count
2000000
要素数2百万の配列になるんじゃないのか?
0839デフォルトの名無しさん
2016/02/10(水) 23:23:31.90ID:CjFlMRzqはこういう勘違いをしてるのかな?
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おいお前要素数200万であってるじゃねーか?
まぎらわしい事言うなよ!
でも200万とオバーフローは金輪際関係ないから!
お前がセンスないのは俺のほうが正しい!
0841デフォルトの名無しさん
2016/02/10(水) 23:25:53.23ID:jMBe0mp+常駐ソフトを全部停止させて動かしてみた?
0842デフォルトの名無しさん
2016/02/10(水) 23:26:10.04ID:QrO94O6C0843デフォルトの名無しさん
2016/02/10(水) 23:26:10.66ID:CjFlMRzq俺は最初から >>830 で
「要素数2百万くらいどうってことない気がする」
と言っているのだがな。
0844デフォルトの名無しさん
2016/02/10(水) 23:27:52.95ID:W4AkdBgmお前は正しいw
0845デフォルトの名無しさん
2016/02/10(水) 23:30:18.01ID:TYDlKOEk0846823
2016/02/10(水) 23:33:40.88ID:YqpZzmVY>>845
最初に書いてなくてすみません。
エクセル2010でxlsmです。
0847823
2016/02/10(水) 23:36:48.09ID:YqpZzmVY常駐ソフト停止することを試していませんが、
それならば、メモリが不足しています、のエラーになるかと。
オーバーフローというのが解決のヒントかと個人的には思います。
0848デフォルトの名無しさん
2016/02/10(水) 23:36:48.13ID:W4AkdBgm謝るな!荒したのは俺だw
まあ俺は答えは分からんがガンバってくれたまえwww
0849デフォルトの名無しさん
2016/02/10(水) 23:38:29.98ID:YqpZzmVYなんかワロたw
0850デフォルトの名無しさん
2016/02/10(水) 23:43:11.68ID:CjFlMRzq一応聞くけどGetTickCountの値はどの程度?
それとDeclare文の宣言はどうなってますかね?
0851デフォルトの名無しさん
2016/02/10(水) 23:49:20.06ID:jMBe0mp+確かにメモリーが不足していますのエラーってあるよね
でもなんとなく
その行がエラーを出すんじゃなくてそれより前のコードで大量にメモリーを使用したままなんじゃないのかなぁ
だって結局こういうことでしょ
Sub sample()
Dim C As Variant
C = Range("A1:J200000")
End Sub
0852デフォルトの名無しさん
2016/02/10(水) 23:49:30.85ID:YqpZzmVYGetTickCountの値:
→190423431〜217241781
Declare文の宣言はどうなってますかね:
→Declare Function GetTickCount Lib "KERNEL32.DLL" () As Long
0853デフォルトの名無しさん
2016/02/11(木) 00:10:42.37ID:cll589HHLastRowやFirstRowの型、
それとGetTickCountを何かの変数に格納しているならその変数の型、
いずれも十分なサイズなんですよね?
うーむ
0854823
2016/02/11(木) 00:32:34.09ID:GSEE6twL申し訳ありませんが私の知識不足により貴方のレスの意図が理解できていません。
コメント返すまで時間をください・・・
>>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たとえばさ、
C = Range(SourceWS.Cells(FirstRow, "A"), SourceWS.Cells(LastRow, "A"))
でもエラーになるの?
エラーが出始めた前後で、
貴方に心当たりがあるのはA列の変化だけなんでしょ?
だったらその値だけを取得してもエラーになるかどうか試してみたら?
0856デフォルトの名無しさん
2016/02/11(木) 03:30:20.36ID:GSEE6twL>>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いろいろテストしたけど
A列の中に かなり大きな値で書式設定(通貨or会計とか)してるセルない?
一度 A列全選択して書式を標準にしたらどうでしょうか?
こちらでテストしたら(Excel2016) データが
=10^15
又は
1000000000000000
で書式が 通貨or会計の時
Dim c As Variant
c = Range("a1")
がオーバーフローになる(書式が標準や数値の時にはならない)
0858デフォルトの名無しさん
2016/02/11(木) 07:23:22.39ID:mEBsgK8aいや、あのさあ、もうちょっと応用を利かそうよ
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あなたの問題を検証しようとしていたら環境がおかしく(?)なってきた。
>>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いろいろテストして頂きありがとうございました。
>>858の方法で一行ずつVariant変数に格納してみたところ、
上の方の行では問題ありませんでしたが、13万行あたりでエラー。
その行のA列の書式は日付型でした。
正常にVariantに格納できていた行のA列は標準書式でした。
A列の書式を全て標準とすることで当初のマクロは正常に動きました。
なぜこれでエラーが回避できたのかはわかりませんが、とりあえず大きく前進しました。
ありがとうございました。
>>858
858の一行ずつ格納するコードを実行することでA列書式が影響していることがわかりました。
ありがとうございました。
>>859
私の問題で迷惑をかけてしまい申し訳ありません。
私の環境で1,2を試してみましたがエクセルは落ちませんでした。
OFFICE2010 32bit + Win7 64bit
0861823
2016/02/11(木) 12:59:46.57ID:GSEE6twLかつてA列には日付が入っており、その名残というか当時の書式が残ってしまっていたようです。
0862デフォルトの名無しさん
2016/02/11(木) 14:46:45.09ID:2zWchetY> 私の問題で迷惑をかけてしまい申し訳ありません。
いや、そう言うケースでエラーになるのは俺には勉強になったよ
0863デフォルトの名無しさん
2016/02/11(木) 15:44:40.95ID:cll589HH一体なんだったのかわからん。
さて、ドキュメント作成の作業に戻ろう...
0864デフォルトの名無しさん
2016/02/11(木) 23:27:10.13ID:8WhoCP6Oその際に型を選択するんだが、元の値がその型に収まらない場合エラーが出る
今に始まった話じゃないし、対策としてRange.Value2ってのも実装されてる
0865デフォルトの名無しさん
2016/02/11(木) 23:56:26.18ID:zhBGlfG9それぞれのシートのA1,A2,B1,B2,C1,C2と固有のセルデータを所得して、
それを新たなブックに1行ずつデータを順に張り付けたい。
1行が1ブック(シート)分のデータになるようにしたい。
どのようにVBAを書けばいいですか
Excel2010でお願いします。
0866デフォルトの名無しさん
2016/02/12(金) 00:06:05.03ID:4EYM4HYY0867デフォルトの名無しさん
2016/02/12(金) 00:22:05.65ID:NB9uA2aw普通に書けばいいですね
0868デフォルトの名無しさん
2016/02/12(金) 01:59:27.96ID:gunxxlb9他のブックを参照する、特定のセルの値をとる、
1行ずつブックに値を書く、とかね。
0869デフォルトの名無しさん
2016/02/12(金) 06:02:16.01ID:4KxhZPevちなみにいくらぐらい欲しいの?
こんなの報酬もらおうにも100円ぐらいの内容だと思うけど
0870デフォルトの名無しさん
2016/02/12(金) 06:08:37.28ID:Fbay5uRwで、一日かかるかどうかだから二万円くらいじゃね?
0871デフォルトの名無しさん
2016/02/12(金) 07:44:15.34ID:vUMz7FOm0872デフォルトの名無しさん
2016/02/12(金) 08:41:10.25ID:eUWMATXs100円ww
君のような事例が今のIT業界を作ってるんだなって改めて思ったわ。
0873デフォルトの名無しさん
2016/02/12(金) 08:53:48.16ID:6JIdb1d45万円欲しい
0874デフォルトの名無しさん
2016/02/12(金) 09:42:12.77ID:tdFcrErR人月仕事って高いよな
0875デフォルトの名無しさん
2016/02/12(金) 12:23:58.29ID:IOOvL8tC0876デフォルトの名無しさん
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例外処理をする
0878デフォルトの名無しさん
2016/02/12(金) 17:22:44.29ID:0HgA+kac0879デフォルトの名無しさん
2016/02/12(金) 17:24:28.01ID:OpesMGU+のように作っておけばいいのですね。
勉強になりました!
0880デフォルトの名無しさん
2016/02/12(金) 17:45:43.40ID:4KxhZPevOn 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/79B1T0882デフォルトの名無しさん
2016/02/12(金) 18:31:13.80ID:hlhHAQgj可能
VirtualBox + Windows + Excel と言う構成で良ければ
0883823
2016/02/13(土) 19:38:51.24ID:EYTUo5+Jレス遅くなってすいません。
"日付"書式のセルの値をValueプロパティで取り出そうとすると
日付書式の制限(西暦100年1月1日〜西暦9999年12月31日:-657434〜2958465)
を超えるとオーバーフローする、という理解で正しいでしょうか?
Value2というものがあるということは知っていましたが、このようなときに使うんですね。
とても勉強になりました。ありがとうございました。
ValueよりもValue2の方が優れているように感じます。
今後Valueプロパティではなく全てValue2プロパティを使うことにすると何か問題ってありませんかね?
例えば処理が若干遅いとか・・・
0884デフォルトの名無しさん
2016/02/13(土) 21:49:38.36ID:GDWv9XcG処理速度はValue2の方が速い
0885デフォルトの名無しさん
2016/02/13(土) 22:19:41.35ID:2d9oUeOe0886デフォルトの名無しさん
2016/02/13(土) 22:41:26.61ID:f/VF2KeB0887デフォルトの名無しさん
2016/02/13(土) 23:19:04.31ID:OylkXFzpそのまま回答するのはめんどくさい。
https://www.moug.net/tech/exvba/0060037.html
を参考にできんじゃね。
0888デフォルトの名無しさん
2016/02/14(日) 00:13:22.48ID:zC+zpx/w0889デフォルトの名無しさん
2016/02/14(日) 01:10:16.92ID:fDQc/eCz通貨型と日付のシリアル値が取得できる
それ以外の型では違わない
0890デフォルトの名無しさん
2016/02/14(日) 01:11:01.50ID:zC+zpx/wありがとうございます
0891デフォルトの名無しさん
2016/02/14(日) 01:34:20.60ID:AnW4+fzX0892デフォルトの名無しさん
2016/02/14(日) 01:42:46.28ID:zC+zpx/w0893デフォルトの名無しさん
2016/02/14(日) 01:43:20.90ID:UrOJS99m0894デフォルトの名無しさん
2016/02/14(日) 02:06:30.53ID:SJCumIm8C系列ならBASIC系列よりよっぽど簡単に覚えられるからC#でもJavaでも大した問題にはならないんだが。
0895デフォルトの名無しさん
2016/02/14(日) 05:49:53.65ID:RVpb+5w9両方使えるようにすりゃいいだけ
0896デフォルトの名無しさん
2016/02/14(日) 07:51:34.27ID:fDQc/eCz機能的にも速度的にも
ていうか、素直にVB使えばええやん
もしかして無料って知られてない?
会社のルールでインスコできないヤツはご愁傷様
0897デフォルトの名無しさん
2016/02/14(日) 10:13:31.34ID:/e94Iuh/0898デフォルトの名無しさん
2016/02/14(日) 11:02:24.78ID:fDQc/eCz0899デフォルトの名無しさん
2016/02/14(日) 12:29:32.95ID:qwowkzgX0900デフォルトの名無しさん
2016/02/14(日) 12:43:28.94ID:SJCumIm8VBAまでのバージョンだと仕様的に基本的なデータ型を別に扱わなければならなかったせいで、
Variant型が必要だったけど、VB.NETになって全てObject型で扱う事が出来るから廃止された。
という風にググッたら書いてあった。
0901デフォルトの名無しさん
2016/02/14(日) 13:16:52.23ID:+WF+5Yylでも大幅な書き換え作業はやっぱりいやだな。いま出来ている事ができなくなる不安もあるし。
0902デフォルトの名無しさん
2016/02/14(日) 19:29:42.13ID:I7Qc+kxzここだけ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でもなんで自分で実験すりゃ済む事を疑問として抱え込んだり、出来ないと思い込んでVBAの欠点だと騒ぐんだろう。
0904デフォルトの名無しさん
2016/02/14(日) 20:03:05.35ID:Bsnhcx6p>オブジェクト型の変数もその他もお構いなしに突っ込めるのは関数だから
ちがいます
要素がバリアント型なので普通の値もオブジェクトも格納できるだけです
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/Ksub(a)の上行に public 装置番号
とか宣言すればモジュール内で使えます
workシートのあるセルを使っても引き渡せます
0907デフォルトの名無しさん
2016/02/14(日) 20:49:27.29ID:qwowkzgXたぶん>>902はなぜ Set = と書かなくても格納できるのかを疑問視してるんじゃない?
バリアント型だから普通の値もオブジェクトも格納できるってのはその通りだけど、Set = と書かなくてすむ
別の理由を求めたいんだろう。
0908デフォルトの名無しさん
2016/02/14(日) 20:50:38.97ID:qwowkzgX>なんで自分で実験すりゃ済む事を疑問として抱え込んだり、出来ないと思い込んでVBAの欠点だと騒ぐんだろう。
ふつうは実験する前に規格があるからじゃない?
0909デフォルトの名無しさん
2016/02/14(日) 21:10:13.27ID:1RrNJs8yセルで引き渡します。ありがとうございました
0910デフォルトの名無しさん
2016/02/14(日) 22:02:39.06ID:+EEU6IXV> ここだけsetの洗礼を免れるのは違和感があるんですが本当にいいんです?
いいも何もマイクロソフトがそれでいいと思ったからこうなってるだけだしな。
元々Setが必要なのはデフォルトプロパティが紛らわしいから値の代入と参照の代入を区別する為だけど、
マイクロソフトはArray()関数の引数でデフォルトプロパティを使いたい場面はないと判断しだんだろ。
必要だと思えばそれなりの構文を用意してくるはずだ。
要するにそういう決まりだというだけで、何ら論理的な理由はない。
受けいれるか受けいれないかだけだ。
あと、必ず最後にNothingを代入するのはやめろ。
メモリの解放を人が管理するとかならず漏れがあるから言語側で面倒を見てくれているのだから
Nothingの代入を書く癖がつくと当然書き漏らしが出てくる。
そして、そのプログラムを見た誰かは当然「どうしてここだけNothingが代入されていないのか」
という無駄な疑問を抱く事になる。プログラム的にな何ら問題がないにもかかわらず、だ。
つまり、どうしても他人を混乱に落しいれたいのでなければ余計な事はするな。
Nothingは代入するな。
0911デフォルトの名無しさん
2016/02/14(日) 22:11:05.23ID:Ahl3Hrvyこの前提が間違ってる
「万が一書き漏らした場合には他者がそのコードを見たときに混乱する可能性も有る」
という程度の話なら理解できるけど
0912デフォルトの名無しさん
2016/02/14(日) 22:11:45.16ID:SJCumIm8そこには注意する必要があるけどな。
最後にNothing入れたい変数を持つ一連の処理は可能な限り別関数にすべきだけど。
0913デフォルトの名無しさん
2016/02/14(日) 22:13:39.02ID:+EEU6IXVお前は万が一かもしれんが、普通の人は十が一程度なのだよ。
0914デフォルトの名無しさん
2016/02/14(日) 22:28:57.78ID:LvmVag53信じろ
もしメモリが開放されてなかったら馬鹿にしてもらってもいい
0915デフォルトの名無しさん
2016/02/14(日) 22:46:01.63ID:Ahl3Hrvyその程度の人物なら他人の書き漏らしにも気付かないから
結局同じ事だよ
0916デフォルトの名無しさん
2016/02/14(日) 22:58:05.65ID:Bsnhcx6p>ループ内でNewする時は明示的にNothing入れないとメモリを圧迫していく
軽く試した範囲では、新しいインスタンス代入した時点で、前のインスタンスは破棄されてるっぽいぞ
当然他に参照が無い前提だぞ
>>914
循環参照とかしてると、使われなくなった後も開放されないんだが
まあ、参照されてるわけだから、使われなくなっていないと言えなくもないが
0917デフォルトの名無しさん
2016/02/14(日) 22:58:31.32ID:qwowkzgXそういうことを推測すること自体おかしいよ。
言語仕様を規格化していないことは罪だ。
0918デフォルトの名無しさん
2016/02/15(月) 01:13:01.96ID:akbmk0Ll0919デフォルトの名無しさん
2016/02/15(月) 06:37:55.70ID:Lkye5vJL0920デフォルトの名無しさん
2016/02/15(月) 06:39:18.81ID:g9kiXg+i0921デフォルトの名無しさん
2016/02/15(月) 09:44:08.73ID:k3iqvbPmDim 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いちいちググってコピペしてる
あまりにもよく使うやつは、自分の作った古いVBAのソースからコピペ
0924デフォルトの名無しさん
2016/02/15(月) 12:52:54.34ID:Mj6OaY8K× 分からずに会話し続けられる
○ 分からずに適当なことを言い合ってるだけ
0925デフォルトの名無しさん
2016/02/15(月) 14:03:32.87ID:k3iqvbPmいいことを教えてあげよう。
F2押してオブジェクトブラウザ出して
左のクラスの欄のApplicationをクリックすると
右の欄に使用可能なプロパティ/メソッド一覧が出て
その中にScreenUpdatingもDisplayAlertsもCalculationも含まれてあるから暗記やモジュール準備は不要になる。
そんな具合で、Scripting.FileSystemObjectやFileSystemObjectやMicrosoft Scripting Runtimeを
暗記しないで使う方法はありますか?
数か月ぶりにVBAやると必ず忘れてる。
0926デフォルトの名無しさん
2016/02/15(月) 15:34:29.01ID:OsSn1sDv一覧から選べれば良いのか?
いいことを教えてあげよう
ツール-参照設定で一覧にMicrosoft Scripting Runtimeはあるぞ
それを選択すれば、オブジェクトブラウザの一覧にFileSystemObjectはあるぞ
0927デフォルトの名無しさん
2016/02/15(月) 16:27:37.25ID:AOCHEijb綴りは全部分かってんの
ただ、それをキーボードから打ち込むのが面倒なの
application以降の3つとかは決まりきった並びで
ワンセットにしてるし、それぞれ一覧から選ぶより
まとめてコピペのほうが速いんだよ
0928デフォルトの名無しさん
2016/02/15(月) 19:20:33.88ID:Lkye5vJL忘れたらまたここで聞いてくれればいいじゃないか
そしたら俺はいつだってMicrosoft Scripting Runtimeと言ってやるぜ!
0929デフォルトの名無しさん
2016/02/15(月) 19:45:18.94ID:yxxj5Zwg0930デフォルトの名無しさん
2016/02/15(月) 20:13:33.20ID:g9kiXg+i俺は関数名そのままのクラス作って内部でCreateObjectするようにしてるわ。
ScreenUpdatingとかもInitializeでそれまでの設定を記憶しつつFalseにして、
Terminateで記憶した設定を戻すクラス作って不意のエラーで停止しても大丈夫なようにした。割と便利。
0931デフォルトの名無しさん
2016/02/15(月) 20:43:20.75ID:OsSn1sDvVBEはもうちょっと進歩してほしいよな
0932デフォルトの名無しさん
2016/02/15(月) 21:22:14.77ID:k3iqvbPm参照設定の一覧は多すぎて探すのが大変。
FikeSystemObject使いたいときはMicrosoftで始まることを忘れてて
FikeSystemObjectで探そうとするけど見つからない。
ひさしぶりだと「Microsoft Scripting Runtime」ということはすっかり忘れてる。
0933デフォルトの名無しさん
2016/02/15(月) 21:23:09.13ID:k3iqvbPm職場だから2chは見れない。
実際、変なサイトばかり見てる人がセキュリティ部門から警告があって上司からかなり怒られてた。
0934デフォルトの名無しさん
2016/02/15(月) 21:27:57.34ID:k3iqvbPmDOMツリーを使いたいときの諸準備のコードも
暗記せずに思い出す方法はないものか?
・CreateObject("InternetExplorer.Application")
の暗記も大変。
・参照設定はどれにチェックすればいいんだっけ?
・すでに開いてるIEタブを取得するにはどうすればいいんだっけ?
CreateObject("Shell.Application").Windowsだっけかな?
とか数か月さわってないと確実に忘れてる。
0935デフォルトの名無しさん
2016/02/15(月) 21:34:34.23ID:k3iqvbPmそれはどういうことでしょう?
具体的にお教え願えますか?
0936デフォルトの名無しさん
2016/02/15(月) 21:45:53.14ID:akbmk0Llにちゃんって変なサイトなのか?
0937デフォルトの名無しさん
2016/02/15(月) 21:53:54.62ID:g9kjW0Ge変数をたプロシージャに渡して、何かが代入されるかもしれないけど、
戻ってきたとき無効値のままだったら代替の値を入れるという処理をしたいです。
EmptyやNullは意味ある値として代入されたかもしれないから使えない、と言う状況。
Private 宣言したユーザ定義型はVariantに入れられないし...
0938デフォルトの名無しさん
2016/02/15(月) 21:54:32.39ID:g9kjW0Ge〇 変数を他プロシージャに渡して、
0939デフォルトの名無しさん
2016/02/15(月) 22:11:10.90ID:Lkye5vJL0940デフォルトの名無しさん
2016/02/15(月) 23:08:47.52ID:t+u0tvIB文字列で"これは無効だよーん"とか入れとけばいいんじゃないか?
0941937代筆
2016/02/15(月) 23:18:02.57ID:k3iqvbPm0942937
2016/02/16(火) 00:11:21.73ID:H4lPH6nF故意に狙ってやらないと代入されないような値を初期値にします。
0943デフォルトの名無しさん
2016/02/16(火) 00:18:58.14ID:CDwErKdX0944デフォルトの名無しさん
2016/02/16(火) 00:25:27.71ID:H4lPH6nFインタフェースが同等の関数がたくさんあり、色々なことをやっている。
どの関数を使うかは変わりうるし、関数自体他者によって追加されることがある。
つまり、こちらからはブラックボックスとして扱うしかないということです。
0945デフォルトの名無しさん
2016/02/16(火) 00:51:59.74ID:iVtNN0Qi0946デフォルトの名無しさん
2016/02/16(火) 01:27:30.50ID://sfpAqeNotingって使えないんだっけ?
ならテキトーな空クラス作って、それのインスタンスがVariantの引数に設定されてたら
無効ってことでいいと思うけど。
0947デフォルトの名無しさん
2016/02/16(火) 02:45:02.01ID:qOZul9Nyそういうのは、別に用意したステータスやプロパティで判断するのが普通だよ
初心者はトリッキーなことをやりたがって困るといういい見本
0948デフォルトの名無しさん
2016/02/16(火) 02:48:36.36ID:VbbVKCv+処理内容も書かずに何が無効かなんてわかるわけない
0949デフォルトの名無しさん
2016/02/16(火) 03:22:04.47ID:iVtNN0Qiマルチ代入できる言語では、戻り値とエラー情報を、同時に返す
file, err := os.Open("ファイル名")
if err != nil { エラー処理 }
0950デフォルトの名無しさん
2016/02/16(火) 03:47:15.71ID:vhaFMrWy意味ある値として代入されたらって言うなら、意味ない値を自分で定義するか
値で判断しないで別途フラグなり用意しないと無理に決まってるじゃないか
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:vhaFMrWyActivateはブックをロードする命令じゃない
ロードされてない(開いてない)ブックをActivateはできないぞ
まずWorkbooks.Openで該当ブックを開いてからActivateしてみろ
0953デフォルトの名無しさん
2016/02/16(火) 07:42:06.56ID:Z4rZSsSX既存の関数群に、別なフラグも渡して、値を設定するよう書き換えてもらう。
...ってのは無理だろうなあ。
0954デフォルトの名無しさん
2016/02/16(火) 10:02:57.33ID:aYsl0/Pbそういう役目を持った値なんだから
それに別の意味合いを持たせようとする事が間違ってるんだよ
そんな関数設計する奴が悪い
0955デフォルトの名無しさん
2016/02/16(火) 11:42:02.50ID:eXnnZzqM「見つかりませんでした」とか
0956デフォルトの名無しさん
2016/02/16(火) 14:26:11.65ID:IqEc+Y3yありがとうございます。助かりました。
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+/g8aWorkbooks.Open したら、その開いたBookがActiveになるから
その後のActivateには意味が無いよ
0958デフォルトの名無しさん
2016/02/17(水) 15:20:18.67ID:6+bmS6GM3、4時間かかるプログラムを毎日夜中に走らせたいのですが、今日初実験したところ、途中でフリーズしてしまい完了できませんでした。ESCでの中断もできず、タスクキルしました。
フリーズ回避とESC中断が確実に出来るようにしたいのですが、どういったものが原因にあるでしょうか?内容は
IEからデータ取得(計5回のみ)+データ加工といったものです。
何か小さなことでもいいのでアドバイスお願い致します。
0959デフォルトの名無しさん
2016/02/17(水) 15:28:29.31ID:ZHMdTa0oまず、ログを適宜出力して、どこで止まったのかを特定すること。
0960デフォルトの名無しさん
2016/02/17(水) 15:55:03.95ID:BZc3HBMX初めて知りました。ありがとうございます、やってみます!
0961デフォルトの名無しさん
2016/02/17(水) 16:10:08.40ID:ZHMdTa0o蛇足かも知れないが。
ログはファイルに出力すること。
ここ参照。
http://officetanaka.net/excel/vba/filesystemobject/sample06.htm
どこでログ出力するのかは、
・IEにアクセスするメソッドの前後(これが怪しい)
・各Sub/Functionの入り口と出口
・あと怪しそうな所の前後
0962デフォルトの名無しさん
2016/02/17(水) 16:50:50.50ID:ev89C1lUありがとうございます。
ActiveなワークブックにActivateしても特に害とかは無いのでしょうか?
0963デフォルトの名無しさん
2016/02/17(水) 17:11:02.35ID:wkre/nrC同じページ見てました。
ファイルに書き出すところまでうまく行ってます!
もしかしたら、私の予想3、4時間が甘く、実際は6時間ぐらいかかってまだ正常に動いていたのをフリーズと勘違いしたかもしれません、、そこで中断が出来れば良かったのですが、出来ず、、
ブック保存も適宜加えながら改善してみます。
0964デフォルトの名無しさん
2016/02/17(水) 17:23:45.29ID:ZHMdTa0oあ、あと、DoEventsを適当な所に入れること。
これを最初に言うべきだったか。
参考ページ:
http://officetanaka.net/excel/vba/function/DoEvents.htm
(OFFICE TANAKAのGoogle Top率高杉w)
0965デフォルトの名無しさん
2016/02/17(水) 17:55:29.76ID:Z4Qv/wn8どなたか詳しく教えていただけませんか?
Sleep関数と関連がありますか?それとも同じですか?
0966デフォルトの名無しさん
2016/02/17(水) 18:11:29.39ID:ZHMdTa0oDoEventsがないと、そのプログラムは「応答なし」になって固まってしまう。(実際は処理をしてるんだけど)
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じゃあ他の多くのマクロは
コード中にDoEventsを入れてないのに
固まることなく動くのですか?
Windowsイベントについてもっと具体的に詳しくゼロから教えていただけると
0968デフォルトの名無しさん
2016/02/17(水) 18:15:11.97ID:Z4Qv/wn80969デフォルトの名無しさん
2016/02/17(水) 18:48:59.35ID:P44GJ7CRググるとすぐに出ますよ
0970デフォルトの名無しさん
2016/02/17(水) 20:58:21.62ID:63D/Eew4やる意味は無いけど、やっても害も無い
まぁ不要な命令が増えてるんだから
厳密には何マイクロ秒とかの無駄な時間を消費してるのかもしれないが
そんなの害とは言わんでしょ
0971デフォルトの名無しさん
2016/02/17(水) 22:10:15.48ID:JpNSKx+3大変助かりました!ありがとうございます!
0972デフォルトの名無しさん
2016/02/18(木) 08:47:39.44ID:IWN3hz7kエラー処理で手抜きするな
0973デフォルトの名無しさん
2016/02/18(木) 10:27:00.74ID:0J6cOFMi参照プロシージャが無限ループしてしまい、
呼び出し元のプロシージャに戻らない問題が起きています。
ステップで確認すると、参照元のEND SUBを通過後、何故かFORの中にあるDOeventsに行った後に頭のsubに戻っていました。この原因が何か分かる方はおりますでしょうか?
0974デフォルトの名無しさん
2016/02/18(木) 10:55:35.59ID:l36zGYPbDoEventsの入ったコードではApplication.EnableEventsをFalseにしとかないと
そういう事も起こりえるって死んだじいちゃんがよくいってた
0975デフォルトの名無しさん
2016/02/18(木) 11:44:30.07ID:0J6cOFMi試してみます。ありがとうございます
0976デフォルトの名無しさん
2016/02/18(木) 12:12:27.57ID:eqQ9uyZXSleep関数ってなんのために存在するのですか?
DoEventsとの違いは?
0977デフォルトの名無しさん
2016/02/18(木) 13:23:51.48ID:7/4guD7jスリープは、ハチ公前広場で指定時刻まで待機(恋人有り)
DoEventsは、ハチ公前広場で何もしないでボーッと突っ立ってる状態(寂しい独り者)
前者は待機していなければならないので、何があっても待機する。
後者はボーッと突っ立ってるだけなので、他に命令が来ればそれに従う。
0978デフォルトの名無しさん
2016/02/18(木) 15:24:56.76ID:niHzXDQD相手しなくていいよ >>965 >>976
「Subと値を返さないFunctionは以下同文」のパターンもある
「わからないならレスしなくていい」までがワンセット
0979デフォルトの名無しさん
2016/02/18(木) 15:46:18.90ID:7/4guD7jOK
NGワードにぶっこんだわ
0980デフォルトの名無しさん
2016/02/18(木) 19:25:02.56ID:nQtvKuWdわからないならレスしなくていい
0981デフォルトの名無しさん
2016/02/18(木) 19:36:47.16ID:l9x3v9SX0982デフォルトの名無しさん
2016/02/18(木) 21:27:57.74ID:Rl3zK8VE「仕事しながら突っ立ってる」ならいいけど。
0983デフォルトの名無しさん
2016/02/18(木) 21:53:34.83ID:l9x3v9SXもしかして君は、たとえばIfからEnd Ifの間に書かれた複数の命令は、
「命令の優先順位こそあれ、可能であれば全て同時に実行される」と考えていたりしない?
0984デフォルトの名無しさん
2016/02/18(木) 22:00:05.61ID:Rl3zK8VE?
>>977には「ボーッと突っ立っている。他に命令が来ればそれに従う」とあるのだぞ?
じゃあ他の命令が来ないときは何をやっていると?
0985デフォルトの名無しさん
2016/02/18(木) 22:13:00.56ID:42G1e3Suぼーと突っ立てるんじゃなくて、たまってる別の仕事をチェックする事なわけだが
0986デフォルトの名無しさん
2016/02/18(木) 22:14:17.77ID:1Ki47seW恋人とデート(メインの仕事)中にたまに他のねーちゃんの相手(GUI の処理)する様なもんかな w
0987デフォルトの名無しさん
2016/02/18(木) 22:25:41.37ID:Rl3zK8VEでもDoEventsは待ったりはしないから「突っ立っている」と表現は当たらない。
0988デフォルトの名無しさん
2016/02/18(木) 22:25:55.12ID:l9x3v9SX命令が来ない時は命令が来るのを監視するんだよ。
もしC++でウィンドウ付きのWindowsアプリケーションソフトを作った経験がなければ、
閉じるボタンで閉じるだけのウィンドウアプリケーションを作ってみれば感覚がつかめると思うよ。
0989デフォルトの名無しさん
2016/02/18(木) 22:27:21.71ID:Rl3zK8VE入れ違いになったが>>987
0990デフォルトの名無しさん
2016/02/18(木) 22:30:01.18ID:l9x3v9SXそもそもがSleep命令との対比だよ?
DoEvents命令でウィンドウプロシージャに制御を戻す行為を(その時に発生する1Tick以上の遅延を)「待つ」と表現しないなら、
そもそもパソコン全体の処理が「待つ」のは電源落ちた時だけって事になるんじゃない?
0991デフォルトの名無しさん
2016/02/18(木) 22:36:30.17ID:Rl3zK8VEその説自体は否定しないが、>>977の
「DoEventsは、ハチ公前広場で何もしないでボーッと突っ立ってる状態(寂しい独り者)」
を擁護するのは厳しいだろ。
0992デフォルトの名無しさん
2016/02/18(木) 22:41:25.18ID:l9x3v9SXそう? だってDoEvents命令は仮にメッセージキューに何の命令も無かったらすぐに戻ってくるのに対して、
Sleep命令は他にタスクが無くても指定した時間まではOSから呼び出されないから、振る舞いを表現するには適切じゃないかなぁ。
0993デフォルトの名無しさん
2016/02/18(木) 23:06:08.58ID:Rl3zK8VE適切かねえ...
以下のプログラムのコメントに違和感はない?
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入力データを
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やっぱり君は一度、ウィンドウアプリケーションの作成を経験して考えてみるべきだと思うよ。
Sleep命令とDoEvents命令が同列の機能だと勘違いしている気がしてならない。
>>994
配列で扱ってセルに出力する。
結合に関しては結合されていないテンプレートに、配列を出力した後に結合を行うようにするか、
真っ新なシートに出力した後で、装飾全般をマクロで行うようにする。
0996デフォルトの名無しさん
2016/02/18(木) 23:19:16.27ID:Rl3zK8VEん、君こそ>>997の「DoEventsはボーッと突っ立っているだけ」を支持してるんだから、SleepとDoEventsを同等に見てると言うに相応しいのでは?
0997デフォルトの名無しさん
2016/02/18(木) 23:27:28.28ID:jiQGl0+C何の命令も無かったら「すぐに」戻ってくる (←これは正しい)
を「ボーッと」と表現してる限り話はかみ合わないと思うの
0998デフォルトの名無しさん
2016/02/18(木) 23:29:20.75ID:HG4Fn1coなんで確認しないの
0999デフォルトの名無しさん
2016/02/18(木) 23:31:31.34ID:l9x3v9SXwhile(1){
functionA;
sleep 1; //←Sleep命令
}
void functionA(){
int f = 1;
while(f){
f = 0; //←DoEvents命令
}
}
実際の中身が同等とは思わないけど、おおよそこういう処理の違いだよ?
1000デフォルトの名無しさん
2016/02/18(木) 23:46:03.83ID:jiQGl0+CINもOUTも配列にして>>995が言ってるようにすればいいと思うけど、
「5列目の判定でOUT(1)とOUT(3)を出力します」の「5列目の判定」ってどういう意味?
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
10021002
Over 1000Thread運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 2ちゃんねる専用ブラウザからの広告除去
★ 2ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
http://premium.2ch.net/
http://pink-chan-store.myshopify.com/
レス数が1000を超えています。これ以上書き込みはできません。