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

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

レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん2016/09/17(土) 18:40:11.13ID:CG7Ng2Af
ExcelのVBAに関する質問スレです
コード書き込みや作成依頼もOK

※前スレ
Excel VBA 質問スレ Part42©2ch.net [無断転載禁止]©2ch.net
http://echo.2ch.net/test/read.cgi/tech/1466876143/


※関連スレ
VBAなんでも質問スレ Part2 [転載禁止]©2ch.net
http://echo.2ch.net/test/read.cgi/tech/1432173164/
Access VBA 質問スレ Part1
http://echo.2ch.net/test/read.cgi/tech/1328536426/
Excel総合相談所 123 [無断転載禁止]©2ch.net
http://echo.2ch.net/test/read.cgi/bsoft/1466982445/
0002デフォルトの名無しさん2016/09/18(日) 03:32:40.04ID:E6Ddg3cM
>>1
早期に20書き込みしないとスレが落ちるんじゃなかったっけ
0003デフォルトの名無しさん2016/09/18(日) 04:59:06.82ID:7hWjIaaG
保守ついでに

リファレンス本でオススメあります?
630、700、525あたりかな。
それともネットで十分か。
0004デフォルトの名無しさん2016/09/18(日) 05:19:15.21ID:8xVAufzn
>>1乙カレー

>>3
ネットで十分だし何の関数やプロパティについて知りたいのか最初から決まっていればヘルプで十分
0005デフォルトの名無しさん2016/09/18(日) 19:49:40.91ID:MSbonHvQ
VBAをエクセル関数として使える機能はどんなときに使うのかまだわかってない
0006デフォルトの名無しさん2016/09/18(日) 20:01:59.39ID:fo/KPIpx
むしろ標準で備わっていないワークシート関数を作るのがエクセルVBA本来の用途じゃないかな。
0007デフォルトの名無しさん2016/09/18(日) 20:06:13.51ID:si+CVhCC
office365でもVBA的なもの作って欲しいな
あとpower biみたいにオンプレのデータソースに繋げられるようにして欲しい
0008デフォルトの名無しさん2016/09/18(日) 20:21:31.92ID:7VrjSwLN
>>5
エクセル関数で実現が
困難な場合
0009デフォルトの名無しさん2016/09/18(日) 20:30:15.56ID:MSbonHvQ
>>8
なるほど
俺はまだそこまで困難な壁にぶつかってないだけなんだな
0010デフォルトの名無しさん2016/09/18(日) 21:03:41.96ID:ynPmUZ3U
Public変数をすべてデフォルト値に戻すメソッドってありましたっけ
100個くらいあって一回実行するたびいちいち変わりやがる
いちいち再起動が面倒くさい
0011デフォルトの名無しさん2016/09/18(日) 21:15:27.36ID:fo/KPIpx
>>10
Public変数ってのが何を指しているのかいまいち分からないけど、
エクセルの標準的機能に関わるようなもんなら変更前の値を保存しておいて処理後に復帰させるべきだし、
自分で定義した変数の事を言っているなら、そもそもPublicにすべきでない。
0012デフォルトの名無しさん2016/09/18(日) 21:45:09.40ID:MSbonHvQ
マクロを複数回動かしたときにグローバル変数が前回の結果になって困ってるのであれば初期化メソッドでも作ればいいんじゃない?

そもそもその作りが良いかどうかは別の話として
0013デフォルトの名無しさん2016/09/18(日) 22:53:20.26ID:gWNbszTQ
Endしたら変数ってクリアされてなかったっけ
まあ1回ブック閉じてまた開けばいいんじゃないか
0014デフォルトの名無しさん2016/09/18(日) 22:57:29.19ID:kytYHMlO
クリアされるといえば新規ブックを開くとイミディエイト上の変数が全部クリアされてしまうのが超不便。
文句出ないのか?
0015102016/09/19(月) 02:05:04.48ID:UNfXSNIe
>11
>そもそもPublicにすべきでない

そうできりゃ話は簡単なのは聞くまでもない
いろいろ渡世の義理があってそうはいかないんですよ
0016デフォルトの名無しさん2016/09/19(月) 08:23:48.62ID:2AkIrPcv
無けりゃ作らなしゃーない
0017デフォルトの名無しさん2016/09/19(月) 09:56:13.42ID:UNfXSNIe
「vba 変数 一括 初期化」でぐぐればいろいろ出てくるけど
あんな大げさなプロシージャがいるのかと思うとうんざり
0018デフォルトの名無しさん2016/09/19(月) 19:34:43.83ID:T/MKR8K7
エクセルも、アクセスもなのですが、私の技術ふそくの為、vbaで組んだコードが冗長になり、可読性が悪くなってしまうので、クラスを活用したいと思い、クラスについて学びたいのですが、詳しく説明がある書籍はありませんか?
絶版になっていないものをお願いします。
0019デフォルトの名無しさん2016/09/19(月) 19:50:09.23ID:2nuO43oR
冗長になるのは設計が悪いからであってクラス使ったから短くなるってもんじゃないし。

そもクラスはInitializeとTerminateが保証されているだけだから、
コラムくらいのサイズですらかなり詳しく紹介しているレベルじゃないかな。
0020デフォルトの名無しさん2016/09/19(月) 20:02:19.61ID:nwIwSQT5
冗長ってなにかね
0021デフォルトの名無しさん2016/09/19(月) 20:11:11.91ID:uXoHDK+m
冗長=無駄に長いこと
つまりもっと短くできる確信がないのに冗長と判断してはいけない
0022デフォルトの名無しさん2016/09/19(月) 20:15:49.91ID:qy4qKHn4
>>18
そんなことを聞いちゃう人はそもそも向いてないと思う
転職をすすめる
0023デフォルトの名無しさん2016/09/19(月) 20:24:25.44ID:nwIwSQT5
無駄に長いって言うと悪い意味しかなさそうだけど良い意味でも使うだろ冗長って
なんでこんな分かりにくい言葉を使うのかねこの業界は
0024デフォルトの名無しさん2016/09/19(月) 20:37:30.29ID:fA1B/38Y
たぶん>>18が直面している問題は冗長さじゃないと思うけど。
0025デフォルトの名無しさん2016/09/19(月) 20:52:16.32ID:0SdvYmSf
後で自分で読んで何書いてるかわからなくなるのか、それとも他人が読んでわかりにくいと言われるのかどっちなんだろ。
0026デフォルトの名無しさん2016/09/19(月) 21:05:11.46ID:uXoHDK+m
まあ気持ちはわかる
でもオブジェクト指向って、コードを部品化して再利用性を高めるのが主目的だから
コードを短くするっていう目的に使うのはどうかなあ
0027デフォルトの名無しさん2016/09/20(火) 05:22:29.02ID:7CXGcLuN
18です。
文章が、分かりにくく済みません。
長さよりも、可読性が悪いのが問題で、可読性を良くして再利用出来る物を作りたいと思い、クラスの勉強がしたいと思いました。

分かり易い書籍等、ありませんか?
0028デフォルトの名無しさん2016/09/20(火) 07:09:02.68ID:Z9+3PvfD
>>27
可読性がよく無いのであればクラス使ったところで
良くなるとは思えないなぁ。
その前に構造化言語がどういうものかを勉強した方が良い気がする。
例えば単一責任原則とか。
0029デフォルトの名無しさん2016/09/20(火) 08:47:37.18ID:8EipcP2a
可読性悪くなったとき俺は一度無駄にメソッド細分化してもう一回まとめるってことをやってるなぁ
ある程度ならこれでよみやすくなる
0030デフォルトの名無しさん2016/09/20(火) 09:18:06.28ID:pi/Zyw6M
>>27
「長さよりも」って言うけど、実際のところひとつの関数の平均的な長さは何行くらいになってる?
それだけで何かが判断できるわけじゃないけど、参考にはなる。
0031デフォルトの名無しさん2016/09/20(火) 10:07:52.42ID:7CXGcLuN
>>30大体、30から長いもので80行くらいです。
0032デフォルトの名無しさん2016/09/20(火) 13:48:28.56ID:YRWH8aGZ
シートモジュール内で自身のシート名を取得するにはどうしたらいいんでしょうか?
0033デフォルトの名無しさん2016/09/20(火) 14:02:44.97ID:UuN/AA1p
>>32
これはどう?
Debug.Print Cells(1, 1).Parent.Name
0034デフォルトの名無しさん2016/09/20(火) 14:35:00.24ID:pZijh5la
>>32
Me.Nameでいける
0035デフォルトの名無しさん2016/09/20(火) 15:01:31.93ID:YRWH8aGZ
>>33-34
ありがとうございます
シンプルなので Me.Name にしましたm(__)m
0036デフォルトの名無しさん2016/09/20(火) 20:30:34.17ID:tqDRs8uw
>>31
これまた微妙な長さだなぁ。
いや、別に長さがどうのと言うより
一つのメソッドや関数に持たせている役割が一つかどうかというところが重要で
別に役割的に一つであれば長くても問題無いんだけど
キチンと細かく分けていれば
そんなに長くなることはまぁ無いだろうということで
何を一つの役割として捉えるかは結構センスによるところもあるので
どこまで細分化すれば見易いのか色々試してみると良いと思うよ。
0037デフォルトの名無しさん2016/09/20(火) 20:39:23.40ID:7CXGcLuN
>>36
ありがとうございます。
もっと勉強します。
0038デフォルトの名無しさん2016/09/20(火) 22:51:09.10ID:ufJFR4YN
マジか!
Me.NameってAccess専用じゃなかったのか。
ずっとActivesheet.Nameにしてたわ。
0039デフォルトの名無しさん2016/09/20(火) 22:58:56.25ID:UuN/AA1p
>>34>>35
確かにMe.Nameの方がスマートだ・・・
0040デフォルトの名無しさん2016/09/21(水) 10:37:23.74ID:yguOEPz4
VBAでクラスのこと説明してる文献じたい少ないもんな
クラスが充実してる他言語の知識があれば応用きくんだが
0041デフォルトの名無しさん2016/09/21(水) 10:42:56.93ID:yguOEPz4
>>27
俺のリンク集を提供しよう

Excel VBAではじめるクラス入門
http://codezine.jp/article/detail/499

「 クラス 」 一覧
http://excelwork.info/excel/category/excel-vba/vba-class/

クラスの作成と使い方
http://www.petitmonte.com/excel/excel_vba_21.html

クラスモジュールの使い方
http://blog.livedoor.jp/midorityo/archives/50702769.html
0042デフォルトの名無しさん2016/09/21(水) 17:56:04.19ID:YaI08LoP
初心者なのでわかりづらい質問かと思いますがご容赦ください。
マクロでIE操作をする際テキストボックスに入力した文字が、submitボタンを押すと消えてしまい困っています。

具体的には
あるサイトにてID及びPWを入力しログインするマクロを書いています。
ID及びPWを
objIE.document.Forms("0").Item("username").Value = .Range("A" & r).Value 'ID
という感じで入力しています。
この段階で入力自体は出来ています。
しかし、送信しようとsubmitボタンを押したところ、ID及びPWが未入力と表示されてしまいます。

このようなタイプのテキストフォームにはどのように対応したらよろしいでしょうか。
よろしくお願いします。
0043デフォルトの名無しさん2016/09/21(水) 18:41:40.60ID:oz2loU78
>>42
Javascriptで入力内容をチェックしてる場合で、Sendkeysで1文字ずつ送り込まないと
正常に受け付けてくれないサイトがある
しかも入力が速すぎると取りこぼすから、1文字ずつSleepが必要というサイトに当たったことがある
0044デフォルトの名無しさん2016/09/21(水) 20:00:21.99ID:B6Hnyf6U
>>40
> クラスが充実してる他言語の知識があれば応用きくんだが

むしろ、あれもできないこれもできないでストレスたまるだけかと
0045デフォルトの名無しさん2016/09/21(水) 20:33:54.05ID:FWWdfGmf
>>44
車輪の再発明で理解が深まるぞ
こんな副作用はいらない
0046デフォルトの名無しさん2016/09/21(水) 21:39:14.98ID:hlX5pROo
>>44
あれも出来ないこれも出来ないとなるから
どうやって同じ効果を得ることが出来るか考えると
意外にクラスの本質を理解出来たり出来なかったり。

VBAのクラスは他のObject指向の言語と比べるとかなり異質ではあるとは思う。
0047デフォルトの名無しさん2016/09/21(水) 21:58:20.17ID:SbIk1F/F
VBEの、あのシステムで管理するっていうのがまず億劫というのがVBAでクラスが避けられる一番の理由だと思っている。
0048デフォルトの名無しさん2016/09/21(水) 22:12:13.86ID:FWWdfGmf
Excelって媒体を使ったスクリプト言語なイメージ
0049デフォルトの名無しさん2016/09/21(水) 22:14:44.76ID:G4TEirIP
>>47
なんのこっちゃ?クラスだと面倒な事ってなんかあったっけか?
0050デフォルトの名無しさん2016/09/21(水) 22:52:51.47ID:xTtUsgOH
>>49
俺も何のことを言ってるのかよく分からなかったけど、
他のObject指向言語と比べるとクラスは一つ一モジュールであるのと
フォルダ階層が切れないのがちょっと不便ではあるかな。

もっともVBAなんだからそれで困るような規模になったらそれなりのフレームワーク使えよって
ことなんだろうなと思って諦めてる
0051デフォルトの名無しさん2016/09/21(水) 23:09:55.29ID:SbIk1F/F
>>49
クラスモジュールはモジュール名がそのままクラスの宣言として使う名前になるから、
例えばApplicationオブジェクトからRangeオブジェクトまでの多層構造みたいなものを名前に意味を持たせつつ作ろうとすると、
画面上がごっちゃごちゃになってしまう欠点がある。

ただの関数なら目的毎に設定した名前の直下に、それぞれ独立した名前を持つ関数を置けるので、
この辺りの管理上の差がでかい。

せめてクラスモジュールというモジュールではなく関数と同じような宣言にして欲しかった。
0052デフォルトの名無しさん2016/09/21(水) 23:22:32.25ID:OEKSb8ug
そういう本質的じゃないところで不便なのってもやもやするよね。
0053デフォルトの名無しさん2016/09/22(木) 16:23:03.33ID:ouE1p1JD
もともとオブジェクト指向言語として設計されたものではない大昔の言語を
無理やりオブジェクト指向に対応させたんだからしょうがない
0054デフォルトの名無しさん2016/09/22(木) 18:07:24.84ID:uwLMVJ9H
純粋なオブジェクト指向言語はSmalltalkぐらいしかないんじゃないかな?
C++もJavaも実用重視のハイブリッドだから
0055デフォルトの名無しさん2016/09/22(木) 22:37:36.44ID:yjTU9+gG
もともとオブジェクト指向言語として設計された ≠ 純粋なオブジェクト指向
だから>>54はちょっと的外れ。
0056デフォルトの名無しさん2016/09/22(木) 22:43:14.46ID:GZW/lvPe
VBは、ボタンなどのGUI部品だけがオブジェクトであるかのように錯覚しやすいところが難点
0057デフォルトの名無しさん2016/09/23(金) 05:08:00.16ID:n2ReBx3Y
OOPという考え方を手軽に表現する為の抽象的機能を付与した言語をオブジェクト指向言語と呼ぶのであって、
OOP自体はやろうと思えばCでもアセンブラでも出来る、というところを理解してないと話がこんがらがりそう。

教則本によってはクラスなんかの機能を指して「これがOOPです」と書いてあるから、
機能そのものが「オブジェクト指向」なるものであると勘違いしてるらしいのが結構いるんだよね。
0058デフォルトの名無しさん2016/09/24(土) 07:43:16.42ID:PqeOX5og
@
if 何とか then

a=1

else

a=2

endif

A
a=1
if 何とか then a=2

短い行数で書けるので、
Aの方が良いようなするんだけど、
何か問題ある?
0059デフォルトの名無しさん2016/09/24(土) 07:53:36.59ID:rzwSyLnj
他人へ見せるときにAだと説明の手間が増えてしまう

個人で使うものなら何の問題もないと思う
0060デフォルトの名無しさん2016/09/24(土) 08:05:00.58ID:SZp/zloC
B
a = IIf( なんとか, 1, 2)
0061デフォルトの名無しさん2016/09/24(土) 08:08:03.58ID:Kv2O3Uae
>>58
if 何とか then a=1 else a=2

の方が代入を一回減らせる。まぁ一回あたり何万分の一秒って単位だろうけど。
0062デフォルトの名無しさん2016/09/24(土) 10:40:17.16ID:tTxE718Q
>>58
@だと>>61が言ってるように1回変数に代入する回数が多い。

>>60が言ってるBはその「なんとか」に当たる条件によっては途轍もなく重くなる可能性もあるので、
VB.Netでは禁じ手にされているほど。
軽いと分かっているときに使えばいい。

残りのAでいいとは思うけど、可読性から
改行してEnd Ifはつけないといけないという
コーディングルールがある仕事場も多いので
そこだけ気をつければ。
0063デフォルトの名無しさん2016/09/24(土) 12:00:02.95ID:ywjuOh2L
>>58
条件分岐を減らして
可読性も配慮してこうする

a=2
if 何とか then
  a=1
endif
0064デフォルトの名無しさん2016/09/24(土) 12:01:15.73ID:cOEdH2sV
空状態のA1〜C10までのすべてのセルが書き込まれたときに
イベント発生させるにはどうしたらいい?

Intersect(Target, Range("A1:C10"))〜だと
範囲内のどれか1つが書き込まれたときにイベント発生してしまう。
範囲内すべてに書き込まれたときに初めてイベント発生させたいんだが
0065デフォルトの名無しさん2016/09/24(土) 12:15:31.15ID:2iJ0cqv8
そのイベント発生時に全部埋まってるかどうかチェックして、埋まってたら発生した時にさせたい処理をすれば良いんでないの?
要は、その処理が目的なんでしょ?
0066デフォルトの名無しさん2016/09/24(土) 12:27:32.26ID:1Ily8dcI
>>61
代入を一回減らせるって
そうなの?
0067デフォルトの名無しさん2016/09/24(土) 13:16:08.24ID:zS8IzkdZ
>>66 >>61
違う
書き方が1行でも5行でも人間がソースを書く時、見る時の気分が変わるだけで処理は全く同じ
ただしIIfを使うと間違いなく重くなる
0068デフォルトの名無しさん2016/09/24(土) 13:30:03.40ID:LOklgRF6
iifは重くなるのより常に両辺評価されることのほうが副作用でかいだろ
0069デフォルトの名無しさん2016/09/24(土) 13:32:05.35ID:LOklgRF6
c言語とかでよくやるのは
a=1+(なんとか)
みたいなの
0070デフォルトの名無しさん2016/09/24(土) 15:37:16.78ID:Kv2O3Uae
>>67
たぶんソースを見誤ってる。

@if 何とか then a=1 else a=2
Aa=2 : if 何とか then a=1

の比較だぞ。
0071デフォルトの名無しさん2016/09/24(土) 15:44:45.17ID:1Ily8dcI
>>70
@の方は常に一回
Aの方は一回または二回
だよね?
0072デフォルトの名無しさん2016/09/24(土) 15:46:14.25ID:NAqJt7eC
>>64
Range("A1:C10").Count = Application.WorksheetFunction.CountA(Range("A1:C10"))
これで判定
0073デフォルトの名無しさん2016/09/24(土) 16:01:48.57ID:NAqJt7eC
>>58
男女による分岐のようなものなら@
血液のRH-のような例外処理ならA

そのほうが他人も読みやすいと思うけど 
まぁ個人的な使い分けだけど
0074デフォルトの名無しさん2016/09/24(土) 16:25:59.23ID:Kv2O3Uae
>>64
v = range("A1:C10").value
for each x in v
if len(x) = 0 then exit for
next
if len(x) then
処理
end if

という形にすれば。
0075デフォルトの名無しさん2016/09/24(土) 19:23:24.92ID:TOidze/l
>>73 に一票
0076デフォルトの名無しさん2016/09/24(土) 21:22:22.86ID:eeyPDFif
>>73
まぁ実際に例外処理でそう言う分岐使ったりするしね。
もっともここで言う例外処理とは違うみたいだけど。
0077デフォルトの名無しさん2016/09/24(土) 21:53:14.89ID:cOEdH2sV
>>64>>72>>74
ありがとう試してくる
0078582016/09/24(土) 22:24:31.06ID:PqeOX5og
ありがとう。
分岐より代入そのものが重いのね。

IIfはタイプミスかと思ったわw
0079デフォルトの名無しさん2016/09/24(土) 22:43:00.90ID:zS8IzkdZ
>>78
(右辺の評価を無視して考えれば)代入そのものは別に重くない
けど不必要な処理はできるだけスキップした方がプログラムの流れが理解しやすい
0080デフォルトの名無しさん2016/09/25(日) 03:08:09.03ID:vbHA1Pf0
IIfが重くなる可能性があるのは両方の式を評価するからなんだが
実際に式が定数だったら評価するようなコードにコンパイルされるだろうか?
0081デフォルトの名無しさん2016/09/25(日) 04:16:20.96ID:Jq/Gde1V
>>80
両方の引数が単純な定数だったとしても、関数呼び出しのオーバーヘッドがあるから重くなるんだよ
0082デフォルトの名無しさん2016/09/25(日) 07:50:31.92ID:leRSLVp8
すんません、超初心者です・・。

do while loopとwhile wend
って、

@while wendではできるが、do while loopにできない事って無いんですか?

A仮に、while wendではできるが、do while loopにできない事って無いなら、
なぜこういう似たようなものがあるんですか?

B今、Web上に転がってた他人が書いたコードを見てるんですけど、
繰り返し内にifがあって、そのifにTrueになった場合に抜ける処理(Exit do)が必要な場合Do while loopを使ってて、
繰り返し内にifが無く、while [condition]のcondition で抜ければ十分な場合、while wendを使ってるみたいなのですが、
これ何か処理上でメリットがある物なのでしょうか。


よろしくお姉害します。
0083デフォルトの名無しさん2016/09/25(日) 09:04:12.78ID:WsJwhBfK
@
同じ
ただし、do loopは評価位置(while)を始めか最後か可変可能

A
開発者に聞いてくれ

B
書いた人に聞いてくれ
あと文が長くて意図を読みとり難い
>>今、〜ですけど、〜があって、〜場合に〜を使ってて、〜が無く、〜な場合、〜なのですが、これ何か処理上でメリットがある物なのでしょうか。
0084デフォルトの名無しさん2016/09/25(日) 09:29:04.94ID:leRSLVp8
>>83
ありがとうございます。
A、Bについては書いた人じゃないとわからない意図があるんですね。
0085デフォルトの名無しさん2016/09/25(日) 09:52:27.12ID:c4zbHkgZ
>>82
http://hirama.jp/pc/langcomp/while.html

にはwhile wendに関してこう書かれている

>古い BASIC との互換性を保つための書式で、あまり複雑な制御は出来ません。


実際、Do Loop はwhile wend の完全上位互換なんだから
宗教の戒律とか、父の遺言とか、キーボードの
0086デフォルトの名無しさん2016/09/25(日) 09:56:46.52ID:c4zbHkgZ
しまった
ダブルクォーテーション使ったらうまく投稿できないんだっけか…orz
オチが消えちゃったのでそこだけ再投稿

実際、Do Loop はwhile wend の完全上位互換なんだから
宗教の戒律とか、父の遺言とか、キーボードの 「o」が壊れてるとか、
そういう個人的な理由がない限り while wend を使う必要なんてまったくない

って書いてたんよ(元の書き込みでは「」部分がダブルクォーテーションだった)
0087デフォルトの名無しさん2016/09/25(日) 10:05:00.40ID:X1jQqxRe
VBAって負の遺産多いよね。
0088デフォルトの名無しさん2016/09/25(日) 11:06:53.40ID:5fN6GCqb
関数の戻り値にreturn文じゃなくて
関数名 = 値 って書くの最初は違和感あったけど、
今ではコピーが代入されるという挙動がはっきりしてていいと思うようになってきた。
0089デフォルトの名無しさん2016/09/25(日) 11:22:45.88ID:leRSLVp8
>>85
>>86
ありがとうございます。

ネットで見てみると、Do〜Loop派の方が多いってのも納得がいきました。
古い記法なんですね。

プログラミングっぽいプログラミングは初めてやっているのですが、
何かこう感覚と違うなぁ・・ってのがあってまだ戸惑っております。

Do while A Or Bと、Do while A And Bってのもどうも感覚と逆ですし、
(Or→どっちか満たせば、ループ終了、And→両方満たせば、ループ終了というのが感覚です)

また何かありましたらよろしくお願いします。
0090デフォルトの名無しさん2016/09/25(日) 11:28:39.21ID:5fN6GCqb
>>89
「while」だから終了条件を表してるんじゃなくて継続条件を表している
0091デフォルトの名無しさん2016/09/25(日) 11:38:35.42ID:LockcY+F
>>88
returnは「Aレジスタへの書き込み」で、関数名 = 値は「指定アドレスへの書き込み」っていう違いがあるんじゃねぇかな。
0092デフォルトの名無しさん2016/09/25(日) 11:39:52.71ID:kOqmTZW8
>>89
[条件]を終了条件にしたいなら
Do While [条件] 〜 Loop を
Do Until [条件] 〜 Loop にすればいい
0093デフォルトの名無しさん2016/09/25(日) 11:57:38.20ID:5fN6GCqb
>>91
Function funcA() As Variant
  ・・・
  FuncA = 計算結果
End Function

  ・・・
v = funcA()

としたとき指定アドレスはvの位置になるね。

代入式は
FuncA =
v =
の2か所あるけど、その両方でコピー動作が発生するわけじゃない。
0094デフォルトの名無しさん2016/09/25(日) 14:25:13.29ID:X1jQqxRe
>>91
Aレジスタって何?
アキュムレーターなら知ってるけど。
0095デフォルトの名無しさん2016/09/25(日) 14:45:43.68ID:LockcY+F
>>94
正確にいつのCPUからアキュムレータが無くなったのかは知らないけど、
今はメインで使うレジスタに対する俗称に過ぎないから、
あたかもアキュムレータがあるかのように語るとまた別のところから突っ込みが入る。

そしてC言語はx86ではAL・AH・AX・EAX・RAXに関数の戻り値を入れる・・・はず。
0096デフォルトの名無しさん2016/09/25(日) 17:37:39.59ID:Nz1Dz/yc
Cはスタックに入れる。

っていうかおまえらがマシン語と思っているモノはインタプリタ動作しているんだけどな。
0097デフォルトの名無しさん2016/09/25(日) 17:57:07.26ID:X1jQqxRe
そもそも関数の戻り値でレジスタに値設定してたら全然足りない気がするんだが。

まぁ普通に考えたら値型はスタックに格納してそれを使うだろうし、
参照型ならスタックに参照アドレスを格納してそれを返す気がするよな。
0098デフォルトの名無しさん2016/09/25(日) 18:23:32.33ID:LockcY+F
呼び出し規約ってそんなコロコロ変わるもんかなと思って調べたら、
とりあえずC++では
https://msdn.microsoft.com/ja-jp/library/7572ztz4.aspx
にあるようにRAXレジスタ(128bitはXMM0)で返す事になってるみたいだが。
0099デフォルトの名無しさん2016/09/25(日) 18:45:36.70ID:5fN6GCqb
みんな環境依存の話に興味あるんだろうか・・・
0100デフォルトの名無しさん2016/09/25(日) 20:48:41.03ID:w1FIqJRk
初歩的な質問ですみませんが
if で -100 から 100 以外の数字を判定したい場合はどう書けばいいのでしょうか?

101 や -100.01がTrue になるようにしたいのですが。 よろしくお願いいたします。
0101デフォルトの名無しさん2016/09/25(日) 21:02:09.32ID:LockcY+F
>>100
abs(x) > 100
0102デフォルトの名無しさん2016/09/25(日) 21:04:37.09ID:JBbCgXB6
>>101
ありがとうございます。
2つの数字は変動して同じではない場合もあるのですが、、
-5 to 90000 意外などです。
0103デフォルトの名無しさん2016/09/25(日) 21:42:26.57ID:Jq/Gde1V
If (x < -100) Or (100 < x) Then
0104デフォルトの名無しさん2016/09/25(日) 21:45:35.23ID:JBbCgXB6
>>103
うひょこれはわかりませんでした。どうもありがとうございました!
>>101
重ねて高度な回答をありがとうございました。
0105デフォルトの名無しさん2016/09/25(日) 22:08:16.90ID:BbO+P/NY
>>100
if not (a >= -100 and a <= 100) then

end if
0106デフォルトの名無しさん2016/09/25(日) 22:46:49.49ID:NHBiFXSO
>>105
よく理解できましたありがとうございます。
0107デフォルトの名無しさん2016/09/25(日) 23:09:38.88ID:WsJwhBfK
>>105
個人的に不等号の向きは揃えたい
0108デフォルトの名無しさん2016/09/26(月) 00:06:37.58ID:dKQ8SjzD
レンジで指定するならifじゃなくてcaseのほうが綺麗だな
0109デフォルトの名無しさん2016/09/26(月) 19:35:17.11ID:BSCtXQVr
if OutOfMinus100Kara100(a) then
end if
だろ
0110デフォルトの名無しさん2016/09/26(月) 20:08:36.76ID:Yfirxt2q
区切りは固定じゃないと書いてあるだろ

If XyoriookiikaYyorichiisai(a, -100, 100) Then

にしないと
0111デフォルトの名無しさん2016/09/26(月) 20:19:06.75ID:LsiBG9tt
Shell関数でTera Termマクロ実行プログラムを起動した直後に、Win32のSleep関数を
動かすとなぜかTera Termマクロまで固まってしまう。。

Shellだから非同期でTera Termマクロを実行してくれると期待してたんだけど。。
誰かなぜだかわかる?
0112デフォルトの名無しさん2016/09/26(月) 21:21:02.62ID:BSCtXQVr
あーハイハイTera Termマクロね最近良く聞くよね
俺も丁度勉強しようと思ってたとこなんだけど忙しくてなかなか手をだせないんだよなぁ
0113デフォルトの名無しさん2016/09/27(火) 01:07:11.61ID:5qoNk6hy
WTERMマクロなら自由自在なんだけど。
0114デフォルトの名無しさん2016/09/27(火) 01:57:03.60ID:MbOb5QGW
マクロはVBAに限らない
0115デフォルトの名無しさん2016/09/27(火) 16:02:33.94ID:XN1tBgzC
すまん。Rangeでセル指定するより、Cellsで指定した方が処理速度が早いと、言われたんだけど、マジですか?。
0116デフォルトの名無しさん2016/09/27(火) 16:55:17.51ID:R4UIFVe0
初耳だけど本当だとしたら、文字列の処理の分かな?
0117デフォルトの名無しさん2016/09/27(火) 17:09:08.59ID:HdmVWQSH
ループ処理の時に
Cells(i , j)で変数を操作すれば良いだけだから
もっぱらCells形式でやってる。
0118デフォルトの名無しさん2016/09/27(火) 17:10:34.51ID:dL5JNQU6
オフィス田中にも、そのように書いてありますね。
01191172016/09/27(火) 18:19:29.52ID:HdmVWQSH
処理速度のことについては…判らん
117で書いたのはあくまでもコーディングがその方が楽だからってことで。
0120デフォルトの名無しさん2016/09/27(火) 18:59:52.69ID:bFdF3zA0
>>115
計測してみればいいんじゃね?
0121デフォルトの名無しさん2016/09/27(火) 19:57:55.17ID:xyD+O9Id
Range("A1")という指定は内部でCells(1,1)を呼び出してるから、
その分だけ遅くなるっていう理屈だった気がする。

処理速度を気にするなら配列に入れてから処理した方がいいけどね。
0122デフォルトの名無しさん2016/09/27(火) 20:16:58.37ID:XN1tBgzC
嫁が通ったお試しVBA講習の先生が言い切ってたみたい。

Rangeなんて、使っちゃダメ。おそいよ!!って
0123デフォルトの名無しさん2016/09/27(火) 20:21:26.97ID:5qoNk6hy
領域をまとめて操作するならRangeの方が速くね?
1セルだけ操作するならCellsの方が速いだろうけど。
0124デフォルトの名無しさん2016/09/27(火) 20:22:01.78ID:QqTEjS1x
rangeがcellsより相対的に遅いのは事実だけどお前のプログラムが遅いのは断じてrangeのせいではない
0125デフォルトの名無しさん2016/09/27(火) 22:20:48.40ID:HdmVWQSH
質問です。マクロを10本程度書いて動かしているんだけど(自分の家でね)、
VBAである単語(自分で作った変数)が使われているブックをリストアップというか、
探し出したい。こういう時っていちちブックを開いて確認していかないとダメなのかな?

何かブック間で使われている変数の検索手立てってあります?テキストエディタでいう
ところのgrepみたいなものを想定しているんだけど。
0126デフォルトの名無しさん2016/09/27(火) 22:34:42.15ID:xyD+O9Id
>>125
セキュリティセンターから「VBAプロジェクトオブジェクトモデルへのアクセスを信頼する」にチェック入れておくと

Sub test()
Debug.Print ThisWorkbook.VBProject.VBComponents("Module1").CodeModule.Lines(1, 3)
End Sub

という形で自身を吐き出す事が出来るんで、これ応用してみるとか。
0127デフォルトの名無しさん2016/09/27(火) 23:07:30.64ID:HdmVWQSH
>>126
何やら難しそうな…w それ、調べてみます。ありがとう
0128デフォルトの名無しさん2016/09/28(水) 18:33:14.02ID:1e7C4OQD
エクスポートしてバージョン管理システムにでもほりこんどけ
0129デフォルトの名無しさん2016/09/28(水) 19:48:00.35ID:CMcQfU1+
先駆者たちよ。

30万レコードのExcelから、●●を含むレコードを検索し、それに絡むレコード情報をひっぱり、別シートに一覧を作りたいとする。

一般的にはループでいく?。FindNextでいく?。
0130デフォルトの名無しさん2016/09/28(水) 20:01:58.91ID:hvsJw4m/
SQKがいいんじゃないかなあ。
それか配列でFor
0131デフォルトの名無しさん2016/09/28(水) 20:02:50.22ID:hvsJw4m/
× SQK
○ SQL
0132デフォルトの名無しさん2016/09/28(水) 20:10:59.37ID:QXsV9Lll
形式整えてAccessにインポートしてクエリ作ってクエリをエクスポートが労力も技術も時間も少なくて済む。
0133デフォルトの名無しさん2016/09/28(水) 20:19:41.30ID:CMcQfU1+
アクセスないんよ。。。SQLかあ。勉強してみるかな。
0134デフォルトの名無しさん2016/09/28(水) 20:24:50.19ID:CZRqgB7Z
>>133
フリーのRDBいくらでもあるよ。SQLServerExpressでも良いだろうし。

>>128
そういう手もあるんですな。考えてみます。
0135デフォルトの名無しさん2016/09/28(水) 20:55:21.98ID:tSS67kgd
>>129
adoでシートにsqlで検索
まーらくちん
0136デフォルトの名無しさん2016/09/28(水) 21:46:26.40ID:2vtat6Yb
>>135
adoでエクセル接続すると最初の何行かにもとづいて列のデータ型が自動判定される
その場合、たとえば数値と判定されたあと文字列が出現すると恐ろしいことにエラーも出ずにnullになる
adoでエクセル接続するのはやってはいけない禁忌
一度csvにしてschema.iniという定義ファイル用意したうえでado接続するか、db使うべき
0137デフォルトの名無しさん2016/09/28(水) 21:54:39.73ID:QXsV9Lll
予めテーブル作ってインサートする方法もダメなのかな?
0138デフォルトの名無しさん2016/09/28(水) 22:02:18.68ID:mx6jwlpp
>>136
バカとハサミは使いようなのさ。
0139デフォルトの名無しさん2016/09/28(水) 22:06:22.01ID:iRhzKGOO
>>136
列ごとに表示形式を指定しておいた方がいいね
0140デフォルトの名無しさん2016/09/28(水) 22:18:00.03ID:1e7C4OQD
30万レコードの時点でEXCELで扱うのやめるけどな、俺なら
EXCELシートにADOで接続して、パフォーマンスどんなもんなん?
0141デフォルトの名無しさん2016/09/28(水) 22:18:15.69ID:qqEtXyLk
>>139
表示形式関係なし
回避方法も存在しない
https://support.microsoft.com/ja-jp/kb/278973

dao使っても同じ
https://support.microsoft.com/ja-jp/kb/194124

accessにインポートするのはウィザードでデータ型指定できるから問題ない
0142デフォルトの名無しさん2016/09/28(水) 22:20:37.90ID:iRhzKGOO
>>141
そうなんだ。。。
自分は直ODBCで読み込んで、表示形式で結果が変わったのを確認した。
0143デフォルトの名無しさん2016/09/28(水) 22:22:00.69ID:/IYvXq3l
オートフィルタ一発で済むようなもんにお前ら大袈裟すぎw
0144デフォルトの名無しさん2016/09/28(水) 22:25:46.25ID:mx6jwlpp
>>140
検索加工結合といった観点なら良い。
rdbmsを常用してるやつなら分かると思う。
コード構造がスッキリするぞ。
0145デフォルトの名無しさん2016/09/28(水) 22:27:01.71ID:mx6jwlpp
>>143
加工結合の観点が抜けてる。
0146デフォルトの名無しさん2016/09/28(水) 22:31:49.98ID:/IYvXq3l
>>145
加工結合てなんだよw意味不明なオレオレ用語使って自己満足の言い訳すんなガキw
0147デフォルトの名無しさん2016/09/28(水) 22:33:09.02ID:mx6jwlpp
ちなみにselect可能な列は255までな。
0148デフォルトの名無しさん2016/09/28(水) 22:40:20.14ID:mx6jwlpp
>>146
加工は演算やデータ整形。
結合はsqlでいうjoinに対応する。

select
cotnt(レス)
from
ID:/IYvXq3l
join 当
0149デフォルトの名無しさん2016/09/28(水) 22:42:03.95ID:mx6jwlpp
>>146
加工は演算やデータ整形。
結合はsqlでいうjoinに対応する。

select
cotnt(レス)
from
ID:/IYvXq3l
join 他スレ
当すれid=他スレid

結果
バカ発見w
0150デフォルトの名無しさん2016/09/28(水) 22:47:45.79ID:/IYvXq3l
>>149
お前なあ…
悔しいのは分かるけどいくら2chだからって無能ばかりじゃないんだぜ
僕勉強しました!って自慢したかったら素直に自分の身の回りだけにしよけよ
0151デフォルトの名無しさん2016/09/28(水) 22:58:21.57ID:HiV0V+GF
>>150
それからさっきの説明適当だから。
なのに勉強とかw
0152デフォルトの名無しさん2016/09/28(水) 23:05:02.92ID:cf+GMFaQ
俺も30万件ならSQKしかないと思う。
0153デフォルトの名無しさん2016/09/28(水) 23:10:03.34ID:hvsJw4m/
>>152
バカ、秘密だ!
0154デフォルトの名無しさん2016/09/29(木) 00:05:16.80ID:+rOx+d2B
>>140
Excelから、作画された図面とデータを連動性させたいのよ。
できるだけ、一つのbookのみで完結したくてね。
0155デフォルトの名無しさん2016/09/29(木) 00:06:28.20ID:+rOx+d2B
>>154
まちがえた。Excelで作画された図面
0156デフォルトの名無しさん2016/09/29(木) 07:01:30.72ID:eVR1TIX2
>>141
EXCELのセルで指定された型で不十分というのなら
SQLで指定すればいいじゃない
0157デフォルトの名無しさん2016/09/29(木) 08:15:46.82ID:DwfUORMd
>>150
ID:/IYvXq3l
バカ晒して
いいようにあしらわれて
なんか可哀想
0158デフォルトの名無しさん2016/09/29(木) 12:28:44.84ID:gYTv7Thy
>>157
その意味不明な態度はお前にとってどんなメリットがあるんだよ
お前のレスからはまるで合理性が感じられんよ
0159デフォルトの名無しさん2016/09/29(木) 20:25:01.42ID:swUsBbZp
弱い者達が夕暮れ
更に弱い者を叩く〜♪
0160デフォルトの名無しさん2016/09/29(木) 21:26:50.88ID:33/rSwr+
>>154
自BookのデータもSQLで抜き取れる
0161デフォルトの名無しさん2016/09/29(木) 22:05:13.96ID:O16LdL8v
>>159
オイwなんで俺が更に弱い者みたいな扱いなんだよw
0162デフォルトの名無しさん2016/09/29(木) 22:56:20.42ID:DwfUORMd
>>154
図形に連動するデータが
わからん。
どんな利用シーン?
0163デフォルトの名無しさん2016/09/29(木) 23:07:39.92ID:jpqqcMKL
>>162
まあ、系統図的なものだけど、図形の名前にID振って、それとデータを連動させる。

ユーザーが図形を洗濯したら、IDをもとに多種多様な形式でデータを閲覧者させるのよ。
0164デフォルトの名無しさん2016/09/29(木) 23:32:40.31ID:DwfUORMd
>>163
面白い
ありがと
0165デフォルトの名無しさん2016/09/29(木) 23:40:30.83ID:ko3apcYK
win10に変えて久しぶりにIEでオートメーションしようと思ったら動かないな
0166デフォルトの名無しさん2016/09/29(木) 23:42:29.52ID:+rOx+d2B
>>164
予測変換で日本語おかしくなってるけど、通じてくれてると助かる
0167デフォルトの名無しさん2016/10/01(土) 00:38:54.87ID:bCxX8rsY
>>165
IEだと思ってたのが、実はEdgeだったとか?
0168デフォルトの名無しさん2016/10/01(土) 14:26:13.29ID:YuIsEcyK
ほかのブックからRunを使うと処理が重くなることってありますか?
0169デフォルトの名無しさん2016/10/02(日) 02:24:09.42ID:P5/c+F9i
こんばんは、皆様には前回大変お世話になったものです。
現在Excel上のvbaからsqlを使用し、
accessの2つのテーブルをリレーションさせデータを取得するツールを作成しております。

そこで1点質問がございます。
このリレーションを記述する方法が
普段のリレーションとは異なりよい方法が
思い浮かばず苦戦しております。

「ある条件」とは
Aのテーブルのある項目で「〇〇」というデータ
Bのテーブルのある項目で「コード番号〇〇」というデータがあります。
この〇〇同士でリレーションさせるというものなのですが、普段使うリレーションの
記載方法では出来ません。
何かリレーションもしくは他に良い方法ご
無いものでしょうか?

長文大変失礼致しました。
不明な点あればぜひ聞かれてください。
0170デフォルトの名無しさん2016/10/02(日) 02:32:06.76ID:z9CrEV1E
>>169
whereでlike演算子で曖昧検索
0171デフォルトの名無しさん2016/10/02(日) 02:57:38.30ID:P5/c+F9i
>>170様回答ありがとうございます。
私もlike演算子が使えるのではないかと
思ったのですが、抽出するデータは
〇〇とコード番号〇〇で一致するものだけでなく、△△とコード番号△△の場合と
複数のパターンが考えられるため、like演算子を使用する場合だと複数の条件はどうすればよいかと
悩んで降ります。
0172デフォルトの名無しさん2016/10/02(日) 06:24:49.17ID:jCbeZdLq
or
0173デフォルトの名無しさん2016/10/02(日) 08:03:13.16ID:tQSn6Er/
キーワードでLikeじゃなくて、
フィールド名でLike。
0174デフォルトの名無しさん2016/10/02(日) 08:07:01.06ID:z9CrEV1E
>>171
以下すべてsql
案1
文字結合like演算子
Bコード like `%`|| Aコード

案2
文字結合 
Bコード = `コード番号`||Aコード

案3
文字置換
Aコード = replace(Bコード,`コード番号`) 

案4
案3の正規表現
0175デフォルトの名無しさん2016/10/02(日) 10:56:16.21ID:Z7pSw8C+
形式を揃えるクエリか、形式別に突合するクエリを作ってUNIONでまとめる。
0176デフォルトの名無しさん2016/10/02(日) 11:05:53.28ID:Dc4CSNN9
SQLで実現しなきゃイヤなの?
取り込んだ後に汎用アルゴリズムで処理した方がいいような・・・
0177デフォルトの名無しさん2016/10/02(日) 11:39:30.68ID:I2UZY42b
>>176
処理する件数によるけど

> 取り込んだ後に汎用アルゴリズムで処理した方がいいような・・・

はないわ
0178デフォルトの名無しさん2016/10/02(日) 12:31:28.73ID:563QImfr
>>177
なぜ?
汎用アルゴリズムのライブラリの手持ちがあればって条件付きにはなるけど、
SQLよりはいいでしよ。
0179デフォルトの名無しさん2016/10/02(日) 12:51:43.12ID:SqpbWqXm
どんな方法だってケースバイケース、一長一短なのに、詳しい条件もわからないのに一方的に否定する頭の固いやつとは仕事したくない
0180デフォルトの名無しさん2016/10/02(日) 12:59:32.73ID:563QImfr
>>177が最初に断定的に書いてると思う。
>>176は全然断定的ではないよね?
0181デフォルトの名無しさん2016/10/02(日) 13:02:03.58ID:Z7pSw8C+
とりあえずブレインストーミング的に、どんなに非効率だろうが複雑だろうが、
問題の解決策になり得る手段を提示すべき。

否定やらなんやらでゴチャゴチャやるのは質問が終わってからにしろ。
0182デフォルトの名無しさん2016/10/02(日) 13:02:17.48ID:HEAFBxCU
sqlでできるならなるべくsqlでやったほうがいいっていうのすら知らない奴がいるとは
0183デフォルトの名無しさん2016/10/02(日) 13:03:29.88ID:I2UZY42b
>>178
SQL の処理系書いた奴より優秀だ
って言うなら止めないけど
そんな奴が >>169 みたいな質問すると思う?
0184デフォルトの名無しさん2016/10/02(日) 13:16:03.97ID:563QImfr
>>181
それはそうなので済まないんだけど、自分も質問したいんだよね。
なんでSQLがいいのか。
0185デフォルトの名無しさん2016/10/02(日) 13:26:09.05ID:Z7pSw8C+
>>184
Accessに取り込んだデータなら、SQLで解決するのが生産性も保守性も高い。

あと「汎用アルゴリズム」っていうアルゴリズムがあるわけではなく、
適用可能なケースが多ければ「汎用」と呼ぶだけなんで「汎用アルゴリズムによる解決」は漠然としすぎ。
0186デフォルトの名無しさん2016/10/02(日) 13:26:11.81ID:LuSEImMd
sqlでinstr見たいな関数使えるんじゃね?
0187デフォルトの名無しさん2016/10/02(日) 13:27:23.28ID:LuSEImMd
>>184
sqlの処理系より正確で早い処理をかけるかどうかじゃねーの?
0188デフォルトの名無しさん2016/10/02(日) 14:15:36.65ID:z9CrEV1E
>>176
汎用アルゴリズムとは
一体どんなものを指してるのか?
0189デフォルトの名無しさん2016/10/02(日) 14:19:44.31ID:z9CrEV1E
>>184
今回の件なら結合があるから
vbaでやるより良手。
vbaからループが無くなる。
0190デフォルトの名無しさん2016/10/02(日) 14:21:31.32ID:z9CrEV1E
>>1
その汎用ライブラリに入ってるよ。
0191デフォルトの名無しさん2016/10/02(日) 14:41:31.89ID:563QImfr
>>188
サーチ、ソート、マッピング、フィルタリング等のいわゆるアルゴリズム。
有名どころから自作までいろいろ選択できる前提で語ってました。
0192デフォルトの名無しさん2016/10/02(日) 14:51:11.37ID:z9CrEV1E
>>191
サーチ select
ソート order by
マッピング join
フィルタリング where

上記4つを同時に実現できるのはメリット
でsqlの存在意義だと思う。
0193デフォルトの名無しさん2016/10/02(日) 15:25:08.98ID:563QImfr
>>192
なるほど。

ただ>>169氏の質問をみたとき、マスター系のテーブルだろうなあ、と思った。
その内容をいろんな角度から参照するため複数回クエリーするんだろうなあ、と。
自分はそういう場合、必要な範囲全件読んでオブジェクトの列としてメモリ上に持っとくパターンが多い。
そもそもの前提が>>169の状況にマッチしてないかもだから、言い過ぎたかも知れない。
0194デフォルトの名無しさん2016/10/02(日) 15:45:27.02ID:wePFQlkp
>>192
> サーチ select
> フィルタリング where

同じじゃね?
0195デフォルトの名無しさん2016/10/02(日) 15:51:17.15ID:wePFQlkp
>>193
お前は SQL って言うか DBMS について調べてから出直せよ
人に意見できるレベルじゃないぞ
0196デフォルトの名無しさん2016/10/02(日) 15:59:29.91ID:Z7pSw8C+
プログラムの勉強し始めだと知ったかぶりしたくなるのも仕方ない。
ただ質問スレみたいな初心者が来るところでやられると迷惑だからやめて欲しい。
0197デフォルトの名無しさん2016/10/02(日) 16:05:11.58ID:SROemhUJ
>普段使うリレーションの記載方法では出来ません。

>何かリレーションもしくは他に良い方法ご無いものでしょうか?
ってあるんだからデータベース板のアクセススレでどういうSQL書けば良いか
聞いてそれ実行すれば良いだろ?それはしたのか?>>168

それをした上でここで書いてんだったらSQLがどうのこうのって話をここで
しなくても済むだろ?まずデータベース板のアクセススレに行ってこいよ
0198デフォルトの名無しさん2016/10/02(日) 16:11:54.65ID:563QImfr
>>195
ちょっとわからない
>>193に間違えてる点あるなら教えてよ
0199デフォルトの名無しさん2016/10/02(日) 16:27:16.68ID:I2UZY42b
>>198
> その内容をいろんな角度から参照するため複数回クエリーするんだろうなあ、と。

勝手な思い込みで

> 自分はそういう場合、必要な範囲全件読んでオブジェクトの列としてメモリ上に持っとくパターンが多い。

みたいなオレオレ方式を開陳されても困るって話だろ
0200デフォルトの名無しさん2016/10/02(日) 16:56:10.12ID:563QImfr
>>199
確かに推測で語ったけどExcelのアプリだからね。
コマンド叩いて処理が完了したら終わるプログラムと違って、閉じるまではデータを抱えているわけだし。
このボタン押したらある処理をやり、別のボタン押したら他の処理をやる。そのとき使うマスターデータ群は一緒。
けっこう典型的だと思うんだが...
0201デフォルトの名無しさん2016/10/02(日) 18:24:54.65ID:I2UZY42b
>>200
要件ぐらい確認しろよ...

> accessの2つのテーブルをリレーションさせデータを取得するツールを作成しております。
0202デフォルトの名無しさん2016/10/02(日) 18:53:50.86ID:XrTAfFf6
>>201
まあまあ、実際にはACCESSで>>174の3番目辺りでクエリ組んでおけば済む話ではあるんだが
よく使う部分はEXCELでメモリに残しておいた方が効率いいんじゃないかって言いたいんだろうな。

答えだけ言って置くと、特に条件がない場合はそれはないな。
.NetではLinqというものがそれに該当するけど遅いので使用禁止になっているところも多い。
基本、こう言ったものは手続き型言語より集約型言語の方が得意分野で
INDEXも貼る事が出来るから当然検索も早く出来る可能性が高い。

ただ、使うデータがテーブルの極一部であることが決まっていて、
それを先に抽出しておけるなら、EXCELのシートとかに展開しておいてそれを使うのも有りと言えば有り。

つまり元々使用するデータを小さいビューに纏めて置くことが出来るのであれば、
以降態々大きなテーブルから検索しなくてもいいと言うこと。

ただ今回の要件にそれは含まれていないから考慮しないってだけ。
0203デフォルトの名無しさん2016/10/02(日) 18:58:02.14ID:kPn//wmb
おまえらさあ
エクセルスレで幼稚で間違ったDB論語ってないでデータベース板に行けば?
そしたら完膚無きまでに論破してやるから
0204デフォルトの名無しさん2016/10/02(日) 19:09:46.13ID:XrTAfFf6
そうか。まぁ頑張れよ。
0205デフォルトの名無しさん2016/10/02(日) 19:14:53.23ID:z9CrEV1E
>>203
興味ある
削除フラグを論じて下さい
そして記載が終わったら連絡下さい
0206デフォルトの名無しさん2016/10/02(日) 19:22:17.75ID:MrUKlr4W
>>202
ちんけな知識自慢要らんわ
0207デフォルトの名無しさん2016/10/02(日) 19:25:54.10ID:XrTAfFf6
まあまあ、俺のちんけな知識も
おまえのちんこよりは役に立ってるかもよ
0208デフォルトの名無しさん2016/10/02(日) 19:27:44.46ID:kPn//wmb
>>207
いやお前の知識はちんけというより全て間違っているぞw
0209デフォルトの名無しさん2016/10/02(日) 19:31:37.20ID:XrTAfFf6
そうか。まあ頑張れよ。
0210デフォルトの名無しさん2016/10/02(日) 19:50:06.95ID:N6X9aY0s
>>169 です。
皆様のご回答ありがとうございます。

四苦八苦しつつ今日も作成していましたが
やはり上手くいきませんでした…
0211デフォルトの名無しさん2016/10/02(日) 19:51:31.08ID:563QImfr
クエリーも大事だけどデータを使える形の集合にするのが結構手間かかるわけじゃん?
具体的には読み出した値をちまちまとProperty Set するとかコレクション構築するとかさ。
それはメモリ上に取って置いときたい。

要件確認してないって言われたのでそれは反省する。
0212デフォルトの名無しさん2016/10/02(日) 20:01:56.85ID:I2UZY42b
>>211
> 具体的には読み出した値をちまちまとProperty Set するとかコレクション構築するとかさ。

勝手な思い込みは要らん
って言われたはずだが?
0213デフォルトの名無しさん2016/10/02(日) 20:12:49.63ID:kPn//wmb
>>212
お前さあw
お前より>>211の方が遥かに高度が知識を持ってるんだから
そういうみっともない強がりはやめたら?
どうしてこのスレは意味もなく上に立ちたがるガキばっかなのかねえw
0214デフォルトの名無しさん2016/10/02(日) 20:17:30.72ID:/NJe37n/
>>212
ハア?質問者に対して反省してるんであってお前に対してじゃ寝ーよ馬鹿が。
だいたい何らかの仮定をおかないと回答できねえじゃねえか。
俺は俺の考える「ありそうなパターン」に応じて答えたんであってそれが当たってるかどうかは質問者が判断すればいいこと。
0215デフォルトの名無しさん2016/10/02(日) 20:21:32.00ID:SROemhUJ
>>210
だからデータベース板のアクセス板に逝けって言ってんだよクソボケ
0216デフォルトの名無しさん2016/10/02(日) 20:22:10.74ID:SROemhUJ
>>215
訂正
だからデータベース板のアクセススレに逝けって言ってんだよクソボケ
0217デフォルトの名無しさん2016/10/02(日) 20:26:57.73ID:XrTAfFf6
>>211
出力するときの加工とかにコレクションを使ったりするのは分かる。
けど、IEnumelableも備えていないVBAでプロパティ(しかもSetと言うことはインスタンス)を
加工やら何やらに使うほど大袈裟な作りにする必要ってあるんだろうか?
どんなことに使う想定?
0218デフォルトの名無しさん2016/10/02(日) 20:27:11.52ID:z9CrEV1E
>>210
では検証観点替えてみはどう?

データに微妙な違いがあるのでないかい?
例えば文頭文末の空白、全半角といった類い。
一つだけデータをシートで関数で
比較してみたら。

エディタに張り付けると空白が、可視化
できたるする。
0219デフォルトの名無しさん2016/10/02(日) 20:28:40.17ID:z9CrEV1E
>>213
完了予定日はいつ?
楽しみです。
0220デフォルトの名無しさん2016/10/02(日) 20:30:12.88ID:kPn//wmb
>>217
お前はバカなんだから黙ってろw
0221デフォルトの名無しさん2016/10/02(日) 20:31:22.98ID:kPn//wmb
>>219
ん?何だお前?
0222デフォルトの名無しさん2016/10/02(日) 20:32:14.62ID:XrTAfFf6
バカって言う奴がバカなんだよバーカバーカ
0223デフォルトの名無しさん2016/10/02(日) 20:32:45.08ID:z9CrEV1E
>>211
sql上手く行かないから
vbaでの検証方法を
アドバイスしてみたら?
0224デフォルトの名無しさん2016/10/02(日) 20:33:19.54ID:Z7pSw8C+
>>210
クエリ自体を理解できてないようだから、Accessで直接弄って試行錯誤してからの方がいいよ。
VBAで間接的に弄るとかは、両方に精通してからにしよう。
0225デフォルトの名無しさん2016/10/02(日) 20:33:56.46ID:z9CrEV1E
>>221
>>203
だよ
テーマは削除フラグ提案してます
0226デフォルトの名無しさん2016/10/02(日) 20:35:31.44ID:kPn//wmb
>>225
いやだから何?データベース行ったのお前?
0227デフォルトの名無しさん2016/10/02(日) 20:35:34.88ID:I2UZY42b
>>213
> 遥かに高度が知識を持ってる

日本語もまともに使えないのかよ w
あと高度かどうかなんて関係ないから

>>214
あさっての仮定置いてバカみたい

ってはっきり言った方がいい?
そもそもそう言うのは質問スレだと迷惑だって >>196 に言われてるだろ
0228デフォルトの名無しさん2016/10/02(日) 20:37:10.83ID:kPn//wmb
>>227
お前もバカなんだからもう黙っとけw
0229デフォルトの名無しさん2016/10/02(日) 20:42:02.74ID:z9CrEV1E
>>226
行ってる。

スレ
http://echo.2ch.net/test/read.cgi/db/1468932188/4
0230デフォルトの名無しさん2016/10/02(日) 20:46:00.04ID:kPn//wmb
>>229
なんでよりによってアクセススレなんだよwヘタレがw
0231デフォルトの名無しさん2016/10/02(日) 20:49:15.78ID:IZYoHPa0
ことの起点がACCESSなんだから当たり前だろうね。

あれ?
それともDBって基本的な考え方が一緒だから
ORACLEやSQLSERVERとかでもいいとか思っちゃってた?
0232デフォルトの名無しさん2016/10/02(日) 20:52:00.95ID:z9CrEV1E
>>230
後だしかよ。
データベース板しか言ってないだろ。
始めるにあたり必要な要件を挙げて。
小出しは面倒。
できる範囲でやるよ。
0233デフォルトの名無しさん2016/10/02(日) 20:55:26.40ID:kPn//wmb
>>232
いや後だしもクソもお前削除フラグについて語りたいんだろw
DB設計かなんかのスレじゃなかったっけ?前やってたの
もうとっくに飽きられてるけどなw
後はもうアクセススレでやれ俺も行くからw
0234デフォルトの名無しさん2016/10/02(日) 21:02:07.09ID:I2UZY42b
>>228
>>222
0235デフォルトの名無しさん2016/10/02(日) 21:02:12.00ID:z9CrEV1E
>>233
始めた
0236デフォルトの名無しさん2016/10/02(日) 21:12:24.81ID:XrTAfFf6
これで少しは静かになるかな。
そもそも今回の話題は最初からスレ違いだったしな。
0237デフォルトの名無しさん2016/10/02(日) 21:19:05.20ID:kPn//wmb
>>236
おいwなんでお前が締めてんだよw
お前もあっちに行けば>>202の間違いについて語るぞw
0238デフォルトの名無しさん2016/10/02(日) 21:27:36.25ID:XrTAfFf6
>>237
正直次の日月曜日で気分が滅入ってて
ぎゃーぎゃーやる気分じゃないんだ。
とりあえずそっちはそっちで答えてあげればいいんじゃない?
0239デフォルトの名無しさん2016/10/02(日) 21:30:50.09ID:kPn//wmb
>>238
だからその無意味な上から目線やめろw
それが全ての禍根だw
0240デフォルトの名無しさん2016/10/02(日) 21:35:25.37ID:XrTAfFf6
理解して貰おうとは思わない。
だが俺にとってちびまる子ちゃんと
サザエさんは天敵なのさ
0241デフォルトの名無しさん2016/10/02(日) 22:09:47.74ID:I2UZY42b
ぎゃーぎゃーやる気分じゃないなら中途半端な知識で絡んでこなきゃいいのに...
0242デフォルトの名無しさん2016/10/02(日) 22:31:36.82ID:jCbeZdLq
>>239
だからその無意味な上から目線やめろw
それが全ての禍根だw
0243デフォルトの名無しさん2016/10/02(日) 22:44:26.50ID:kPn//wmb
>>242
は?何で突然お前が絡んでくるんだよw面倒くせーよお前w
0244デフォルトの名無しさん2016/10/02(日) 23:39:20.35ID:XrTAfFf6
>>241
0245デフォルトの名無しさん2016/10/03(月) 00:59:59.02ID:bAB4hkMK
>>243
だからその無意味な上から目線やめろw
それが全ての禍根だw
0246デフォルトの名無しさん2016/10/03(月) 04:02:15.68ID:aqlWwy5x
2ちゃんなんだから言い方とかに絡むやつはうざいので、
気に入らないならそいつの主旨に反論するか、出来ないならスルーしとけ
0247デフォルトの名無しさん2016/10/03(月) 21:13:40.02ID:6aFrnC92
>>191
遅レスだが、

>有名どころから自作までいろいろ選択できる前提で語ってました。

汎用アルゴリズムのVBAライブラリの有名どころってどういうの?
そういうのあまり知らないけど仕事でも使えるんだろうか。
0248デフォルトの名無しさん2016/10/03(月) 22:00:45.51ID:JnCMPlAr
>>247
参照設定で使用可能になる
機能とか。
例えばソルバー、ADOとか
0249デフォルトの名無しさん2016/10/03(月) 23:54:13.74ID:aV2esLKe
以前にExcelでの30万レコードの処理を相談たものです。

アドバイス通り、配列やったら処理時間激減しました。

ありがとうです!!
0250デフォルトの名無しさん2016/10/04(火) 00:25:18.44ID:kYsgZgns
よかったじゃない
0251デフォルトの名無しさん2016/10/04(火) 14:03:43.51ID:2cOlNhmt
xllアドイン作れないかと思って調べても何の情報もなかった
0252デフォルトの名無しさん2016/10/04(火) 18:05:04.97ID:3QsqaDAi
>>251
https://www.wareko.jp/wordpress/?p=17508
にある洋書
0253デフォルトの名無しさん2016/10/04(火) 19:44:03.88ID:fCtFz61+
W
0254デフォルトの名無しさん2016/10/04(火) 19:46:40.53ID:fCtFz61+
Withってつかいにくくないですか?
職場で使っている人がいるけど
ドットで始まる行のコードはその前にあるべきWithを探さねばならないし
いちいち頭でそれを補ってコードを解釈しないとならない。

他言語ではこういうWithがあるものってマレだよね?
0255デフォルトの名無しさん2016/10/04(火) 19:58:46.49ID:4cFMscS1
うん
0256デフォルトの名無しさん2016/10/04(火) 20:03:01.19ID:luzzRI32
JavaScriptにもあるな。
まぁVBAはローカル変数がない代わりみたいなもんだろ。
With Newの使い勝手の良さは異常。
0257デフォルトの名無しさん2016/10/04(火) 20:38:22.16ID:g1jJRFKk
ドットを付け忘れてアレレっ??ってなったことはあるけどなw。だからと言って使いにくいとは思わん。
他の言語でもあればいいのにって思うわ(知らんけど)
0258デフォルトの名無しさん2016/10/04(火) 20:38:58.89ID:2AWlMUg/
>>254
With を探さないといけないぐらい広範囲に使うのは見辛いわな
ただ普通はインデントしてるだろうし 20行程度ならそんなに苦じゃないと思うが
0259デフォルトの名無しさん2016/10/04(火) 20:58:50.57ID:pK2NF8fu
>>254
例えばセル範囲を指定するとき
同じブックの同じシートにあるセルを参照するとして
ブックとシートでWith切っておくと逆に見易くなる例もある。
インスタンスの入った変数でさえ記述すると見辛くなるときに使うかなぁ。

もっともその辺は部品化しとけばもっと簡潔に纏ったりするけどね。
0260デフォルトの名無しさん2016/10/04(火) 21:06:20.03ID:kYsgZgns
>>256
ローカル変数?
0261デフォルトの名無しさん2016/10/04(火) 21:08:05.39ID:luzzRI32
「コードの見やすさ」ってインデント使わないとか大量のグローバル変数が様々な関数から共有化とかの非常識なものでない限り、
如何にその言語に習熟しているかで決まるから、見やすい見にくいはあんまり気にしても仕方ないんじゃないかな。
0262デフォルトの名無しさん2016/10/04(火) 21:15:15.58ID:kLakclq7
他人が見る可能性があるんなら適切に関数に分けておけばいいんだよ
あとはコメントで補完
0263デフォルトの名無しさん2016/10/04(火) 21:23:12.88ID:pK2NF8fu
コメントは出来るだけ何をやっているかは書かないように変数名やメソッド名、プロパティ名で頑張ってる。

何の為にやってるかだけ書こうと努力はしてるけど
中々難しい。
0264デフォルトの名無しさん2016/10/04(火) 21:34:42.19ID:ixQnj8Kq
>>263
> 何の為にやってるかだけ書こうと努力はしてるけど
こういうのが良いコメントの例として言葉だけ一人歩きしてるけど
本来このコメントは主に速度の為に難解なコードを書かざるを得ない時だけ必要なものだからな
全体を通して目的をコメントしなきゃいけないようなプログラムなんか1から作りなおした方がいい

コメントなんか将来の自分宛てのメモみたいに適当に書いときゃいいんだよ
それが他人にとっても一番役に立つ
0265デフォルトの名無しさん2016/10/04(火) 21:52:12.34ID:luzzRI32
全体を把握した状態である事を考慮せずコメントを書いてしまっていて、後から見直すと意味が通じず、
結局コードの流れを地道に追うことになるんですね分かります。
0266デフォルトの名無しさん2016/10/04(火) 22:00:15.60ID:pK2NF8fu
>>264
考え方の違いだね。
そもそもトリッキーな作りはなるべく避けるし、
慣れてる人なら分かると思うけど、
何をやってるかはコード見れば大体分かる。
見て大体分かるようなコードで無ければむしろ
リファクタリングの対象になり得ると思うし、
ましてやVBAは比較的規模が小さいから
何をやっているかより何でやっているかの方が
自分的には役に立つことが多いなぁ。

特に業務絡みだとコードレベルの細かいことになると
何でそうしてるのか
書いてあると凄く助かることがある。

大体これを書かない人は詳細設計レベルでも何の為にやってるのか書かないことが多い。
0267デフォルトの名無しさん2016/10/04(火) 22:07:37.24ID:ixQnj8Kq
>>266
お前自分で何を言ってるか分かってるか
規模が小さいのに目的が分からないコードを書いているのかお前は?そうじゃないだろ?

ただ反論したいが為に無理矢理レスするからそうなる
もう少し素直に人の話を聞けよ
0268デフォルトの名無しさん2016/10/04(火) 22:11:58.40ID:kYsgZgns
俺がたまにやる黙示録コメント

 〜
 肝心な一行  ' ← ここ
 〜
0269デフォルトの名無しさん2016/10/04(火) 22:13:19.60ID:9J4Qs306
'AとBが同じ場合
If a = b Then

'カウントアップ
a = a +1

'それ以外の場合
Else

'カウンターを初期値に戻す
a = 0

End If

みたいに書いてるわwwww
0270デフォルトの名無しさん2016/10/04(火) 22:16:07.63ID:9J4Qs306
>>268
他人が書いたコメントで、

'ググったら、これをやると早くなるらしい
Application.ScreenUpdating = False

ってのを見たことある。
0271デフォルトの名無しさん2016/10/04(火) 22:17:49.66ID:pK2NF8fu
>>267
自分の作ったものならいいよ?
人の作ったものだとそれがないと有識者に聞きに行くことになったりするし
教えてくれる有識者がいなければ目も当てられないよ。

何をやっているかなんて実際きちんと単一責任の原則に則って作っていれば
せいぜい多くて1メソッド100行も行けばいいとこ。
ヘッダコメントで何やってるかとI/O書いておけば大体事足りる。

逆 に聞くけど、いつも1メソッドどんな単位で書いてるの?
0272デフォルトの名無しさん2016/10/04(火) 22:19:43.98ID:kYsgZgns
実際のところモジュールの先頭に関数一覧の形でコメントをいれて、
個々の実装箇所にはほんの少ししか書かないことが多いな。
0273デフォルトの名無しさん2016/10/04(火) 22:29:13.80ID:ixQnj8Kq
>>271
1メソッド100行も書いてるから目的すら見失うんだよ
本当に単一責任原則てのが分かってれば最大でも50行を越えるような事はない平均なら十数行だ
自分の未熟さを思いしって謙虚になれよ
0274デフォルトの名無しさん2016/10/04(火) 22:29:34.48ID:luzzRI32
モジュール名を目的、関数名をやってる事にすれば分かりやすいんだけど、
いまいち一言で表せる文言がないと長文化してしまうのが難点。

Module:ファイルパス取得
Sub:検索開始するフォルダパスの設定(ファイルパスも可 As String)
Sub:先頭のフォルダパスをPOPしてフォルダとファイルの探索
Function:探索続行可能の有無 As Boolean
Function:取得したパスの返却 As Variant()

みたいな感じで。
0275デフォルトの名無しさん2016/10/04(火) 22:38:49.24ID:pK2NF8fu
>>273
バカでしょ。
もっと短くなると言うなら尚更そうじゃない。

なんか文句言いたいだけっぽいね。
役割によっては1行2行のメソッドも出来るし、
極稀に100行近くになることもある。

50行程度ならもっとヘッダコメントも分かれるから
尚更解読するのは楽だろうに。

で、メソッド何単位で作ってるの?
0276デフォルトの名無しさん2016/10/04(火) 22:49:11.25ID:ixQnj8Kq
>>275
文句言いたいのだけなのはお前だわw
もう俺にレスする目的すら見失ってるだろお前
0277デフォルトの名無しさん2016/10/04(火) 22:53:52.00ID:pK2NF8fu
>>276
で?
>>275に対して反論はないの?
メソッドは何単位で組んでるのかの回答もまだなんだけど。
0278デフォルトの名無しさん2016/10/04(火) 23:00:36.62ID:ixQnj8Kq
>>277
お前は自分で目的すら分からないコードを書いてるのか?
まずはこっちに答えるのが先だろ都合のいい奴だな
何でも親切に人が付き合ってくれると思うなよ
0279デフォルトの名無しさん2016/10/04(火) 23:04:21.77ID:kYsgZgns
>>264
>本来このコメントは主に速度の為に難解なコードを書かざるを得ない時だけ必要なものだ
   ↑
これが間違っていると思う。
なぜそう断じた?
0280デフォルトの名無しさん2016/10/04(火) 23:05:18.79ID:ixQnj8Kq
>>279
次の行も読めよ
0281デフォルトの名無しさん2016/10/04(火) 23:06:00.09ID:pK2NF8fu
>>278
文盲か?
それに対しては>>271でとっくに回答している。
自分の作ったものなら自分で作ってるんだから
分からない訳ないだろう。

>>277への回答は?
0282デフォルトの名無しさん2016/10/04(火) 23:08:53.20ID:ixQnj8Kq
>>281
他人が書いたものが分からないのは何をしているか
よく考えろ何が目的なのか分からないようなプログラムをいじろうと思うかお前?
0283デフォルトの名無しさん2016/10/04(火) 23:09:34.52ID:laeEfM5k
「明日の自分は他人」

自分で作った物ならわかってて当然、なんてのは経験の浅い若造の幻想だ
0284デフォルトの名無しさん2016/10/04(火) 23:12:50.62ID:kYsgZgns
>>280
>全体を通して目的をコメントしなきゃいけないようなプログラムなんか1から作りなおした方がいい
の行のことか?

Aの前にBをやっているのはなぜ? → それはAの事前条件である〜を満たすため


こういったコードの意図・目的はコメントじゃないと表現しにくい
0285デフォルトの名無しさん2016/10/04(火) 23:13:47.55ID:ixQnj8Kq
>>284
それは仕様と言ってコード内で表明する物ではない
0286デフォルトの名無しさん2016/10/04(火) 23:16:54.92ID:pK2NF8fu
>>282
本当に頭大丈夫か?
それが分からないと下手に弄れないから
何の為にやっているのかが重要だって言ってるんだろ?
いい加減話をはぐらかしていないで
>>277に答えてみろよ。見え見えなんだよ。
0287デフォルトの名無しさん2016/10/04(火) 23:19:13.30ID:pK2NF8fu
>>283
いや、何作ったか忘れることはあっても
今自分が何作ってるのか分からないのはヤバいよ
0288デフォルトの名無しさん2016/10/04(火) 23:20:47.41ID:kYsgZgns
>>285
関数Aの事前条件・事後条件そのものは仕様としてどっか別のところに書くかもしれないが、
>>284では関数Aを利用しているそれぞれの個所でコメントをつける場合のことを言っている。
目的を表現したコメントだ。
0289デフォルトの名無しさん2016/10/04(火) 23:23:00.13ID:ixQnj8Kq
>>286
いや下手に弄れないならコード見るなよ
せめて仕様が分かってから見てくれ
0290デフォルトの名無しさん2016/10/04(火) 23:23:39.39ID:50xH+Aa7
今朝何食べたかも思い出せない。
0291デフォルトの名無しさん2016/10/04(火) 23:28:33.52ID:vNhxY/wh
俺はいつも朝食は食べない主義
0292デフォルトの名無しさん2016/10/04(火) 23:30:38.04ID:ixQnj8Kq
>>288
それは目的を書いたコメントじゃないな
いいかもう一度言う

コードが難解にならざるを得ない時はやっている事とその目的がちょっと読んだだけでは一致しない

そういう時に必要なのが「何を目的にしているか?」というコメントだ
逆に言えばそういうコメントがコード全体に必要だというのなら
それは設計時点で混乱してコードが難解になっている証拠だ
設計からやりなおした方がいい

目的の表明が必要なのは一部の難解なコードだけ
それが全体に必要だと思ったら始めからやりなおせ
0293デフォルトの名無しさん2016/10/04(火) 23:30:59.37ID:pK2NF8fu
>>289
何だまだ逃げ回るつもりか?

コードレベルで何の為にやってるのか分からないことが出てくるなんてよくあることだぞ。
だからそう言ったところに説明のコメントがあれば
わざわざ調査したり
有識者に聞きに行かなくても良いという話だ。

お前、どうやら>>277に答えられないみたいだな。
よくそれで斜め上から目線で偉そうに能書き垂れられるもんだな。
0294デフォルトの名無しさん2016/10/04(火) 23:32:14.37ID:1OpjxEYO
おまえらは何と戦っているんだ
0295デフォルトの名無しさん2016/10/04(火) 23:34:38.58ID:ixQnj8Kq
>>293
ちょうど>>292に書いたとこだな
0296デフォルトの名無しさん2016/10/04(火) 23:36:07.19ID:luzzRI32
まぁでもモジュールならともかく関数で百行はちょっと行き過ぎだろうな。メソッドなら尚更。
それにコード見ても何やってるか分からないってくらい長大だったり複雑だったりするものはVBAには向かない。
0297デフォルトの名無しさん2016/10/04(火) 23:38:04.38ID:kYsgZgns
>>292
>それは目的を書いたコメントじゃないな

だったらあんたは「コードの目的」という言葉を誤解して一般とは違う意味に取っている。
0298デフォルトの名無しさん2016/10/04(火) 23:39:49.33ID:ixQnj8Kq
>>297
いやもう素直にごめんなさいしろよ
本当にお前らには素直さが足りん
0299デフォルトの名無しさん2016/10/04(火) 23:43:58.96ID:kYsgZgns
>>298
おいおい、

  ' 関数myFuncの事前条件を満たす
   〜その処理〜
   ・・・
   myFunc(引数)


上のコメントが目的を表すコメントじゃないってのかよ?ちょっと考え方おかしいぞ
0300デフォルトの名無しさん2016/10/04(火) 23:45:40.44ID:pK2NF8fu
>>295

275 名前:デフォルトの名無しさん [sage] :2016/10/04(火) 22:38:49.24 ID:pK2NF8fu
>>273
バカでしょ。
もっと短くなると言うなら尚更そうじゃない。

なんか文句言いたいだけっぽいね。
役割によっては1行2行のメソッドも出来るし、
極稀に100行近くになることもある。

50行程度ならもっとヘッダコメントも分かれるから
尚更解読するのは楽だろうに。

で、メソッド何単位で作ってるの?

の回答が>>292??
メソッドを何単位で作ってるかすら答えていないし
そもそもトリッキーに作る前提がその回答?!

ちょっとおかしいんじゃないの?
0301デフォルトの名無しさん2016/10/04(火) 23:46:21.78ID:ixQnj8Kq
>>299
違うよ
お前は完全に誤解している
誤解した上で大切な格言をさらに誤解している
プログラミングの格言が言う目的を表明するコメントってのは>>292の事だ
0302デフォルトの名無しさん2016/10/04(火) 23:48:40.44ID:ixQnj8Kq
>>300
お前はもう目的が俺にレスを返す事だけになってるから
これ以上お前にレスするのはやめるよ
0303デフォルトの名無しさん2016/10/04(火) 23:51:28.16ID:pK2NF8fu
>>302
答えられずに敗走するなら
一言謝れば済む話なのに
0304デフォルトの名無しさん2016/10/04(火) 23:54:58.23ID:kYsgZgns
>>301
じゃあお前の主張は
>目的の表明が必要なのは一部の難解なコードだけ
なんだな?
0305デフォルトの名無しさん2016/10/04(火) 23:58:12.71ID:luzzRI32
>>299
前提処理が必要な関数を前提処理無視して触れる設計にしちゃダメじゃないですかね。
0306デフォルトの名無しさん2016/10/04(火) 23:59:03.45ID:ixQnj8Kq
>>304
お前人が親切に何度も書いてやってんのにちゃんと読んでるか?
何度同じ事を言わせたいんだ?
0307デフォルトの名無しさん2016/10/05(水) 00:00:14.29ID:srvtImFw
>>305
ふつう事前条件は呼び出し側の責務で事後条件は呼び出された側の責務では?
0308デフォルトの名無しさん2016/10/05(水) 00:01:00.71ID:srvtImFw
>>306
キチガイだということを確認したのさ
0309デフォルトの名無しさん2016/10/05(水) 00:05:24.14ID:Bd5OrliE
>>307
責務的にはそう。

けど設計書上は呼び出される関数の仕様に前提条件として記述されることが多い。
0310デフォルトの名無しさん2016/10/05(水) 00:14:13.26ID:srvtImFw
>>305,309

>>299は呼び出す側のコードで
「ここから事前条件を満たすための処理を始めます」というコメントなんだけど。。。
0311デフォルトの名無しさん2016/10/05(水) 00:47:38.39ID:bI5Lxzuj
>>310
なにその

If args(1) = True Then 'args配列の一番目の要素がTrueである事を確認している

みたいな無駄なコメント
0312デフォルトの名無しさん2016/10/05(水) 00:56:11.34ID:icXstXaq
'コピペ
Range("A1:C25").Copy Destination:=Cells(29,5)
0313デフォルトの名無しさん2016/10/05(水) 04:30:03.80ID:KwBFnIVv
>>260
ブロック変数のことを言いたいんだと思う
0314デフォルトの名無しさん2016/10/05(水) 06:49:41.19ID:srvtImFw
>>311
それが

If args(1) = True Then 'myFuncを呼び出す事前条件の確認

だったら意味があるっちゅうの
0315デフォルトの名無しさん2016/10/05(水) 07:20:29.26ID:Hl1+r7j+
>>314
コメントに意味があるかどうかよりわざわざそんなコメントが必要なコードに疑問を持て
良いコメントとは自分の醜いコードを正当化する為の言い訳じゃないぞ
0316デフォルトの名無しさん2016/10/05(水) 07:24:59.83ID:yHjUirFa
>>314
意味はあるかも知れないけど変数名で何とかなりそう
0317デフォルトの名無しさん2016/10/05(水) 07:33:36.90ID:yHjUirFa
>>315
まさに>>292がそれだよね
複雑怪奇になったコードの言い訳につけるとか
0318デフォルトの名無しさん2016/10/05(水) 07:53:29.70ID:8EEbZfH6
コメント戦争終結
0319デフォルトの名無しさん2016/10/05(水) 08:03:23.74ID:qrm+YPUB
>>317
やっと少しは理解したようだな
つまり目的を表明するコメントが必要だと思ったらまずは自分のコードを疑え
それは決して良いコメントではない
0320デフォルトの名無しさん2016/10/05(水) 08:12:56.98ID:j41jgZNt
コメントってコードをしっかり読んでくれることを期待して書く訳じゃないからな。
名前から意味を汲み取るのはまずはクラス名、関数名まで。そこから先は時間のロス。
開発途中は別ね。
0321デフォルトの名無しさん2016/10/05(水) 12:43:27.76ID:j41jgZNt
>>264
「全体を通して」ってどういう意味?
0322デフォルトの名無しさん2016/10/05(水) 13:18:48.84ID:Q0piKuAf
いつまでもダラダラと論を戦わせてても無駄だ
双方でご自慢のコードの一部を提示して現物勝負しろ

おれはどっちかっつーと、要望に応えるために急遽取り込んだとか、現場で改変した
とかって時に忘備録がわりに書き残すな
設計時通りならいちいち書かない 必死こいて練ったようなのも書かない
もののついでとか、咄嗟の思い付きでみたいなのは書き残しとかないと後日自分で
判らなくなるんで書いておく  苦しんだ時のは結構いつまでも記憶してるわな
0323デフォルトの名無しさん2016/10/05(水) 13:33:19.11ID:llm582RG
VBAのコードなんて書き捨てくらいでいいんだよ
0324デフォルトの名無しさん2016/10/05(水) 13:46:41.30ID:j41jgZNt
この書き込みをみて「全体を通してコメントが多く書かれている」と誤って解釈して議論を始めてるだろ。


263 デフォルトの名無しさん sage 2016/10/04(火) 21:23:12.88 ID:pK2NF8fu
コメントは出来るだけ何をやっているかは書かないように変数名やメソッド名、プロパティ名で頑張ってる。

何の為にやってるかだけ書こうと努力はしてるけど
中々難しい。
0325デフォルトの名無しさん2016/10/05(水) 14:48:02.18ID:wRaKuTZM
Rem 終了
0326デフォルトの名無しさん2016/10/05(水) 18:53:02.22ID:CThI016C
初心者だから全部書いてる
0327デフォルトの名無しさん2016/10/05(水) 20:14:20.47ID:bI5Lxzuj
VBAでコメントが必要になる状況って何にせよ好ましくない
0328デフォルトの名無しさん2016/10/05(水) 21:12:49.34ID:3M5c1lQK
>>327
それは何故?
理由を知りたい
0329デフォルトの名無しさん2016/10/05(水) 21:14:35.54ID:j41jgZNt
実際のところ自分がどのくらいコメントを書いているか長めなやつをひとつとって見たら、
標準モジュール994行に対して8個だった。(Function/Sub合計55個)
ヘッダコメントとか関数一覧とかは除いてる。
0330デフォルトの名無しさん2016/10/05(水) 21:20:49.28ID:bI5Lxzuj
>>328
VBAは多人数で作る事を想定していないから、他人に見せる為のコメントが入る事がおかしい
VBAは大規模なオートメーション化をする為のものではないから、コメントがないと覚えきれないほど大がかりなプログラムを組むのがおかしい
そして小規模なのにコメントがないといちいち覚えられないような、とっちらかったプログラムを組むのは素人だからVBAに限らず好ましくない
0331デフォルトの名無しさん2016/10/05(水) 21:21:31.84ID:Hl1+r7j+
なんでコメントの量の話になってんだよw
0332デフォルトの名無しさん2016/10/05(水) 21:25:27.08ID:JiyI3+0P
>>330
自分が仕事場を去るとき引き継ぎとかしないの?
逆に誰かから引き継ぐときコメントもない
汚ったないソース渡されても平気なの?
0333デフォルトの名無しさん2016/10/05(水) 21:33:10.14ID:JiyI3+0P
もっとも、今javaで1メソッド1000行以上のがゴロゴロしてる俺の現場は
設計書の項番が各処理にコメントとして振られている
辞めたい。早く辞めたい。
0334デフォルトの名無しさん2016/10/05(水) 21:36:02.49ID:j41jgZNt
>>333
...さすがに不要コードをコメントアウトで残してはいないよね?
0335デフォルトの名無しさん2016/10/05(水) 21:42:01.85ID:JiyI3+0P
>>334
一応StarTeamで管理してるからそれは無いけど、
一時期そうしようかという話も上がっていたらしい
0336デフォルトの名無しさん2016/10/05(水) 22:05:56.47ID:bI5Lxzuj
>>332
VBAに限っては誰かに引き継いだり誰かから引き継いだりっていう事自体が本来、意図されている範疇を超える
仕様を正確に伝えられている事を前提にした場合、一日以内に組めないものはマクロの範疇外
0337デフォルトの名無しさん2016/10/05(水) 22:10:16.45ID:j41jgZNt
「あってはならない」思考ですね
0338デフォルトの名無しさん2016/10/05(水) 22:17:04.14ID:3M5c1lQK
>>336
ありがとー
感想は結論ありきの理由と感じた。
0339デフォルトの名無しさん2016/10/05(水) 22:34:42.85ID:5xEMF8RF
>>336
なんか原発が事故に遭う前の自民党の言い分みたい
0340デフォルトの名無しさん2016/10/05(水) 22:35:19.62ID:vqewxUaX
何だろうな?
コード書いてからコメント書く奴多いのか?

俺は先にコメントで全体構造を書いてから、
コードを埋め込んで行くけどな。

普通、
要件定義→設計→作成→テスト
だろ?

その「作成」の段階も設計をコードに落とす前にフローに落とし込むのが
常識じゃないのか?
0341デフォルトの名無しさん2016/10/05(水) 22:41:20.97ID:3M5c1lQK
>>340
そうするとどんなメリットを得て
どんなデメリットが生ずるのかな?

その常識が嵌まるケースは
どんな場合なんだろうか?
0342デフォルトの名無しさん2016/10/05(水) 22:47:56.03ID:srvtImFw
>>340
テストコードならそれでいいだろうが、一般にそれではコメント量が多すぎる
0343デフォルトの名無しさん2016/10/05(水) 23:16:53.27ID:Hl1+r7j+
コメントが多いとか少ないとかそんなもんどっちでもいいわ
どこで揉めてんだよお前らw
0344デフォルトの名無しさん2016/10/06(木) 00:19:24.24ID:+At5cwpl
雑談スレでやれ
0345デフォルトの名無しさん2016/10/06(木) 03:42:12.60ID:WnMuVEy/
全くだ
ここ質問スレだぞ
0346デフォルトの名無しさん2016/10/06(木) 07:49:07.35ID:cJ+lgsQn
コメント研究すれ。
http://echo.2ch.net/test/read.cgi/tech/1205953427/
0347デフォルトの名無しさん2016/10/06(木) 10:53:24.14ID:gQ9THITD
VBAの範疇に属する質問らしい質問が出なくなって久しいからな。
このすれだとどこまで遡ればよいやらわからん。
ネタ切れなんだろうか?
0348デフォルトの名無しさん2016/10/06(木) 11:22:01.67ID:4/PjwsDS
無理にネタを考え出すこたぁねーよw
0349デフォルトの名無しさん2016/10/06(木) 11:47:55.17ID:0yCCPD8C
コメントは書かなくても分かるコードにするのが当然で単なるコードの説明なら冗長であり、
例えるならデータベース設計で1つのデータをいろんなところに分散して登録している極悪な設計だ。

>>269の悪い例が単純化されてはいるもののよくあらわしている。
もしコードをかえたらコメントもかえなければならない。
これは単純なコードだけど実際はコードを1か所でも変えたらそのプログラム中の「す」「べ」「て」のコメント行を変更しないといけないか吟味しなくてはならない。


逆に>>270がコメントが必要であるいい例。
あとで他人が見たときに
「プッ(ワラ。この人はなにもわからずに書いたのか。じゃあオレが早くするよういろんなコードを修正しといてやるか。
あと、ScreenUpdatingをFalseにするのはこれから加える予定の新機能に邪魔になるからこの行は削除」
と判断できる。
もしそのコメントがない場合は、
「この人はなにか理由があってScreenUpdatingをFalseにしてるんだろうから勝手にはいじれないな」
としか判断できずなにもできない。

コメントが必要である他の例とすれば
本来はこうコードを書いたほうがスマートだけど、なんらかMicrosoft側のバグかなにかでよきせぬ動作をするので
' もちろんここは○○○と書いたほうがスマートだけど、それだとバグが発生するのでわざわざこう書いた
みたいなのだな。
0350デフォルトの名無しさん2016/10/06(木) 12:33:03.57ID:ln2yCF00
よそ行けって叱られてムキになって長文奴w
0351デフォルトの名無しさん2016/10/06(木) 12:57:08.03ID:gQ9THITD
有名人の悪口を言うネタ
0352デフォルトの名無しさん2016/10/06(木) 17:51:12.96ID:prbbit7d
>>349
正論。
0353デフォルトの名無しさん2016/10/06(木) 18:29:24.04ID:pwZHamux
>>349
> 「プッ(ワラ。この人はなにもわからずに書いたのか。じゃあオレが早くするよういろんなコードを修正しといてやるか。

こういう知ったが一番迷惑なんだよな
0354デフォルトの名無しさん2016/10/06(木) 18:59:29.41ID:prbbit7d
ヘッダーとかを除いて出来るだけコメントは少ない方がいいのは共通の意見なんだよな
ただコメントが少ないだけじゃなくて変数名とかを解り易いものにして処理も解り易く書く

実行速度との兼ね合いになるときもあるけど
基本そんなところなんだろうな

って勝手に纏めちゃっていい?
0355デフォルトの名無しさん2016/10/06(木) 19:29:42.35ID:DIpiBblJ
>>354
認める
0356デフォルトの名無しさん2016/10/06(木) 19:42:54.38ID:gQ9THITD
>>354
それって発端となった>>263の意見と両立するんだよね。
0357デフォルトの名無しさん2016/10/06(木) 19:50:21.31ID:DIpiBblJ
エクセル2010で配列の質問です。

シートの表記そのままを配列にしたいが
上手く行かない。

具体的には、時間hh:mm:ssを配列にすると
double型のシリアル値になってしまう。
配列化はrangeをvariantに入れてます。

前提条件
結果は二次元配列で得る。
vbaで実装。
元データはエクセルで提供される。

試したこと
時間を判別する。→小数が時間表記になる。

お願いします。
0358デフォルトの名無しさん2016/10/06(木) 20:17:20.93ID:prbbit7d
>>357
ちまちまと1セルづつValueで取るか
時間が掛かってもいいならそう言った加工を含めた
SQL投げて
RecordSetに取得してから配列に入れ込むか

もっともRecordSetに取っておけばわざわざ配列に入れなくてもそのままシートに貼れるけどね

まあ仕様用途が分からないし配列に入れることが要件みたいだからその話は余談だけれども
0359デフォルトの名無しさん2016/10/06(木) 20:28:13.34ID:gQ9THITD
>>357
最終的にセルに貼るのであれば配列はそのままでもいいんだけどね。値としては合ってるわけだし。
0360デフォルトの名無しさん2016/10/06(木) 20:28:50.57ID:gW8SdMMl
>>357
CSVに書き出していいなら、その後でFSOでテキストファイルとして開いて取得するとか。
0361デフォルトの名無しさん2016/10/06(木) 20:48:05.23ID:ypzLwK7t
>>357
シートに貼り付ける直前に、
セルを日付型にするのは駄目なの?
0362デフォルトの名無しさん2016/10/06(木) 20:50:07.03ID:ypzLwK7t
日付じゃなくて時刻か。
0363デフォルトの名無しさん2016/10/06(木) 21:17:37.74ID:9eJl1FnY
>>359
質問者の想定しているのがどういうシチュエーションなのか知らないけど、
レンジをヴァリアントに入れる形の配列取得は
値のコピーだけで書式の情報はコピーされないから
取得したデータを別のセルにコピーすると
元データの書式情報が反映されないしダメでしょ
0364デフォルトの名無しさん2016/10/06(木) 21:24:47.83ID:KB+ca5Zz
>>357
判定なら気にせずそのままでできるけど
気になるのならCDateで型変換すればいいんじゃないかな
0365デフォルトの名無しさん2016/10/06(木) 21:31:26.42ID:KB+ca5Zz
独り言
Dim MyRange As Variant
MyRange = Selection
これで配列を作れるのに

Dim MyRange As Variant
MyRange = Selection.Font.Name
これで配列ができないのにはいつもがっかり
0366デフォルトの名無しさん2016/10/06(木) 21:47:49.82ID:SvXA3ig5
手入力で作成されたエクセルを、1行ずつ内容によって判定しながら処理したい
セルに対してだと遅いので配列に入れてやろうとした
ガーン
なんか方法ない?
って感じ?
0367デフォルトの名無しさん2016/10/06(木) 22:23:01.60ID:4Mq5rf4n
>>357
時間ともう1つの要素の構造体作って構造体の1次元配列にする
0368デフォルトの名無しさん2016/10/06(木) 23:15:51.45ID:DIpiBblJ
様々なアイデアありがとうございます‼

方向性は>>360のテキスト経由を
試そうと思います。

ちなみに目的はDBへの
インサートになります。
0369デフォルトの名無しさん2016/10/06(木) 23:41:47.71ID:fU1btjXz
>>368
Format関数を
m(i, j) = Format(m(i, j), "hh:mm:dd")
とループさせるんじゃダメなのかい?
0370デフォルトの名無しさん2016/10/06(木) 23:48:51.33ID:cJ+lgsQn
>>368
DBに入れるなら項目数分の構造体作ることをお勧めする
初期値の操作とかいろいろ楽になるはず
0371デフォルトの名無しさん2016/10/07(金) 08:23:54.94ID:NQgtqPyd
vbaでbasp21というコンポーネントを使ってsocket通信をしてるんですが、ipアドレスの指定がipv6に対応していないっぽいんです。
どなたかbasp21でipv6を設定する方法をご存じないですか?
(ヘルプは情報が古くてv6については未記載です)

winsockで書かないとダメですかね?
0372デフォルトの名無しさん2016/10/07(金) 12:34:20.33ID:oJOHJwZW
>>371
Excelで通信とかやってる人ってそんなにいないとは思うけどこっちで聞いてみたら?
古代VBプログラマ質問スレ(Ver.6.0 まで) part65 [転載禁止]©2ch.net・
http://echo.2ch.net/test/read.cgi/tech/1440930335/
0373デフォルトの名無しさん2016/10/08(土) 19:50:48.94ID:jNc1kWL3
Range("A1")⇔cells(1,1)の変換をしたいのですが。

Sub テスト()
MsgBox Range("a1").Row
MsgBox Range("a1").Column

Cells((Range("a1").Row) & "," & (Range("a1").Column)).Value = "ここはA1?"
End Sub

↑こう書くとA1セルに文字が書き出されると考えましたが、実行するとそうならないのはなぜでしょうか?

よろしくお願いいたします。
0374デフォルトの名無しさん2016/10/08(土) 19:54:09.94ID:jNc1kWL3
>>373
答えはなんと K1 セルに表示されます。一体どうなっているのでしょうか?!
0375デフォルトの名無しさん2016/10/08(土) 20:05:30.23ID:ssQHBd36
>>373
Cells((Range("a1").Row), (Range("a1").Column)).Value = "ここはA1?"
0376デフォルトの名無しさん2016/10/08(土) 20:07:01.05ID:ssQHBd36
>>373
Cells(Range("a1").Row, Range("a1").Column).Value = "ここはA1?"
0377デフォルトの名無しさん2016/10/08(土) 20:07:12.39ID:+vtWpikF
文字列”1,1”のセルを参照してるから想定してないところに行く

Cells(Range("a1").Row , Range("a1").Column).Value = "ここはA1?"

ならどう?
0378デフォルトの名無しさん2016/10/08(土) 20:08:34.08ID:jNc1kWL3
>>375
>>377
なんと!!! ありがとうございます!!助かりました。
0379デフォルトの名無しさん2016/10/08(土) 20:11:40.53ID:jNc1kWL3
>>376
ありがとうございます。
0380デフォルトの名無しさん2016/10/08(土) 20:12:51.66ID:ssQHBd36
Cellsの引数が文字列1つだった場合、
Cells("234") は Cells(1, 234) と解釈されるという仕様になっている
また、途中と最後のカンマは無視される仕様なので
Cells("5,6,,7,,,") は Cells(1, 567) と解釈される

その例だと引数は "1,1" という文字列になっているので
Cells("1,1") は Cells(1, 11) と解釈され、K1セルを指定したことになる
0381デフォルトの名無しさん2016/10/08(土) 20:16:07.28ID:jNc1kWL3
>>380
すばらしい答えをありがとうございます。 更に勉強になりました。
0382デフォルトの名無しさん2016/10/08(土) 21:34:28.01ID:yo/AP7TX
列のアルファベットを数値へ、数値をアルファベットへ変換するExcelVBA
http://ateitexe.com/change-alphabet-integer/
0383デフォルトの名無しさん2016/10/09(日) 04:02:09.41ID:RCJ/QWRc
>>380
へえぇ、これは知らなかった。
むしろあまり無茶な設定したときはエラーで落ちる方が
皆が混乱しないで済むと思うけど
そういう仕様なんだから仕方ないといったところか。
0384デフォルトの名無しさん2016/10/09(日) 06:01:04.77ID:vqay/UXI
何か歴史的な経緯があるんだろうけど謎だよな
試してみたらCells(",1")は普通にエラーになるし、なんなんだいったい
0385デフォルトの名無しさん2016/10/09(日) 06:35:15.42ID:pq9cwjZk
>>380
>Cells("234") は Cells(1, 234) と解釈されるという仕様になっている
それは正確ではない
それはCells(234)と解釈されて、引数が一つのときは
>左から右に、次に上から下に数えて、アクセスするセルのインデックス番号を指定します。
だ。右端超える数値指定したら下の行に行くぞ

>>384
指定するのは数値とみなされるから
CLng("5,6,,7,,,")は567
CLng("1,1")は11になるけど
CLng(",1")はエラーになるからな
VBAの数値変換の問題で直接的にはCellsの問題ではない
0386デフォルトの名無しさん2016/10/09(日) 15:48:03.71ID:qBi7fi4I
式を数字で書くマクロが欲しい

あるセルにA1+A2×B1と書かれていた場合、その横に7+2×3=13みたく書いてくれるやつです。

とくに、p()と、スクエア()は認識してくれればいいです。

すみませんお願いします。
0387デフォルトの名無しさん2016/10/09(日) 17:25:14.65ID:BXUtyFnD
それは難しい
0388デフォルトの名無しさん2016/10/09(日) 21:15:03.42ID:CYLhEXLs
マクロにしなくても、普通に、横に

=A1&"+"&A2&"×"&B1&"="&A1+A2&B1

って書くんじゃ駄目なの?
0389デフォルトの名無しさん2016/10/09(日) 21:16:56.55ID:CYLhEXLs
間違えた。こうだ。

=A1&"+"&A2&"×"&B1&"="&A1+A2*B1
0390デフォルトの名無しさん2016/10/09(日) 21:31:44.83ID:6tfHmpJC
>>386
それってセルのFormulaプロパティを解析して単一セルへの参照と思われる式を
そのValueと置き換えたいってこと?
0391デフォルトの名無しさん2016/10/09(日) 23:12:58.36ID:TK5uRNHf
>>388
あらゆる式に対応してないと。
なにもA1+A2×B1だけじゃないし
0392デフォルトの名無しさん2016/10/09(日) 23:32:39.87ID:eMbKvgyN
VBAと同等の構文解析を実装しないとだめなんじゃないか?
0393デフォルトの名無しさん2016/10/09(日) 23:33:31.43ID:eMbKvgyN
VBAじゃなくてExcel式だった。
0394デフォルトの名無しさん2016/10/10(月) 00:00:40.23ID:zsdTnO8Q
>>386 こんなのどう

Sub 選択範囲の式の右に式を出力()
'’161009a Mambow

Dim Yoyaku As Variant
Yoyaku = Split("||=|+|-|/|*|(|)|INT|SQRT", "|")

Dim FF As Range
Dim myParts As Variant
Dim myFormula As Variant

For Each FF In Selection

'’単語で区切る
myFormula = FF.Formula
For Each KK In Yoyaku
myFormula = Replace(myFormula, KK, "|" & KK & "|")
Next
0395デフォルトの名無しさん2016/10/10(月) 00:01:24.88ID:zsdTnO8Q
続き

'’スプリットしてセルを文字に置換
myParts = Split(myFormula, "|")
myResult = ""
For Each PP In myParts

Flag = 0 '’1なら予約語
For Each KK In Yoyaku
If PP = KK Then Flag = 1: Exit For
Next

If Flag = 1 Then
myResult = myResult & KK
Else: myResult = myResult & Range(PP)
End If

Next

FF.Cells(1, 2) = "'" & FF.Formula
FF.Cells(1, 3) = "'" & myResult

Next

End Sub
0396デフォルトの名無しさん2016/10/10(月) 05:00:45.95ID:DbNhouaC
選択範囲が横に複数有った場合は消してしまう
そのくらいなら選択範囲かつ現在選択してるセルと同じ縦方向のセルを対象とする条件を入れたいね
0397デフォルトの名無しさん2016/10/10(月) 06:13:34.87ID:Sulf2nkU
>>394
さすがっすあんがと
あとドルマークは認識できるよう
できますか
0398デフォルトの名無しさん2016/10/10(月) 08:03:52.61ID:DbNhouaC
そのくらいは自身でやって欲しいっす
ドルマークの認識ってのもどういう意味かわかんないし
0399デフォルトの名無しさん2016/10/10(月) 08:54:10.50ID:dDEIeJH+
$A$1:$A$2 のドルマークじゃないの?

まあ俺的にはドルマークより、
たけしマークの方がいいと思うけどな。
0400デフォルトの名無しさん2016/10/10(月) 09:55:17.68ID:DbNhouaC
>>399
絶対参照のことを仰られてるのならば既にできてると思う

まず認識ってのはどういう意味か明確じゃない
その文字列も演算子のように扱いたいのかもしれない
表示形式として$を利用しててそれぞれの数値に対して付けたいのか

もっと言うと範囲選択するような演算はすべて出力するべきか
空白は空白と見るか0と見るか

いろいろ曖昧
0401デフォルトの名無しさん2016/10/10(月) 14:21:19.54ID:1ElBVdQb
絶対参照というんですか。それのことです。ありがとうございました。。
0402デフォルトの名無しさん2016/10/10(月) 18:17:08.01ID:GbyvKkwG
R1C1形式を使ってればドルマークって表現は避けられそうなんだよなぁ
まぁ好みだが
0403デフォルトの名無しさん2016/10/10(月) 18:36:42.71ID:Rkc5P+nq
>>402
避けられるけど相対指定が逆に面倒なことに...
0404デフォルトの名無しさん2016/10/10(月) 18:55:14.86ID:GbyvKkwG
>>403
むしろ相対指定は理解しやすくなると思う
なんならVBAやるならまずR1C1形式にした方が吸収早いまであると思ってる
0405デフォルトの名無しさん2016/10/10(月) 19:25:31.59ID:Rkc5P+nq
>>404
パーサーの話じゃないのか?
0406デフォルトの名無しさん2016/10/11(火) 19:36:41.03ID:8lv9/W5a
相対指定はOffsetでこと足りるからなぁ
0407デフォルトの名無しさん2016/10/11(火) 21:04:48.77ID:uE+dGCKQ
>>395

累乗^がないことに気づきました。どうしましょうか、ご教示願います。
0408デフォルトの名無しさん2016/10/11(火) 21:15:41.70ID:A78WpH6/
>>407
条件に入れればいいと思います
0409デフォルトの名無しさん2016/10/11(火) 21:41:00.07ID:tnbZj/qD
あれもこれもって認識の条件を足していくと仕舞いにはVBAでスクリプト言語開発するレベルの話になりそう
0410デフォルトの名無しさん2016/10/11(火) 21:47:29.29ID:pV4XBJlB
気づかなかったことにするのも可
0411デフォルトの名無しさん2016/10/11(火) 21:51:58.86ID:5BwnOKl0
あらゆる指定が曖昧なんだよ
何を求めているかをまとめるところから始めなきゃ

ところで認識の条件ってどういう意味?
0412デフォルトの名無しさん2016/10/11(火) 21:54:22.31ID:uE+dGCKQ
>>408
スプリット()の中に^を追加するのですか
0413デフォルトの名無しさん2016/10/11(火) 21:58:54.40ID:qypiSMEg
リストアップする戦略には疑問を感じる。
0414デフォルトの名無しさん2016/10/11(火) 22:00:21.92ID:A78WpH6/
>>412
そうです

どのsplitを指しているかはわかりませんが、、、
たぶん合ってます
0415デフォルトの名無しさん2016/10/11(火) 23:35:36.11ID:xiBeBfeC
関数はパターンで識別しちゃったほうがいいな
0416デフォルトの名無しさん2016/10/12(水) 17:30:07.41ID:AIygAMtf
正規表現使ったやつ
http://qiita.com/diaphragm/items/e2a98508790e71d08f95

関数対応してないけどちょっと改造すればなんとかなるでしょ
0417デフォルトの名無しさん2016/10/12(水) 17:43:36.26ID:dHnq6pJN
SQRTとかは別にSQRTの計算結果を表示しなくていいのか
なら>>416で事足りるな
0418デフォルトの名無しさん2016/10/12(水) 19:06:52.22ID:DQ7vhDEH
>>395
質問者です。

= PI()*A1+ A1^A1

もできるようにしていただけないでしょうか。

すぐプログラム読みとくことができないです。どうかお願いします
0419デフォルトの名無しさん2016/10/12(水) 19:17:07.52ID:iTXTBuwT
追加要件は別見積です
0420デフォルトの名無しさん2016/10/12(水) 19:54:17.41ID:Fl7ioEoi
Foot In The Doorとかいう、プログラマいらつかせる為に存在するクソテクニック。

Formura解析して変換可能な全てのセル指定を見つけ出してValueにするプログラムとか、
まともに見積もりしたら一千万以下にはならないんじゃないの。
0421デフォルトの名無しさん2016/10/12(水) 20:17:07.90ID:AoMg70NU
>>418
>>416試した?
0422デフォルトの名無しさん2016/10/12(水) 20:48:36.16ID:2t1rsNoh
すみません。教えていただきたいのですが、ユーザーフォームに20個ほどコマンドボタンがあり、それぞれ別の処理をしているます。
クリックイベントを一つずつ書いてある為、コードがとても長くなってしまっているので、見やすく変えたいのですが、クリックイベントを一つにまとめてselectcaseか何かで分岐処理を行う、という事は可能でしょうか?
現在、行数が2500位になってしまっていて見るだけで大変なのでなんとかしたいのでお願いします。
0423デフォルトの名無しさん2016/10/12(水) 21:01:46.25ID:jVnO+0C4
>>422
可能です
0424デフォルトの名無しさん2016/10/12(水) 21:07:19.11ID:2t1rsNoh
>>423
申し訳ありませんが、詳しく教えて下さい。
0425デフォルトの名無しさん2016/10/12(水) 21:17:48.62ID:jVnO+0C4
>>424
http://www.h3.dion.ne.jp/~sakatsu/Breakthrough_P-Ctrl_Arrays.htm
0426デフォルトの名無しさん2016/10/12(水) 21:17:55.30ID:MDgm7R4P
>>422
冷静になって考えろ分岐が増える分さらに読みづらくなるとは思わんか?
0427デフォルトの名無しさん2016/10/12(水) 21:34:46.21ID:85o/Yoqy
>>422
VBAはVB6と違ってコントロール配列を持っていないので擬似的に設置する必要があるけど
>>426の人がいうように寧ろ長く見辛くなる可能性が高いな。
あくまで俺ならだけど、ボタンを押して処理の違うところはクラスかコールバックで
多態性を持たせてゴニョゴニョするかな。
0428デフォルトの名無しさん2016/10/12(水) 21:47:55.18ID:Fl7ioEoi
WithEventsの配列を作ればまとめられるけど、
別々の処理してるならあんまり関係ないよなぁ。

WithEvents キーワードを使ったイベントプロシージャ
http://excelwork.info/excel/classwitheventskeyword/
0429デフォルトの名無しさん2016/10/12(水) 21:55:30.16ID:xfv6IRFQ
やらせたい処理が沢山あるんだったら、どうしたってこうしたってコードはながくなるっての
0430デフォルトの名無しさん2016/10/12(水) 22:14:30.34ID:demRx8+z
モジュール分割したら?
0431デフォルトの名無しさん2016/10/12(水) 23:17:02.96ID:pT37b7Zo
>>422
標準モジュールにマクロを書いて
クリックイベントでCallで呼び出すだけでいいんじゃないの

3行 x ボタン20個 で60行で収まるよ
0432デフォルトの名無しさん2016/10/13(木) 00:32:11.97ID:aniHJH6t
そのままでも、ボタンと処理が、1対1で、わかりやすいのでは?
再利用できる処理を、関数化すればいい

switch文は、キーイベント・セレクトメニューなどに使う
0433デフォルトの名無しさん2016/10/13(木) 10:11:28.68ID:iJbRnyC1
ActiveWindowというActiveWorkbookに似た謎のプロパティがあるのですが、これはどういうふうに使うんですか?
例えばイミディエイトのウインドウで
? ActiveWindow.ActiveSheet.Name
と入力しても
? ActiveWorkbook.ActiveSheet.Name
と入力しても
同じシート名「Sheet1」が返ってきます。

このへん、竹を割ったようにスッキリ、ニュースの池上さんもびっくりの、わかりやすい解説をしてくださるかたはいらっしゃらないでしょうか?
0434デフォルトの名無しさん2016/10/13(木) 11:03:21.11ID:LsJ9lYTO
>>433
新しいウィンドウを開く を使ったことはありますか
0435デフォルトの名無しさん2016/10/13(木) 11:20:09.38ID:iJbRnyC1
>>434
新しいBookを開く、という意味ですか?もしそうならあります。
0436デフォルトの名無しさん2016/10/13(木) 11:57:22.70ID:wxrySSRE
今アクティブになってるモノを見てるだけの話
0437デフォルトの名無しさん2016/10/13(木) 12:16:33.00ID:HiNO0LyX
>>433
ActiveWindowは最前面に表示されているウィンドウ(Window オブジェクト)を操作する時に使う
ウィンドウのスクロールや最大化、最小化など…

Window オブジェクト (Excel)
https://msdn.microsoft.com/ja-jp/library/office/ff835196.aspx
0438デフォルトの名無しさん2016/10/13(木) 12:18:10.94ID:LsJ9lYTO
>>435
違う。
https://121ware.com/qasearch/1007/app/servlet/relatedqa?QID=015989
0439デフォルトの名無しさん2016/10/13(木) 12:51:41.96ID:ySuNgeDQ
>>421

=2+3のようになるのですが、

2+3=5となるように改造したいのですが
どこどうやって改造すれば良いでしょうか。
0440デフォルトの名無しさん2016/10/13(木) 13:29:52.85ID:LsJ9lYTO
>>439
=2+3から、"="を""に置換して、右側に"="と答えを連結
0441デフォルトの名無しさん2016/10/13(木) 13:45:08.39ID:2x/LH7yr
>>439
そのくらいExcel側の数式でなんとかしろよ
0442デフォルトの名無しさん2016/10/13(木) 14:26:51.35ID:iJbRnyC1
>>437>>438
でもいまいちわからないなあ。竹を割ってくださいよ、池上さんをあっぱれさせてくださいよ。

WindowsコレクションにはWorkbooksコレクションと同じ数だけ要素が入ってるけど
なぜわざわざ似たようなものを2つ作った、このExcelを作った開発者は?
あと、そのIndexはWindowsコレクションの場合新しいほど数字が若いのも謎だ。
便利なのはWindowsを使った場合ActiveSheetプロパティやActiveCellプロパティがあるからそれぞれのWorkBookをactivateしたときにActiveになっているSheetやCellを簡単に取得できることだ。
0443デフォルトの名無しさん2016/10/13(木) 14:52:28.57ID:OKlZx9RX
WindowとWorkbookは違うクラスだから

むしろなんでWindowとWorkbookが似たようなクラスだと思ったの?
WorksheetとShapeぐらい別物だよ?
0444デフォルトの名無しさん2016/10/13(木) 14:55:06.62ID:iJbRnyC1
いや加藤あいと阿藤快くらい似てるよ
0445デフォルトの名無しさん2016/10/13(木) 15:05:21.75ID:LsJ9lYTO
Windows(1).WindowState=xlMinimized とか

>あと、そのIndexはWindowsコレクションの場合新しいほど数字が若いのも謎だ。
手前のものほど若いIndex。なのでころころ変わる。
0446デフォルトの名無しさん2016/10/13(木) 16:41:56.33ID:BNcdAEv0
Windowは 対象を表示する 枠(窓w)
Bookは その表示する対象
って考えれば良いと個人的には思う
(反論・異論は 当然受け入れる)

ちなみに
同一Bookを 2つの Windowで表示する事もできる

ActiveWindow.NewWindow
Debug.Print Workbooks.Count, Windows.Count
0447デフォルトの名無しさん2016/10/13(木) 17:15:42.92ID:YJOiLUR+
質問です

 A         B
1 東京
2 東京
3 東京
4 大阪       東京
5 大阪   ⇒   大阪
6 大阪       九州
7 九州
8 九州
9 九州

のように抽出するマクロを教えてください
0448デフォルトの名無しさん2016/10/13(木) 17:30:16.76ID:d9iZbaMS
データ>データツール>重複の削除
0449デフォルトの名無しさん2016/10/13(木) 17:31:46.84ID:YJOiLUR+
>>448
出来ればマクロで動かしたいんです・・・
0450デフォルトの名無しさん2016/10/13(木) 18:05:13.58ID:VRwClJkC
>>449
>>448をマクロの記録でできる
0451デフォルトの名無しさん2016/10/13(木) 19:28:58.60ID:IrII3OZK
>>447
dictionary
error resume next入れてからやれば重複登録されません
0452デフォルトの名無しさん2016/10/13(木) 20:13:06.62ID:zfOuIJiz
Directory型使うならExists使えるから、わざわざエラー無視しなくても・・・
0453デフォルトの名無しさん2016/10/13(木) 20:34:29.03ID:VRwClJkC
AISのバースデーイベントの司会はさかっちなんだな
http://stat.ameba.jp/user_images/20161011/20/cadetpost3/2f/cd/j/o0960071913770498881.jpg
0454デフォルトの名無しさん2016/10/13(木) 20:34:50.02ID:VRwClJkC
をっと誤爆失礼ー
0455デフォルトの名無しさん2016/10/13(木) 20:35:10.00ID:IrII3OZK
>>452
無駄に条件分岐いれなくてよくなると思うのですが
0456デフォルトの名無しさん2016/10/13(木) 20:42:43.29ID:g/xIBVYn
>>451
俺も真っ先にCollectionかScriptingDictionary使う方法思いついたけど、
Keyに値入れておけばそれで既に登録されているか判断できるからそれでやった方がいい気がする。

エラー正常系はなんか気持ち悪い。
そっちの方が遥かにレスポンスが良いのであれば話は別だけど。
0457デフォルトの名無しさん2016/10/13(木) 21:09:53.38ID:zfOuIJiz
>>455
内部的にはやってる事ほとんど同じはずだから宗派の問題に過ぎないし、
エラーを無視する手法は初心者に教えるべきでない。
0458デフォルトの名無しさん2016/10/13(木) 22:36:11.04ID:hvG1pVAX
>>457
Err オブジェクトを作ったりする必要もあるから処理が同じとは思えない
0459デフォルトの名無しさん2016/10/13(木) 23:56:51.99ID:IedkuVXe
>>447
すんげーめんどくさい方法をあえて採るならこんな感じ

dim s() as string
redim s(1)
set rng = cells(1,1)
do while 0<len(rng)
if len(s(1))=0 then
s(1)=rng
elseif s.indexof(rng)<0 then
redim preserve s(ubound(s)+1)
s(ubound(s))=rng
endif
set rng=rng(2,1)
loop
0460デフォルトの名無しさん2016/10/14(金) 12:47:09.71ID:OGGQVJFa
rangeプロパティで46個引数与えるとエラーになって、45個だと通るんだけど、
引数の数って上限あるの?
0461デフォルトの名無しさん2016/10/14(金) 13:38:08.50ID:5MfmEsZu
>>460
引数の制限は
〇 Range("A1","B1").Select
× Range("A1","B1","C1").Select
だったぞ(By Excel2016)

そうぢゃなく
Range("A1,A2,A3・・・・")
とやった時の話なら 文字数 255文字 の制限に引っかかてると思うよ

↓なら 66セル選択できる
Range("A1,A2,A3,A3,A4,A5・・・途中省略w・・・,A66").Select
0462デフォルトの名無しさん2016/10/14(金) 15:23:34.35ID:kSpw8ZOi
そんな量のパラメーター有ったらビビる
0463デフォルトの名無しさん2016/10/14(金) 16:45:52.26ID:faSrM5ys
>>451
dictionaryで出来ました!
深く感謝です

因みにもう一つ質問なんですが、
逆に重複しているデータだけを抽出する方法ってありますか?
0464デフォルトの名無しさん2016/10/14(金) 17:18:02.86ID:RTTbB8nK
>>461
助かりました!
0465デフォルトの名無しさん2016/10/14(金) 18:53:14.83ID:fd80Aw32
>>463
そのdictonaryのexistsで弾いたやつを別のdictonaryに入れとけばええ
0466デフォルトの名無しさん2016/10/14(金) 18:57:00.12ID:k2yMsJsW
>>463
ぱっと思いつくのはディクショナリのキー側に「大阪」やら「東京」やらを入れておいて値に0を入れる。
シートの対象範囲をループ中に既にディクショナリに登録されていたらそのキーに該当する値を1にする。
最後にディクショナリで値が1のやつだけシートに展開すれば出来上がり。
ディショナリに設定する値は別にTrue、Falseでも、
被ったときに1設定でなくてインクリメントも何でもいいけど、
インクリメントにしておけば何回重複したかを確認することができるから便利かも。
0467デフォルトの名無しさん2016/10/14(金) 19:01:20.50ID:k2yMsJsW
でもただ重複検出だけならレスポンスは先に書かれてた>>465の方が良さそう
0468デフォルトの名無しさん2016/10/14(金) 23:03:45.18ID:oi5LDJU/
カウントして1個のもの→
2個以上のもの→重複
0469デフォルトの名無しさん2016/10/15(土) 06:48:18.20ID:jNvmg4HH
初期値と最大値、最小値、現在値 を持ち、新たに値を放り込むを更新するクラスを作りたい。
また、更新回数のカウンタも持たせたい。
Property Setで値を放り込み、Property Getで初期値、最大値、最小値、現在値を取ればいいと思うんですが、
新しいインスタンスで元のものとは初期値と現在値を入れ換えたものを作ろうとして
0470デフォルトの名無しさん2016/10/15(土) 06:59:12.87ID:jNvmg4HH
↑推敲途中で書き込んでしまった。

初期値と最大値、最小値、現在値を持ち、新たに値を放り込むとそれらを更新するクラスを作りたい。
また、更新回数のカウンタも持たせたい。
Property Setで現在値を取り込みつつ他の値を更新し、それぞれの値を取るProperty Getを
用意すればいいと思うんですが、元のものと初期値と現在値を入れ換えた
新しいインスタンスを返すメソッドを作ろうとして詰まりました。
現在値以外は直接値をセットできないようにしたいんですが、どういう書き方にすればいいでしょうか?
0471デフォルトの名無しさん2016/10/15(土) 07:14:01.90ID:PJeRYX3D
>>469
VBAのクラスはコンストラクタに引数を持たせることが出来ない。
よってファクトリークラスかメソッドか関数のような生成用の役割を持つものを用意して
そこで生成後に以前生成した渡したい値を渡してやれば良いだろうう。

通常時、特定のゲッタ、セッタを参照させないようにしたいのであれば、
一つインターフェースを用意してそのインターフェースを介在して呼ばれたときは設定出来るように、
そうでないときは設定出来ないようにすれば、
そのインスタンスを生成したときの型であれば外部から隠蔽することが出来るんじゃないかな?

まだ試してないから何とも言えないけどそれで行けそうな気がする。
0472デフォルトの名無しさん2016/10/15(土) 07:52:03.81ID:jNvmg4HH
>>471
もうひとつクラスモジュールを用意してそれをInplementsとかすればいいんでしょうか。
やったことないのでまず調べてみます。
0473デフォルトの名無しさん2016/10/15(土) 09:30:00.80ID:PJeRYX3D
>>472
ちょっと説明が分かり辛いと思うからコードで書いておく

'標準モジュール:Main
Option Explicit

Private Sub Main()
Dim masterInstance As testClass
Dim slaveInstance As testClass
Dim factory As New TestFactory
Set masterInstance = factory.GetMasterInstance
masterInstance.PresentValue = 1
Set slaveInstance = factory.GetSlaveInstance(masterInstance)
'Call MsgBox(slaveInstance.InitialValue)
'Call MsgBox(slaveInstance.IinitialSetting_InitialValue)
End Sub

'クラスモジュール(インターフェース):IinitialSetting
Option Explicit

Public Property Get InitialValue() As Long
End Property
Public Property Let InitialValue(ByVal value As Long)
End Property

Public Property Get PresentValue() As Long
End Property
Public Property Let PresentValue(ByVal value As Long)
End Property
0474デフォルトの名無しさん2016/10/15(土) 09:30:52.68ID:PJeRYX3D
'クラスモジュール:TestClass
Option Explicit
Implements IinitialSetting

Dim m_InitialValue As Long
Dim m_PresentValue As Long

Private Property Get IinitialSetting_InitialValue() As Long
IinitialSetting_InitialValue = m_InitialValue
End Property
Private Property Let IinitialSetting_InitialValue(ByVal value As Long)
m_InitialValue = value
End Property

Private Property Get IinitialSetting_PresentValue() As Long
IinitialSetting_PresentValue = PresentValue
End Property
Private Property Let IinitialSetting_PresentValue(ByVal value As Long)
PresentValue = value
End Property

Public Property Get PresentValue() As Long
PresentValue = m_PresentValue
End Property
Public Property Let PresentValue(ByVal value As Long)
m_PresentValue = value
End Property
0475デフォルトの名無しさん2016/10/15(土) 09:38:39.02ID:PJeRYX3D
'クラスモジュール:TestFactory
Option Explicit

Public Function GetMasterInstance() As testClass
Dim masterInstance As IinitialSetting
Set masterInstance = New testClass
masterInstance.InitialValue = 0
masterInstance.PresentValue = 0
Set GetMasterInstance = masterInstance
End Function

Public Function GetSlaveInstance(ByRef masterInstance As testClass) As testClass
Dim slaveInstance As IinitialSetting
Set slaveInstance = New testClass
slaveInstance.InitialValue = masterInstance.PresentValue
End Function

標準モジュールのMain関数から実行する。
まずはトレースで動きを追ってみて欲しい。
MsgBoxが書いてあるコメントを外すとどちらも参照出来ずにコンパイルエラーと
なることが確認できるはず。

所々にある変数のtestClass型宣言は、本当はTestClassとなるはずだったのに
変数名をtestClassとしたらなぜか削除しようがなにしようがtestClassとなってしまった。
そこはご愛嬌ってことで。
0476デフォルトの名無しさん2016/10/15(土) 10:42:31.46ID:jNvmg4HH
>>475
なるほど。
最初のMsgBoxの方はできるようにしたいので、TestClassにPublicなGetを追加したらうまくいきました。
2番目のMsgBoxがエラーなのはイメージ通りです。
あとはTestFactoryの機能をTestClassに寄せられないか検討してみます。
ありがとうございました。
0477デフォルトの名無しさん2016/10/15(土) 11:31:40.67ID:v3Q8BTMc
>>476
ああ、初期設定値はReadOnlyにしたいんだっけ。
だったらGetの部分は現在値と同じ作りにしておけばいいよ。

寄せるのは余りお勧めしない。
.NetみたいにSheardがあるならクラスとして生成しなくても自分から自分を生成出来たりするけど、
VBAではクラスは自分を生成するためには生成する側がインスタンスである必要がある。

言葉で言っててもややこしいけど、コードにすると
もっと解り辛くなるかも知れないよ。

基本、クラスを生成する役割とクラスそのもののが持っている役割は違うはずなので
個人的には別にしておいた方がいいと思うよ。
0478デフォルトの名無しさん2016/10/15(土) 13:10:17.32ID:jNvmg4HH
>>477
初期設定値というか、「最初に入った値」ですね。
まあ為替の4本値です。
役割分割の件は慎重に考えて決めようと思います。て言うかまずユースケース出しですね。
0479デフォルトの名無しさん2016/10/15(土) 13:32:03.97ID:phNDkCd2
為替だの株だのをなんでエクセルで管理しようとするんだ。
どう考えても不利だろ。MT4とか専用のツール使えよ。
0480デフォルトの名無しさん2016/10/15(土) 14:35:56.92ID:F0NY5SKq
>>479
ここは VBA スレなので自称株の℃玄人の話は要らん
0481デフォルトの名無しさん2016/10/15(土) 20:50:19.08ID:fhWY5JBE
>>479
エクセルで何でも出来ると思ってるからに決まってるじゃないか!

本人じゃないから知らんけど。
0482デフォルトの名無しさん2016/10/15(土) 22:43:48.49ID:taq3g4A+
2つのテーブルの列から共通の最長文字列を抽出する
方法についてお伺いしたいです。
例えば、
Aテーブル A項目  
東京都港区赤坂   
神奈川県川崎市   
とう京千代田    
神奈川県川さきし  
千葉県船橋市    

Bテーブル B項目
かながわけん川崎 共通最長は「赤坂」
ときょう八王子  共通最長は「川崎」
あ赤坂      共通最長は「と」
埼玉さいたま市  共通最長は「神奈川県」
神奈川県横浜市  共通最長は「県」「市」

比較対象列の中で何かしら共通文字があり、その最長だけ抜き出したいのです。
共通文字の最長が抽出できればACCESSでもEXCELでも構わないです。
何かいいアイデアはありませんでしょうか。
0483デフォルトの名無しさん2016/10/15(土) 22:46:22.95ID:9QPZg1sB
まず何を言っているのかわからない
0484デフォルトの名無しさん2016/10/15(土) 22:47:12.25ID:taq3g4A+
このように書くべきでした。すみません。
Aテーブル A項目  
東京都港区赤坂  共通最長は「赤坂」 
神奈川県川崎市  共通最長は「川崎」 
とう京千代田   共通最長は「と」 
神奈川県川さきし 共通最長は「神奈川県」 
千葉県船橋市   共通最長は「県」「市」 

Bテーブル B項目
かながわけん川崎 
ときょう八王子  
あ赤坂      
埼玉さいたま市  
神奈川県横浜市 
0485デフォルトの名無しさん2016/10/15(土) 22:54:22.91ID:9QPZg1sB
確認だがその条件だと二番目の結果は「神奈川県」だよな?
0486デフォルトの名無しさん2016/10/15(土) 22:54:58.27ID:taq3g4A+
>>483
例えばAテーブルA項目の1行目と、BテーブルB項目の全行を比較して
共通する文字を見つけ出したいです。
Bテーブルの3行目に「赤坂」の文字があり、Bテーブルの他の行にはないので
Bから探し出せる最長の共通文字は「赤坂」です。

ますます意味不明でしょうか。
0487デフォルトの名無しさん2016/10/15(土) 22:56:28.06ID:taq3g4A+
>>485
その通りです。確認不足ですみません。
0488デフォルトの名無しさん2016/10/15(土) 22:57:13.04ID:2htE+SYs
オーダーでいうとn^3くらいか?
相当難しそう
0489デフォルトの名無しさん2016/10/15(土) 22:58:17.72ID:2htE+SYs
n^3てのはおかしいな
でもn^2より大きいだろう
0490デフォルトの名無しさん2016/10/15(土) 23:02:11.11ID:zn7eUDrO
>>486
>>神奈川県川崎市  共通最長は「川崎」 
>>神奈川県川さきし 共通最長は「神奈川県」 
これ前者は なぜ「川崎」なの?
"共通最長"が文字列として最も長いものなら 3文字の 「神奈川県」じゃね?
0491デフォルトの名無しさん2016/10/15(土) 23:05:00.95ID:taq3g4A+
>>490
確認不足です。最長は「神奈川県」です。
0492デフォルトの名無しさん2016/10/15(土) 23:18:19.83ID:9QPZg1sB
検証はしてないがこんなイメージで行けそう

function a(もじれつ())as string()
 for s in もじれつ
  if 検索する(s、対象場所)
   rslt.add(s)
  else
   つぎ(0)=left(s,len(s)-1)
   つぎ(1)=right(s,len(s)-1)
   rslt.add(a(つぎ))
  endif
 next
 a=rslt
endfunction

function 検索する(もじ、range)as boolean
 rslt=false
 for r in range
  if rに文字がある then rslt=true
 next
 検索する=rslt
endfunction
0493デフォルトの名無しさん2016/10/15(土) 23:19:21.30ID:CMu4YX8d
N^2、2表の直積だろ

でも、それよりも難しそう
0494デフォルトの名無しさん2016/10/16(日) 00:04:29.68ID:GUtPQfk2
>>487
もうひとつ
三番目は「と」「う」だよな?
0495デフォルトの名無しさん2016/10/16(日) 00:11:33.93ID:mMAa4MBf
>>494
質問する側なのに間違えてすみません。
0496デフォルトの名無しさん2016/10/16(日) 00:24:01.23ID:mMAa4MBf
>>492
考えて頂いてありがとうございます。
明日テストしてみます。
0497デフォルトの名無しさん2016/10/16(日) 00:33:04.12ID:lku+utzV
>>493
文字列の長さという変数もある
0498デフォルトの名無しさん2016/10/16(日) 00:41:16.01ID:GUtPQfk2
>>496
もちろんそのままじゃ動かないしチューニングが必要になる

そのまま使って「できませんでした」ってなっても「そうだと思います」としか返せないのでお気をつけ!
0499デフォルトの名無しさん2016/10/16(日) 00:43:47.60ID:mMAa4MBf
>>498
承知しました。ありがとうございます。
0500デフォルトの名無しさん2016/10/16(日) 08:41:29.48ID:S24dnzpa
いつも思うんだが、どういう用途があるんだろうなw
0501デフォルトの名無しさん2016/10/16(日) 08:46:49.70ID:hDEVytTt
宿題じゃねーの?
0502デフォルトの名無しさん2016/10/16(日) 11:49:32.99ID:1wgF90sm
用途なんて詮索するだけ野暮だろ馬鹿か
0503デフォルトの名無しさん2016/10/16(日) 12:03:40.10ID:xiInhvwB
用途用途用途〜
さて何のメロディでしょう?
0504デフォルトの名無しさん2016/10/16(日) 12:08:09.43ID:JwryRgxI
用途が分からないまま組むと「顧客が本当に必要だったもの」みたいな悲惨な事になるので、
分からないよりは分かった方がいい。
0505デフォルトの名無しさん2016/10/16(日) 12:25:51.62ID:S24dnzpa
道に迷って樹海の奥深く入ってから、抜け出すにはどうしたら良いでしょう、かも知れないw

は冗談だが、ただの興味本位です。
0506デフォルトの名無しさん2016/10/16(日) 12:54:31.83ID:f4ANn6Rk
>>500
ホント、社内の事務処理とか、
何かの商品開発に使うようなものでなければ、
教えてほしいわ。
0507デフォルトの名無しさん2016/10/16(日) 14:11:09.80ID:vO80GlXI
ロート製薬
0508デフォルトの名無しさん2016/10/16(日) 15:30:55.27ID:lWuTgRPC
文字数の大きな値から減らしつつ見つかるまで検索
位置をずらして検索を再帰で実現とか
0509デフォルトの名無しさん2016/10/16(日) 15:58:59.14ID:vXiXdAba
再起処理って嫌われやすいけどちゃんとやるときれいに収まるので好き
0510デフォルトの名無しさん2016/10/17(月) 17:11:10.51ID:32MU29jg
vba初心者で今簡単なピボットテーブルを作っているんだけど、
毎回プロシージャの呼び出し、引数が不正ってでてしまう。Excel 2016です。
ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
0511デフォルトの名無しさん2016/10/17(月) 22:09:22.98ID:pGCt3vVl
>>496のテスト結果は気になるな
0512デフォルトの名無しさん2016/10/18(火) 18:50:16.02ID:IBZ8SVf/
時間差で動くデジタル時計を作りたいのですが
真夜中の12時でかたっぽ停止してしまいます
いろいろ調べた結果

Sub 時計1()
Dim 一分 As Date
一分 = TimeValue(
0513デフォルトの名無しさん2016/10/18(火) 18:50:48.79ID:IBZ8SVf/
Sub 時計1()
Dim 一分 As Date
一分 = TimeValue("0:01:00")
Cells(1, 1) = Now
Application.OnTime Now + 一分, "時計1"
End Sub

Sub 時計2()
Dim 一分 As Date
一分 = TimeValue("0:01:00")
Cells(1, 2) = Now
Application.OnTime Now + 一分, "時計2"
End Sub

表示とSub名以外まったく同じですが
同時に実行すると時計1は0:00で停止しません
時計2は停止します
フォーマットに日付入れたりいろいろ変えても同じです
これはどういうわけでしょうか
0514デフォルトの名無しさん2016/10/18(火) 18:52:39.90ID:IBZ8SVf/
>>512は途中で途切れたので再度上げました

ちなみに変数の待機時間は入れても入れなくても同じでした
0515デフォルトの名無しさん2016/10/18(火) 19:56:28.90ID:R+rxit56
OnTimeに指定している日時を記録してみるとわかるかも
0516デフォルトの名無しさん2016/10/18(火) 19:59:35.54ID:2HRIW/jK
井川はるき著の
そこが知りたいエクセルvbaプロの技
の様な書籍ありませんか?
0517デフォルトの名無しさん2016/10/18(火) 20:23:08.04ID:Rkr+8rjt
それでいいじゃん
0518デフォルトの名無しさん2016/10/18(火) 20:47:41.49ID:2U/oDSXE
>>513
on timeを設定した時刻が重なると上書きされるとか
先にセットした方が優先されるとか

試しにちょうど同じ時刻で二つon timeをセットしてみたら?
0519デフォルトの名無しさん2016/10/18(火) 20:55:32.25ID:kGzTkRLu
>>517
絶版の為、手に入らないのです。
クラスなどについて深く記載されてるらしいので欲しいのですが、アマゾンなどにも出回っていないので、近い内容の書籍があったらたすかるなと思ったのでお聞きしました。
15000円以内だと助かります。
0520デフォルトの名無しさん2016/10/18(火) 21:35:25.00ID:q8Y2lqKG
>>519
多分クラスについての初心者的なことはネットで調べれば十分だと思う。

その辺を踏まえて次のステップに行くなら
正直VBAの本漁っても殆ど情報は出てこない。
やっぱりjavaが一番そういった本が多いね。

一応お勧めとしてはjavaの本だけど
オライリーのデザインパターンの本
https://www.amazon.co.jp/Head-Firstデザインパターン-―頭とからだで覚えるデザインパターンの基本-Eric-Freeman/dp/4873112494

コードも載っているけど概念的な説明から入るのでどういうものか解り易い。
俺もjavaは知らないけどなんとか理解できた。
0521デフォルトの名無しさん2016/10/18(火) 21:46:21.34ID:4Ny7N2e6
デザインパターンなんて経験豊富な上級者が参考に知っておくべき程度の教養
初心者がいきなりそんなもの覚えたところまともに使えないどころか
必要以上にデザインパターンに固執してしまってかえって上達の妨げにしかならんよ
0522デフォルトの名無しさん2016/10/18(火) 21:56:54.58ID:AebkJyW4
>>519
>>520氏の言う通りだと思うけど、もしJava等は知ってるけどVBAの事情を知りたいというなら残念ながらあまり情報はない。
「VBA クラスモジュール活用」とかで検索すればあるけど。
洋書でこれはいいらしい(やはり価格高騰)
https://www.amazon.co.jp/exec/obidos/ASIN/0782129781/thomjp0d-22/
0523デフォルトの名無しさん2016/10/18(火) 22:19:34.39ID:3aNui5NZ
VBAは本当に本読む事が無駄なくらい実例が豊富。
0524デフォルトの名無しさん2016/10/18(火) 22:29:32.27ID:48uEKUjy
変数名、フリスキーモンプチにしようかな・・。
でも、俺しか見ないしな・・。
普通にaにしとくか。
0525デフォルトの名無しさん2016/10/18(火) 22:48:20.77ID:3aNui5NZ
変数名は、ちゃんと機能単位で関数を分けてくれていればいいけど、
色んな機能をそのまま書き込んでいるタイプのものでaとかbとかにされると、
後で読んだときに訳分からなくて困るんだよな(自分で書いたコード見ながら
0526デフォルトの名無しさん2016/10/18(火) 23:04:09.37ID:q8Y2lqKG
>>522
何かっていうとこの本出てくるなぁ
中読んだことないけどそれだけ話題に上るということは良いのかも知れないね
0527デフォルトの名無しさん2016/10/18(火) 23:31:43.22ID:+IoGGEzP
>>519
横浜中央図書館にあるよ。
市民じゃなくても閲覧席があるからゆっくり読める。
近くに風俗街もあるし。
0528デフォルトの名無しさん2016/10/18(火) 23:39:27.41ID:+IoGGEzP
あと技術系の濃いめの資料は神奈川県立川崎図書館はかなり充実しているよ。
近くに競輪場も風俗街もあるし。
0529デフォルトの名無しさん2016/10/18(火) 23:51:31.44ID:AebkJyW4
工都だからな
0530デフォルトの名無しさん2016/10/19(水) 20:55:01.92ID:4EiJpNnx
そりゃ神奈川や横浜に住んでいれば行けるかもしれないだろうけどな
それともその図書館はDVDにコピーするサービスでもやってくれてるのか?
デリヘルはどこまで来てくれるんだ?
0531デフォルトの名無しさん2016/10/19(水) 21:38:07.86ID:o0JXy/15
>>524の発想はデザイナーなかじま かおる。
0532デフォルトの名無しさん2016/10/19(水) 22:14:18.08ID:XiGtjnpX
単純で美しくて応用が利く形で効率のいいコードを書こうとしてうまくいかないのですっかりムカついている。
特に効率と応用が両立しないぞゴラァ!
0533デフォルトの名無しさん2016/10/19(水) 22:39:46.92ID:0fflT7Gv
ゴリゴリ書いてからまとめるやり方をやってる
0534デフォルトの名無しさん2016/10/20(木) 21:45:19.28ID:fztyo9E+
2次元配列を縦に連結する方法ないですか。
For Nextとか、一旦セルにコピーするんじゃなく、
一撃弾平で。
0535デフォルトの名無しさん2016/10/20(木) 22:36:00.75ID:gHA+zw4/
>>534
1 2 3
4 5 6

7 8 9
2 1 3
を連結して
1 2 3
4 5 6
7 8 9
2 1 3
にしたいってこと?

For Nextを使った関数を作るしかないかと。
0536デフォルトの名無しさん2016/10/20(木) 23:12:57.88ID:/SsGDeE8
そもそも二次元配列を使わなくても大丈夫なように設計し直す
0537デフォルトの名無しさん2016/10/20(木) 23:15:22.44ID:gHA+zw4/
1次元でも同じだけどね
0538デフォルトの名無しさん2016/10/20(木) 23:20:29.22ID:/SsGDeE8
まぁね
0539デフォルトの名無しさん2016/10/20(木) 23:28:00.38ID:m4ouL4Z8
一撃弾平って何行くらいのことなんだろう 1行?
0540デフォルトの名無しさん2016/10/20(木) 23:34:27.76ID:gHA+zw4/
まあ1次元だったら Redim Preserve が使えるから少し簡潔にはなるか。
0541デフォルトの名無しさん2016/10/21(金) 00:10:11.43ID:g7JyAyW/
質問の意味がよくわからん
具体例を書いてくれ
0542デフォルトの名無しさん2016/10/21(金) 06:43:28.19ID:j70gXNzH
すみません少し教えていただきたいのですが、
シートに行を挿入したり削除したり出来ない様にイベントを発生させたいのですが、excelvbaで可能でしょうか?
RaizeEventを使うのかなと思うのですが、ネット検索しても情報がないのでお願いします。
0543デフォルトの名無しさん2016/10/21(金) 07:14:09.62ID:ru3MSCG6
>>541
>>535
0544デフォルトの名無しさん2016/10/21(金) 07:20:59.55ID:8srp9xCJ
>>542
シートに行を挿入したり削除したりしないようにするにはシートを保護すればできると思うけど、
「イベントで」のくだりが分からないなぁ。

挿入や削除するときの直前を捕まえてキャンセルしたいってこと?
0545デフォルトの名無しさん2016/10/21(金) 07:30:55.31ID:8srp9xCJ
だとすると削除前を捕まえるイベントはないから
削除されたときを捕まえて元に戻すことになるみたい。

ネットで見たらこんなの載ってた
http://sp.okwave.jp/qa/q3027310.html
0546デフォルトの名無しさん2016/10/21(金) 07:57:41.73ID:K84vLDbs
>>544
>>545
返答ありがとうございます。
行を削除したり挿入した際に特定の処理を発生させたいのです。
0547デフォルトの名無しさん2016/10/21(金) 08:07:22.14ID:RUPp7NOt
イベントを発生させたい
だし意味わからん
Raize とか書いてるからネタの可能性も捨てられないし
0548デフォルトの名無しさん2016/10/21(金) 08:10:45.27ID:RUPp7NOt
>>546
> 行を削除したり挿入した際に特定の処理を発生させたいのです。

>>542
> シートに行を挿入したり削除したり出来ない様に

言ってることがちぐはぐすぎる
0549デフォルトの名無しさん2016/10/21(金) 08:49:36.66ID:O+Ombm1t
警告文を出すだけだったりして・・
0550デフォルトの名無しさん2016/10/21(金) 11:32:46.70ID:3pfbI0SC
>>546
.netとかでよくあるイベントをhandleでキャンセルするタイプをやりたいとか?
0551デフォルトの名無しさん2016/10/21(金) 11:42:55.50ID:NPTRaxQ1
すいません、VBA初心者ですが是非お教え願いたく。

前任者が置いていったあるエクセルファイルについてなのですが、このファイル内にある7枚のワークシート上に、それぞれ1つのクエリデータをアクセスから取り込む形になっています(つまり7つのクエリデータをインポートしています)。
前任者からは、ファイルオープン時にそれらワークシート上のクエリデータを更新する為のマクロを記述しておくので、ファイルを開く時には実行するようにと申し送りされたのですが、そのマクロの中身を見ると、
まずワークシート1に移動(Sheets1.select)し、selection.QueryTable.Refreshメソッド実行(BackgroundQuery=False)、次にワークシート2に移動しそこでまたselection.QueryTable.Refreshメソッド実行、
さらにワークシート3に移動しselection.QueryTable.Refreshメソッド実行・・・以下シート7までこれを繰り返しています。
これはこれでデータとしては正しく更新されるのでいいのですが、シート移動、クエリ更新の繰り返しで結構な時間を待たされます。
一度の命令でファイル内全てのクエリデータを更新することができないものかと思い、質問させていただきました。
宜しくお願いします。
0552デフォルトの名無しさん2016/10/21(金) 11:52:19.37ID:cKA7Tayp
>>551
それってトータルの時間が変わらないような気もするけど、早くなるよって見込みはあるの?
0553デフォルトの名無しさん2016/10/21(金) 12:08:02.59ID:qQvprj9D
ここまで解析できる初心者とはいったい何なのか
0554デフォルトの名無しさん2016/10/21(金) 12:18:04.77ID:K84vLDbs
>>548
すみません。
行を削除、挿入時に処理を行いたいです。
特定の範囲でしか、発生させたくないのですが可能でしょうか?
0555デフォルトの名無しさん2016/10/21(金) 12:30:37.89ID:KQ3X4+w0
ローカルなのかネットワーク上なのか知らんけれど、手動で七回クエリやった方が早いなら手段はある
一緒ならどうしようもない 待つしかない

ん?ボタン一つに1Sheet分のクエリ割り当ててボタン七つを手早くポチポチ押せば早くなるのか?
今度やってみよう  Access側から8Sheetを更新するのはやったことあるが、早くしようとか思ったことは無い
確実に更新されることの方が百倍重要だから
0556デフォルトの名無しさん2016/10/21(金) 12:31:27.54ID:1eYeIrpy
行を削除、挿入時に処理を行うってのは with eventsを使ってどうのこうのと本に書かれてたから
出来るんじゃないかい
0557デフォルトの名無しさん2016/10/21(金) 12:50:39.77ID:RUPp7NOt
>>554
範囲はイベントハンドラ内で判定して範囲外ならなにもしなければいいだけだけど挿入削除に限定するのは無理じゃね?
VBA で undo バッファの中身を参照できればいいんだが
0558デフォルトの名無しさん2016/10/21(金) 15:30:06.27ID:YTB2M68F
別の掲示板で質問したんですけど、解決できなかったので
質問する場所がここでいいのかわかりませんが…

VB.NETでExcelのスライサーを表示させようとしています。
コードの記述方法がわからないため、マクロの記録で出来た
コードをVB.NETに転記してみたのですが、パラメーターが
間違っていますというエラーがでます。

マクロ記録のソース
ActiveWorkbook.SlicerCaches.Add2(ActiveSheet.PivotTables("ピボットテーブル1"), "担当者" _
).Slicers.Add ActiveSheet, , "担当者", "担当者", 0, 0, 150, 200

VB.NET上に転記したソース
book.SlicerCaches.Add2(book.ActiveSheet.PivotTables("ピボットテーブル1"), "担当者" _
).Slicers.Add(book.ActiveSheet, , "担当者", "担当者", 0, 0, 150, 200)

どこを直せばいいのかわからず困っております。
分かる方いらっしゃれば教えてください。
0559デフォルトの名無しさん2016/10/21(金) 19:35:28.32ID:PyVjGIxM
>>558
VBAとVB.NETは異なる言語じゃね?
0560デフォルトの名無しさん2016/10/21(金) 20:34:15.33ID:SKijMLmF
ここの人たちExcel VBAしか知らない人ばっかりだからVB.NETの話ししてもわからないよ
0561デフォルトの名無しさん2016/10/21(金) 21:07:35.79ID:xeCh0sUK
>>558
スライサーのObjectとかは分からないけど
とりあえずいっぺんにやろうとしないで
もう少し分けようか。

どっちにしたってComだから
使うObjectは全て変数に入れて使い終わったら
明示的に解放しないと解放されないし。
0562デフォルトの名無しさん2016/10/21(金) 21:15:09.12ID:ru3MSCG6
>>560
んだんだ、田に戻んべ
0563デフォルトの名無しさん2016/10/21(金) 22:23:52.68ID:aVFrSkNG
>>558
bookがどうやって設定されてるかわからんけど
book.ActiveSheetが想定されたものじゃないんじゃね

まあ再現に最低限必要なコードもエラーメッセージも正確に書かないやつの情報はあてにならんけど
0564デフォルトの名無しさん2016/10/23(日) 23:41:38.70ID:aW3HZ+99
ActiveX画像の、優先表示順位を入れ替えようとすると、クソ重い・・。

オートシェイプ画像なら軽いけど、
弄られたくないからActiveXにしたい。

何とかなりません?
0565デフォルトの名無しさん2016/10/24(月) 01:33:01.35ID:Uhchgf0Y
そんなに多く使わなきゃダメなのか再検討する
0566デフォルトの名無しさん2016/10/24(月) 09:18:58.14ID:OcK9A6lJ
>>559,560
そうですよね…
VB系の掲示板で聞いてもExcelの操作に関しては
あまり回答をもらえないことがあってこちらで聞いてみました

>>561
分けてみたりもしたのですが、スライサーのObjectを取得する際に
既にエラーになってますね…

>>563
ActiveSheet.Nameをするとシート名も返ってくるのでシート自体は
想定された場所を取ってこれてはいます。

とりあえず聞く場所を変えてもう少し頑張ってみます。
回答くださった方ありがとうございました。
0567デフォルトの名無しさん2016/10/24(月) 23:53:02.89ID:5ZagFF8p
TypeNameで、オブジェクトが画像かどうかを調べる時、
「図 1」というデフォ名だと画像と認識しないのに、
「図 1」に変えると画像と認識するんですけど、
このエクセル、なんかバゴってないですかね。
ホント、半角を全角に変える以外、何も変えてないんですけど。
0568デフォルトの名無しさん2016/10/25(火) 11:53:54.61ID:bwb8FIUq
>>558
他の人も書いてるけどvb.netは全く関係ない言語だから1から勉強してね
ヒントとしてはDLL参照でoffice.coreとoffice.interop.excelを入れます
Microsoft.office.interop.〜でvba関数が参照できる
0569デフォルトの名無しさん2016/10/25(火) 21:48:16.58ID:VE8oMcUB
for a=1 to 10
dim b as integer
b=b+1
debug.print b
next a

としたら、bは次々と1ずつ増えます。
おかしくないですか?
dim b as integerの行を通過するときにbはリセットされると思うのですが。
0570デフォルトの名無しさん2016/10/25(火) 21:59:54.02ID:4vxsSSjG
statcなんだろ
0571デフォルトの名無しさん2016/10/25(火) 22:13:21.76ID:oixUAf99
本当におかしいとして、
そんなに b=0 って書くの嫌なのか?

あとピラニアンローズの刑な。
0572デフォルトの名無しさん2016/10/25(火) 22:14:06.62ID:EGdLeg7d
>>569
VBAはプロシージャレベルの変数になるので仕様です
ブロックレベルの変数はありません

https://support.microsoft.com/ja-jp/kb/141693
0573デフォルトの名無しさん2016/10/25(火) 22:20:21.51ID:VE8oMcUB
そうだとしても
dim b as integer を2行書くとエラーが出るのに
for next無いでdim b as integerを1つ書いたら複数回その行を通過しているのにエラーが出ないのはおかしくないですか?
0574デフォルトの名無しさん2016/10/25(火) 22:40:22.53ID:oMEIgCxE
>>573
そんなけったいなコード組んだことないから何ともいえないけど調べて何か分かったら教えてくれ。
For Next 内に変数宣言した場合というのはひょっとすると.Netでも同じことが言えるかも知れないな。
0575デフォルトの名無しさん2016/10/25(火) 22:42:39.94ID:/7P6AN2f
>>569
ならば結論はその前提が
間違えていたとなるね。
0576デフォルトの名無しさん2016/10/25(火) 22:45:58.85ID:xcqxECRe
>>573
Dim ステートメントの行にブレークポイントは置けない。
つまりそこで何かを実行しているわけではない、と解釈できないか?
0577デフォルトの名無しさん2016/10/25(火) 22:52:30.15ID:egkoIRPP
Dim ステートメントは宣言文であって実行文ではないよ
Dim ステートメントでコンパイラ(注)に変数の型を指示してるだけ

(注)
VBAでは明示的にコンパイル作業が必要ないから わすれがちだけど
内部的に コンパイル→実行 ってやってるぞ


>>dim b as integer を2行書くとエラーが出るのに
だから コンパイル エラーなのねw
0578デフォルトの名無しさん2016/10/26(水) 21:15:19.55ID:9BOnbnuh
VBAは、VBAコード→Pコード→オペコードという形で変換されて実行されていて、
Pコードにする際にDimで宣言された変数と値が代入される変数(に当たるコード)が関数の先頭に追いやられている。

つまり昨今の言語ではごく当たり前な2バッチ式コンパイルをしているだけなんだけど、
ブロック変数がないせいでコードを読んだ時の感覚と実際の挙動との隔たりが大きいんだろうね。
0579デフォルトの名無しさん2016/10/26(水) 21:24:10.47ID:Audvuqka
>>578
Dimの前でその変数を使うと怒られるもんな
0580デフォルトの名無しさん2016/10/26(水) 23:14:11.14ID:6rPQDKeR
自分しか見ないのに、
自分の変数名はセンスが無いんじゃないかと不安になる。
自分しか見ないのに。
0581デフォルトの名無しさん2016/10/26(水) 23:32:57.78ID:Audvuqka
>>580
たとえば?
0582デフォルトの名無しさん2016/10/26(水) 23:40:53.24ID:LebVIXiL
一度見せる快感を知ってしまうとところ構わず誰にでも見せたくなるんだよね
0583デフォルトの名無しさん2016/10/26(水) 23:45:20.79ID:6PxwPUcP
>>580
おれも
0584デフォルトの名無しさん2016/10/26(水) 23:59:47.76ID:6rPQDKeR
>>581
For yoko = 1 to 10
 Cells(1,yoko)・・・
Next

vlup = WorksheetFunction.Vlookup・・・

cell_hani = Range("A1:D16")

tx1 = Me.TextBox1.Text

なんか・・そのまんま。
0585デフォルトの名無しさん2016/10/27(木) 01:44:05.06ID:o34mWVu+
ちょっと質問です
zipファイルを解凍しないで中に特定のフォルダやファイルがないか調べる方法はないでしょうか?
仕事上拡張子に頼らずにOfficeファイルの種類を判別する必要が出てきたので

http://d.hatena.ne.jp/tt_clown/20090819/p1

を参考にしてExcel VBAでファイルフォーマットを調べるマクロを書いて一応成功したのですが、
このやり方だとOffice2007形式のファイルはzipとみなしてCopyHereメソッドで解凍する必要があるので、
数百KB程度の大して大きくないサイズのファイルを1つ判別するのにも10秒くらいかかってしまいます
(Office2003形式の場合はバイナリを読み込んでファイル先頭付近のマジックナンバーを探す方法なので
数十MBのサイズの大きなファイルであってもはるかに高速に判別できる)
必要なのは解凍処理ではなく、zipファイル内部の特定の場所に特定のファイルがあるかどうか知ることなので、
解凍せずにそれができればもっと早く判別できるのではと思ったのですが、実際に可能なのかどうかわからず
頭を抱えています
もし外部のライブラリ等なしでそれが可能でしたら教えてもらえるとありがたいです
0586デフォルトの名無しさん2016/10/27(木) 04:02:39.56ID:s+hjDNi9
>>585
バイナリで先頭の方だけよみこんでマッチするか調べたらどうだろう
たとえば0x1000までに以下のパターンが出ればdocxと判定するとか
word/document.xml
77 6F 72 64 2F 64 6F 63 75 6D 65 6E 74 2E 78 6D 6C

今ちょっとファイル見ただけだから適当だけど
もっと補完する情報があれば足した方がいいと思う
これだけじゃ精度が心配だから
0587デフォルトの名無しさん2016/10/27(木) 12:43:58.17ID:uoSnPm98
>>580
作ってる時: センスあるじゃん俺
一週間後に見てる時: なんだこのセンスよ欠片もない名前つけたの誰よ... orz
0588デフォルトの名無しさん2016/10/27(木) 13:03:54.55ID:dGx1j3A/
>>584
vlupって...
なんとかnameとか、なんとかvalueとか、探しているモノに応じて名付ければいいだけじゃないの?
0589WEBクエリ2016/10/27(木) 17:45:28.18ID:8avn7aCO
エクセルVBAを使ってWEBクエリでシート上にデータを取り込みたいと思っています。
データにコロンが含まれるとデータの書式がユーザー定義の時間となり困っています。
あらかじめデータを取り込むシート全体を文字列にしてもダメでした。
解決策や別の方法等あればお知恵をお借りしたくよろしくお願いいたします。

過去に同じようなこと質問をされている方がいらっしゃいましたがそちらでは解決しなかったようです。
http://okwave.jp/qa/q8943600.html
0590デフォルトの名無しさん2016/10/27(木) 18:21:04.81ID:ULPMzfgg
>>589
クエリの設定の中に指定できる所があったと思ったけど
0591WEBクエリ2016/10/27(木) 19:41:23.25ID:8avn7aCO
>>590
ご返信ありがとうございます。

ハイフンやスラッシュに対しては「日付認識を無効にする」が有効なんですが
コロンに対するものがあるのかもう一度自分なりに調べてみます。
0592デフォルトの名無しさん2016/10/27(木) 20:21:29.86ID:noYS4HoA
質問します
セル範囲の重複部分はintersectで取得できますが
Set Rng1 = Range("A1:D5")
Set Rng2 = Range("C4:E10")
Set Target = Intersect(Rng1, Rng2)
重複しない部分(Rng1からRng2を除いた部分)はどうやったら取得できますでしょうか
0593デフォルトの名無しさん2016/10/27(木) 21:23:47.94ID:3i9jCYg7
>>592
range1の各セルでintersectがfalseのセルをdictionaryに追加する
0594デフォルトの名無しさん2016/10/27(木) 21:39:10.40ID:3i9jCYg7
>>593
これを2分木みたいに半分のレンジでやって
更に半分でやって更に半分でやって
0595デフォルトの名無しさん2016/10/27(木) 21:41:36.74ID:3i9jCYg7
レンジ1のセルに0を書き込んで
レンジ2のセルに1を書き込んで
0のままのセルがレンジ1-レンジ2
0596デフォルトの名無しさん2016/10/27(木) 21:50:50.84ID:noYS4HoA
>>593-594
ありがとうございます
ForEachで回すしかないんですね
重なりのないセルをunionで蓄積していくのかと思いましたが
dictionaryの方が処理が早いんですかね
dictionaryに追加して最後に範囲にさくっと変換できましたっけ
2分木はむずかしそうなので私には無理です
0597デフォルトの名無しさん2016/10/27(木) 22:26:55.65ID:m+eE2WYv
>>592
これは面白い質問だね。
やり方は色々あるから色んな答えが挙がりそうだよ。

ちなみに自分だったら
もしそのセル範囲にテーブルのようにヘッダがついてたらSQL投げて取得するかな。
0598デフォルトの名無しさん2016/10/28(金) 00:05:45.43ID:c60G8k2P
本当に用途が気になるのばっかだな。
0599デフォルトの名無しさん2016/10/28(金) 00:50:53.59ID:2KwqNiX5
>>592
セル範囲の引き算
Forでひたすらループする方法、言うのは簡単だけど実装は微妙に面倒だった
取得と言うよりは再構築してる

Sub Macro1()
  Set rng1 = Range("A1:D5")
  Set rng2 = Range("C4:E10")
 
  s = ","
  For Each c In rng1
    s = s & c.Address(0, 0) & ","
  Next
  For Each c In rng2
    s = Replace(s, "," & c.Address(0, 0) & ",", ",")
  Next
  a = Split(s, ",")
  Set t = Range(a(1))
  For i = 2 To UBound(a) - 1
    Set t = Union(t, Range(a(i)))
  Next
  Set Target = t
End Sub
0600デフォルトの名無しさん2016/10/28(金) 06:24:47.34ID:3G27cx4X
>>586
ありがとうございます
Office2003形式の場合はマジックナンバーの出現地点が決まっていたのでそこだけ読めばOKでしたが、
2007形式でその方法となると出現地点が必ずしも固定ではないのが悩みどころですね
仮に指定した範囲を適当な配列に読み込むとして、その中に任意のバイト列があるかどうかの判定は
やはり自作関数でやるしかないですかね・・・??
0601デフォルトの名無しさん2016/10/28(金) 10:12:26.95ID:lL0cSoUl
>>585
VBAで使えるZIP用のライブラリとか、昔はいくらでもあった気がするんだが
ZIPがエクスプローラー標準で扱えるようになって見なくなったな

たぶんUNZIP32.DLLとか7-ZIP32.DLLとか使えばいけるんじゃね
0602デフォルトの名無しさん2016/10/29(土) 01:24:26.69ID:Ku4sBrlI
【今週の予言】
私はは、参照渡しを覚え、嬉しくなって使いまくることになりますが、
フラグ管理が面倒になり、結局、全部Publicにしてしまう事でしょう。
0603デフォルトの名無しさん2016/10/29(土) 01:38:52.21ID:H+ayOhDL
日本語でおk
0604デフォルトの名無しさん2016/10/29(土) 04:50:57.89ID:3gyU/Q8i
多分他のモジュールから関数を呼んで
参照渡しされた引数に設定したものを
呼ばれた側で変更する方法を最近覚えて
使いまくろうかなと思っていたんだけれど
よくよく考えてみたら沢山フラグとかを
引数で渡したりするのは面倒なので
結局変数をPublicにしておいて
モジュール間をやり取りすることに
なるんじゃないかと言いたかったとエスパー。

そうだとすればプロパティや
エンティティクラスを作って渡してやれば
解決なんだけど多分まだそこまでは
覚えていないって感じか。
0605デフォルトの名無しさん2016/10/29(土) 07:10:27.55ID:Hi/Ho+7t
>>604
器用な人がいるよねー
俺なんか渡し方をいくらシンプルにしても状態がたくさんあること自体が脳のキャパを超えてしまってダメだわ。
0606デフォルトの名無しさん2016/10/29(土) 07:24:39.06ID:ozL8cz/2
>>604
自分まさにそうだわ
関数A→B→Cと下請け関数を呼んでいく構造の時
共通するフラグ変数を引数でバトンタッチしていくのが苦痛なのでPublicにしてしまう
0607デフォルトの名無しさん2016/10/29(土) 07:47:49.35ID:H+ayOhDL
メソッドを跨いで依存関係のある処理は極力省くからそんな事態にはあまりならないなぁ
やってもprivateのメンバ変数まで

どうしても外の処理結果で処理をわけたいし同じような処理なのでまとめたいってなったらクラスにしちゃう
0608デフォルトの名無しさん2016/10/29(土) 09:56:28.49ID:ozL8cz/2
>>607
例えば、シートを印刷する処理で
Sub A:ユーザーにシート名、「印刷」or「印刷ページ数を表示してから印刷」を選択させBへ
Sub B:印刷ページ数表示の指定だったらページ数を数えてCへ
Sub C:対象シートをフラグに従って印刷、またはページ数表示してから印刷する

これだとシート名と印刷フラグをABCと引数で受け渡していく必要があるのだけど
クラスにすると解決するのなら勉強してみようかな
0609デフォルトの名無しさん2016/10/29(土) 10:25:50.24ID:H+ayOhDL
例だからかもしれないけど
そもそもマクロ組む必要性を感じない

俺ならページを表示させたりさせなかったりしなきゃならないエクセルの運用を見直す
0610デフォルトの名無しさん2016/10/29(土) 10:40:27.53ID:DOcPl4sK
>>608
> これだとシート名と印刷フラグをABCと引数で受け渡していく必要があるのだけど
Type 印刷条件型
シート名 As String
ページ数表示 As Boolean
ページ数 As Integer
フラグ As ...
End Type

Dim 印刷条件 As 印刷条件型
Call A(印刷条件)
Call B(印刷条件)
Call C(印刷条件)
0611デフォルトの名無しさん2016/10/29(土) 15:22:28.05ID:8grHgeXD
>>610
ユーザー定義型って他のモジュールの関数の引数に使うときPrivate指定で出来るんだっけ?
Public指定なら引数にする必要性ないんだが。
0612デフォルトの名無しさん2016/10/29(土) 16:21:02.37ID:ZloojbFD
>>611
> ユーザー定義型って他のモジュールの関数の引数に使うときPrivate指定で出来るんだっけ?
Public Type 印刷条件型

> Public指定なら引数にする必要性ないんだが。
意味わからん
型と変数の区別がついてないのか?
0613デフォルトの名無しさん2016/10/29(土) 16:46:20.85ID:3gyU/Q8i
>>612
いや、標準モジュールにユーザー定義型を設定することを前提に言ってるんじゃないのか?
クラスにユーザー定義型を設定するのはこのケースだとあまり意味がないぞ。
クラス自体をエンティティとしてそのインスタンスを引数に渡せばいいだけだからな。
クラス自体に変数を纏める役割を持たせることが出来るので
わざわざユーザー定義型を設定する意味がない。
0614デフォルトの名無しさん2016/10/29(土) 16:55:04.62ID:3gyU/Q8i
ついでを言うとPublic指定であれば>>607の言う通り依存関係の問題もある。
その観点で言えばプロパティやセッタ、ゲッタで渡せないなら引数にしないで直接やり取りしてしまっているのと同じ。
ただ変数が纏められているというだけで、
それならまだDictionaryを引数に渡してやるほうがマシ。
0615デフォルトの名無しさん2016/10/29(土) 17:47:37.89ID:8r545GuT
>>608
ユーザにページとかを指定させるGUIはフォームなんじゃね?
そのフォームから値を取れば良いんじゃないの?
シートの関数とかの引数ならそのセルから値を取れる
0616デフォルトの名無しさん2016/10/29(土) 18:09:47.45ID:ZloojbFD
>>613
> クラスにユーザー定義型を設定する
誰もそんな話しはしてない
クラスを使いたいならそうすればいい
クラスファイルを別に作るとか面倒だとは思うけど
ただインテリセンスも効かない Dictionary を勧めるのはアホすぎる
0617デフォルトの名無しさん2016/10/29(土) 18:18:27.88ID:8r545GuT
>>616
インテリセンスが効かないって例えばどんなとき?
0618デフォルトの名無しさん2016/10/29(土) 18:28:37.14ID:ZloojbFD
>>617
Dictionary 使ったこと無いの?
0619デフォルトの名無しさん2016/10/29(土) 18:30:12.36ID:3gyU/Q8i
>>616
何がいいたいのか分からない。だとすれば
>>612で俺に「変数と型の区別がついていないのか」と聞いた意図は何なのか?

もちろんDictionaryを使う方法は最善とは思っていない。
むしろよりスマートな方法を既に提示している通り、
この方法はお勧めしないが、それでもユーザー定義型を使って依存関係を崩すくらいなら
まだDictionaryを使った方がマシだと言っただけだ。

ちなみにDictionayにインテリセンスが効かせられないと言っていたが、
今回のケースは別にDictionary側にインテリセンスを利かせる必要はない。
引数名に当たるものを呼ばれる側のモジュールに定数でも良いので定義しておいて、
それをゲッタかリードオンリーのプロパティで取得すれば良い。
0620デフォルトの名無しさん2016/10/29(土) 19:02:35.59ID:k6C/Bs81
Directory型は参照設定すればインテリセンスが効く。
0621デフォルトの名無しさん2016/10/29(土) 19:05:45.44ID:3gyU/Q8i
>>620
いや、流石にそう言う意味で言っているほど
レベルが低い訳ではないと願いたい。
0622デフォルトの名無しさん2016/10/29(土) 19:17:23.84ID:ZloojbFD
>>619
マジで言ってるのか引っ込みつかなくなってるのかはっきりしてくれ
話はそれからだ
0623デフォルトの名無しさん2016/10/29(土) 19:19:33.51ID:3gyU/Q8i
>>622
もちろんおおマジだ。
だからまず最初の問いに答えてくれ。
こっちはまずそっちが何を言いたいのか
よく分からないんだ。
0624デフォルトの名無しさん2016/10/29(土) 19:30:35.46ID:ZloojbFD
>>623
> ユーザー定義型って他のモジュールの関数の引数に使うときPrivate指定で出来るんだっけ?
型を Public にすればできる

> Public指定なら引数にする必要性ないんだが。
変数自体は Private にもできるし Sub/Function 内に定義した変数でも渡せる
Public にする必要はない
0625デフォルトの名無しさん2016/10/29(土) 19:38:32.30ID:3gyU/Q8i
>>624
一番最初の話に戻るんだが、他のモジュールに
ユーザー定義型で指定した頭の部分そのものをPrivateのかたちで
プロパティやゲッタで渡せるんだっけ?

Publicで渡すのは結局話の起点になっている>>602の方式と何ら変わりがないことと
何度も言っているが依存関係を壊すので俺的には無しだと思っているが。
0626デフォルトの名無しさん2016/10/29(土) 19:56:41.11ID:biIggA6X
定義するのは型であってインスタンスではない

publicなインスタンスは扱いが難しいので俺ならあまり使わないだけ
0627デフォルトの名無しさん2016/10/29(土) 20:02:06.07ID:ZloojbFD
>>625
> 頭の部分そのもの
オレオレ用語で言われてもわからん

> プロパティやゲッタで渡せるんだっけ?
試せよ

> Publicで渡すのは
(変数そのものは) Private でもローカル変数でもいいと書いてあるんだが

> 何度も言っているが依存関係を壊すので俺的には無しだと思っているが。
Public で渡すとか言ってるのはお前だけ
0628デフォルトの名無しさん2016/10/29(土) 21:11:59.62ID:3gyU/Q8i
>>627
調べてみた。状況によっては使えるようだが、
状況によっては使えないようだ。

http://oshiete.goo.ne.jp/qa/2157914.html

俺の中ではこの方法は却下という結論が出たのでもういいや。
0629デフォルトの名無しさん2016/10/29(土) 21:39:13.76ID:ZloojbFD
>>628
なんで話にも出てない複数の型を受ける関数の話を持ってきたのか理解に苦しむが
> もういいや。
と言うのが君にとって正解だと思う
0630デフォルトの名無しさん2016/10/29(土) 21:46:31.28ID:256R+KmZ
>>629
簡単なことだ。クラスで設定すれば何も問題起きないところを
ユーザー定義型を使えば問題が発生することがあるのであれば
モジュール跨ぎの際は使わない方が賢明だろう。
0631デフォルトの名無しさん2016/10/29(土) 21:57:38.71ID:ZloojbFD
>>630
そんなケースがどんだけあるんだ?
って話
必要もない場所でそんなことする奴は単なるアホ
0632デフォルトの名無しさん2016/10/29(土) 22:29:17.19ID:256R+KmZ
>>631
どうやら多態性に対する知識は持ち合わせていないようだな。
君がこういうことがどういうケースに当てはまるか想定出来ない時点でそれは理解出来た。

つまりインターフェースを使うどころかVariantに入れるような真似をしてもユーザー定義型であれば
多態性を持たせることが出来ないということだ。

「そんなケースがどんだけあるんだ?」と言ってるということは
今までにそういうごく一般的なケースに当たったことがないということだろうから
まぁ仕方ないんだろうけどな。
これは知識不足というより経験不足の類だな。
0633デフォルトの名無しさん2016/10/29(土) 23:28:42.86ID:Hi/Ho+7t
実験してみたらVBAでもVariantで別種のクラスインスタンスを受け取ってダックタイピングができるんだな。
上手く使えばなんかできるかも。
0634デフォルトの名無しさん2016/10/30(日) 00:03:33.14ID:Fr0VQAVA
インターフェースを継承できるからダックタイピングも当然出来るけど、
下手にこだわるよりもレコードセットか何か作って入れてしまった方が汎用性も保守性も高いから、
異なる形式のファイルを読み込む際とかの非常に限定されたケースでしか使わないんだよな。
0635デフォルトの名無しさん2016/10/30(日) 00:38:19.36ID:m1gQvIw9
そう?俺はクラス派だな
レコードセットは複数の配列やオブジェクトをしまうのに向いてないし
クラスは上手く使えば一挙に分岐を減らせるから好き
0636デフォルトの名無しさん2016/10/30(日) 01:28:15.97ID:eH6CF+l2
ググると、バグの原因になるから、
何でもかんでもPublicにしないようにって書いてあるのを見るけど、
そもそもPublicだったら何が悪い?
メモリを余計に消費するとか、重いとか?
変数名が被った時だけの問題?
0637デフォルトの名無しさん2016/10/30(日) 01:37:02.64ID:o8ctfvwB
バグの原因になるからって理由を書いてるのになんでって聞かれても困ります
0638デフォルトの名無しさん2016/10/30(日) 02:15:31.64ID:Fr0VQAVA
>>636
変数名がかぶった時だけの問題。

あと自関数内→モジュール全体→プロジェクト全体の順で変数を見つけに行くから、
別モジュールに書かれたPublic変数を使う時は少し処理が遅くなるらしいけど、
そもそもそんなアホな事しないから実験する気力もない。
0639デフォルトの名無しさん2016/10/30(日) 06:26:55.45ID:uBoGqZ5D
>>634
いや、継承とかじゃなくて関係ないクラス間でもダックタイピングできるって意味。
0640デフォルトの名無しさん2016/10/30(日) 08:25:57.80ID:2kQlDpFE
>>632
で、>>608 のどこに多態が必要なんだ? w
そもそも継承できない VBA のクラスって結局 >>628 のリンク先のように自分で分岐を記述する必要があるから面倒なだけでほとんどメリット無いし
カプセル化のために使うならまだしも VBA のクラスで多態って言う奴はまともなオブジェクト志向の言語を使ったこと無いんだろうと思う

>>633
>>682 のリンク先の回答者も Variant で受けてるけど本来は Object で受けるべき
0641デフォルトの名無しさん2016/10/30(日) 09:33:13.44ID:VEnZGhDR
うわぁ・・・
0642デフォルトの名無しさん2016/10/30(日) 10:00:12.63ID:uBoGqZ5D
>>628 のリンク先を今さらながら見てみたが
>If TypeOf arg1 Is Class1 Then '引数がClass1
とか確かに良くないな。
ダックタイピングの方がずっとまし。
0643デフォルトの名無しさん2016/10/31(月) 21:07:01.13ID:KAknawzj
>>640
なぁ、こんな酷い突っ込みどころ満載のレス、
どこから突っ込めばいい?

>そもそも継承できない VBA のクラスって結局>>628 のリンク先のように自分で分岐を記述する必要があるから面倒なだけでほとんどメリット無いし

これは完全に知識不足。
リンク先がそうなっているからって
VBAで通常あんなところに分岐を記述する必要など全くない。

>カプセル化のために使うならまだしも VBA のクラスで多態って言う奴はまともなオブジェクト志向の言語を使ったこと無いんだろうと思う

全く意味不明。
10歩譲って「オブジェクト志向」は唯の書き間違い
(それでも普段オブジェクト指向という文言を使っていればこんな自動変換にはならないはず)
だったとしても、
多態性を持たせる為に.Netでいうクラスの継承しか使ったことがないような発言だが、
だとしたら余りにも陳腐。

>>682 のリンク先の回答者も Variant で受けてるけど本来は Object で受けるべき

これはもう目も当てられない。
「お前、型を舐めてるだろ」としか言いようがない。
もちろんVarian型も駄目だがObject型も同様に駄目だということを全く理解していない。
よくこれで人に「オブジェクト志向の言語を使ったこと無いんだろう」なんてドヤ顏で言えたもんだ。
0644デフォルトの名無しさん2016/10/31(月) 21:18:45.29ID:PlDOR6RY
>>643
バカの特徴: ダメ出しするけど正解は書かない(書けない)
0645デフォルトの名無しさん2016/10/31(月) 21:20:56.68ID:KAknawzj
>>644
ここまで色々書いても全く読み返しも調べ直しもしない奴に与える知識などない。
0646デフォルトの名無しさん2016/10/31(月) 21:24:42.83ID:ZJdINGKM
戻り値はともかく引数はVariantで受けるべき。
VBAはVariant型でやりとりするタイプのオブジェクト指向言語なので、
これをつぶしに掛かるとか愚の骨頂。

関数なりメソッドなりの内側で型チェックするかエラーをキャッチして弾くべき。
0647デフォルトの名無しさん2016/10/31(月) 21:28:20.50ID:J/jjf+10
>>646
>VBAはVariant型でやりとりするタイプのオブジェクト指向言語なので、
www
0648デフォルトの名無しさん2016/10/31(月) 21:31:51.10ID:KAknawzj
>>647
セル範囲や配列のことを考えると
まぁ言いたいことは分からないでもないんだけどな。
0649デフォルトの名無しさん2016/10/31(月) 21:52:33.89ID:ZJdINGKM
このスレで語られるOOPにいつも違和感があったんだけど、
もしかしてカプセル化・多態性・継承だけがOOPと呼ばれるものだと勘違いしてる?
0650デフォルトの名無しさん2016/10/31(月) 21:54:56.76ID:PlDOR6RY
>>645
はいはい w
知ったかの知識なんて要らんしどうでもいいわ

>>648
セルとかDBから受けたりする時はそうすればいいと思うよ
でも >>628 のケースは違うでしょ
0651デフォルトの名無しさん2016/10/31(月) 22:00:12.02ID:KAknawzj
>>649

大体ここ見てるとそんなものだと思うけど、
他に何かあるっけ?

https://ja.m.wikipedia.org/wiki/オブジェクト指向プログラミング

ちなみにLinqとかラムダ式はVB.NetやC#で使えるものの、あれは関数型言語の範囲という認識。
0652デフォルトの名無しさん2016/10/31(月) 22:04:37.62ID:KAknawzj
>>650
知ったかってことにしておかないと
面目も立たないしな。

でもある程度知識がある人が見ると>>640は見た方が赤面するレベルだということは
知っておいた方がいい。
0653デフォルトの名無しさん2016/10/31(月) 22:10:15.48ID:34rFxEXF
>>646
それは暴論だし型チェックはまっぴらごめんだ。
しかしVBAはいろんな原則論をスルーできる言語ではある。
0654デフォルトの名無しさん2016/10/31(月) 22:20:05.22ID:PlDOR6RY
>>652
具体的に何も書けないから知ったかって言ってるだけ
ダメ出しだけならアホでもできる
ここら辺で >>628 を自慢の知識でかっこよく書いて見たらいいんじゃね? w
0655デフォルトの名無しさん2016/10/31(月) 22:28:37.72ID:Zh9I3UBQ
>>652
なるほど確かにこれはちょっとw

\(//∇//)\
0656デフォルトの名無しさん2016/10/31(月) 22:32:50.93ID:ZJdINGKM
>>651
そのページにも書いてあるけどOOPの基本はメッセージングだよ。
共通の抽象型でやりとり出来るVBAはオブジェクト指向言語の範疇内。
0657デフォルトの名無しさん2016/10/31(月) 22:47:59.64ID:KAknawzj
>>656
ああ言われて見ると確かにそっちの方が基本だわな。
ただ「共通の抽象型」って何を持ってそう呼ぶの?

例えば二つの自作クラスを使用するときにVariant型やObject型も含めてそう呼んでそれを許容する?
0658デフォルトの名無しさん2016/10/31(月) 22:52:00.50ID:KAknawzj
悪い。説明が中途半端だ。
二つの自作クラスのインスタンスを格納するとき、Variant型やObject型も「共通の抽象型」と呼ぶのかと、それをそう使うことを許容するのか、ということね。
0659デフォルトの名無しさん2016/10/31(月) 23:00:44.80ID:KAknawzj
>>655
もういいよそいつは。
実際このスレにも以前同じような、って言うか
呼び口を変えることで違う挙動をするような
真逆のパターンのコードを書いてたりしているんだけどそれすら目を通していないか
或いは理解出来ない程度ということだろう。
0660デフォルトの名無しさん2016/10/31(月) 23:24:59.37ID:vEy2KB8X
何か最近変数病になってきた。
100件もいかないような軽い処理なんか、
別に未指定(Variant)でいいのに、一々指定しちまう。

後、全然関係ないが、
絶対DimよりDomの方が格好いいって。
0661デフォルトの名無しさん2016/10/31(月) 23:29:46.78ID:PlDOR6RY
>>659
はいはい w
0662デフォルトの名無しさん2016/10/31(月) 23:33:10.41ID:KAknawzj
>>661
残念だったな。その無知のまま死ぬまでVBAで安月給でこき使われればいいと思うよ。
0663デフォルトの名無しさん2016/10/31(月) 23:50:59.11ID:PlDOR6RY
結局 >>644 で言った通りだったな
別に俺は VBA で頑張らなくても C++, C#, PowerShell とかから Excel 使えるからなんの問題もないし
そもそも VBA で飯食ってる訳じゃなくて半分趣味だし
まあ >>662 は頑張って VBA を極めればいいんじゃね? w
0664デフォルトの名無しさん2016/10/31(月) 23:54:20.41ID:KAknawzj
>>663
はいはいwww
0665デフォルトの名無しさん2016/10/31(月) 23:55:45.56ID:5Lvs06Cq
>>660
100件て処理件数のこと?

軽い処理ならローカル変数使わない技にチャレンジすると面白いよ。
つまり引数と関数名以外には変数というものを使わない縛りだ
0666デフォルトの名無しさん2016/11/01(火) 00:00:31.36ID:jYbqWcmm
触るな危険
0667デフォルトの名無しさん2016/11/01(火) 00:05:09.66ID:Y7fan+vq
>>663
地雷臭しかしない
0668デフォルトの名無しさん2016/11/01(火) 03:56:57.25ID:x4knKNqk
>>657
OOP自体は共通の型であれば整数型でもString型でも成立する。
VBAはOffice製品全体を操作する事が目的なのでVariant型のみが「共通の抽象型」と言える。
0669デフォルトの名無しさん2016/11/01(火) 04:03:54.73ID:2HgdLJ2l
VBAのwebbrowserでandroidにuseragnt偽装。
調べても全然出てこないんで書き逃げ

Private Declare Function UrlMkSetSessionOption Lib "urlmon.dll" _
(ByVal dwOption As Long, ByVal pBuffer As Any, _
ByVal dwBufferLength As Long, _
ByVal dwReserved As Long) As Integer


Private Sub UserForm_Initialize()

Dim UserAgent As String
UserAgent = "Mozilla/5.0 (Android; Tablet; rv:26.0) Gecko/26.0 Firefox/26.0"

Dim ret As Integer
ret = UrlMkSetSessionOption("&H10000001", UserAgent, 62, 0)

Me.WebBrowser1.Navigate "http://google.com";

End Sub

このままだとスクリプトエラーが出るので、WebbrowserのIEのバージョンを変更
ttps://www.ipentec.com/document/document.aspx?page=csharp-change-webbrower-control-internet-explorer-version
を参考に実行ファイルはEXCEL.EXEでレジストリの設定
0670デフォルトの名無しさん2016/11/01(火) 07:34:56.36ID:RNE49ydt
>>668
「VBAで共通の抽象型と言えばVariant」というそちらの主張は分かったけど、
>>658で言うように二つの自作クラスのインスタンスを同じ変数に格納したいときVariant型を使うの?
0671デフォルトの名無しさん2016/11/01(火) 09:28:00.71ID:jIYKFvUJ
Win7 IE11からWin10 IE11の環境に変えたらIEオブジェクトのReadyStateがちゃんと変化しなくなって、
以前は正常に使えていたプログラムが止まるんですが、
ページの表示完了を調べるにはどうすればいいんでしょうか?

ぐぐったらVisibleを操作すればいいとあったのですが、確かにそれでも動くのですが画面がチカチカするのと、
動作中に別のアプリを立ち上げるとVBAがエラーで止まってしまうので困っています
0672デフォルトの名無しさん2016/11/01(火) 11:59:29.90ID:lqbzbD2j
インターフェイスには依存の前後関係の問題があるから結局使いにくい
0673デフォルトの名無しさん2016/11/01(火) 12:07:49.71ID:RNE49ydt
>>672
それは設計の問題じゃないのか?
0674デフォルトの名無しさん2016/11/01(火) 12:14:56.41ID:lqbzbD2j
>>673
後からじゃグルーコードでしか対応出来ないよね
0675デフォルトの名無しさん2016/11/01(火) 12:44:21.90ID:OMcNOMYM
>>670
そいつに具体的な話を聞いても無駄だよ
0676デフォルトの名無しさん2016/11/01(火) 12:49:16.62ID:OMcNOMYM
>>671
ReadyState はサポートしないから代わりに onload イベント使え
ってことらしい
https://msdn.microsoft.com/ja-jp/library/bg182625(v=vs.85).aspx
0677デフォルトの名無しさん2016/11/01(火) 15:50:45.84ID:B6kgVjS6
Dim って何の略?
0678デフォルトの名無しさん2016/11/01(火) 16:05:27.81ID:QvtFUXm4
dimension
0679デフォルトの名無しさん2016/11/01(火) 17:56:49.62ID:jIYKFvUJ
>>676
今までのようにプロパティをチェックする方法は使えなくて、イベントハンドラを書かないとだめのようですね
だいぶ面倒そうですが、ちょっとやってみます
0680デフォルトの名無しさん2016/11/01(火) 20:29:54.74ID:x4knKNqk
>>670
いまいち言っていることが分からないけど、

Dim v As Variant
Set v = New 自作クラス

とした場合に、これは自作クラス型ではなくVariant型であると考えているなら、
そもそもVariant型というものに対するイメージが間違っている。
この場合はNewした自作クラス型インスタンスのポインタをVariantに渡しているだけ。

あるいは「二つの自作クラス間でのやりとりにVariant型が適していない状況でも共通の抽象型として強いるべきか」という意味なら、
引数と戻り値の型を意識しなくて済むようにするのがOOPの第一義なので、
「俺はコマンドプロンプトの様な文字列だけで機能が完結するプロジェクトを作るぜ!」とかでない限りはVariant型が無難。

もしこれが答えにならないとしたら、もうちょっと詳しく説明してくれないと理解が及ばないわ。
0681デフォルトの名無しさん2016/11/01(火) 21:01:48.60ID:lMJOpFFx
>>680
関数の引数を ByRef v As Variant としてクラスインスタンスを渡すんでしょ?
(この場合 ByVal でもいいけど)

で、v をどう使うの?TypeName は見るの?
0682デフォルトの名無しさん2016/11/01(火) 21:03:10.68ID:II5/lrXv
>>680
そうだな。すまん、説明が少し足りなかった。
まず、なぜ「二つの自作関数」としたかについて。
Variantを使わざるを得ないケースもあるので、それを除外するためにそういうケースに限定させてもらった。
簡単にいうと、もしAとBという二つのクラスが存在した場合、
そのインターフェースを作成して型の安全性を担保しないのかということが聞きたかったんだ。
どちらかと言えば後者のほうの話だな。
0683デフォルトの名無しさん2016/11/01(火) 21:07:19.57ID:HKalO/rx
>>680
> 引数と戻り値の型を意識しなくて済むようにするのがOOPの第一義なので、
はあ?
お前はスクリプト言語でも使っとけよ...
0684デフォルトの名無しさん2016/11/01(火) 21:10:31.09ID:II5/lrXv
>>674
そりゃデータベースのオブジェクトマッピングとか
テーブル構成を変更したら作り直しになるケースもあるとは思うけど、
出来る限り追加で済ませて変更を行わないようにしてデグレ検証の工数を減らせるように
設計の時点で結合度を下げてきちんと役割考えて作っておけばかなり対応出来るとおもうけどなぁ。
0685デフォルトの名無しさん2016/11/01(火) 21:41:34.39ID:x4knKNqk
>>682
必要なOffice製品の操作を自作クラスでラップして、共通のインターフェースのみで例外なくやりとりするっていう前提なら
そのクラスは「共通の抽象型」と呼べると思う。

でも継承を含む方の、広義のOOPが目的としている生産性第一の考え方を前提とした場合、
VBA上でそんな事をするのはOOPと言えるのかどうか・・・。
0686デフォルトの名無しさん2016/11/01(火) 21:56:41.23ID:S2XAyews
まぁね。VBAは何も考えずにちょろっと作ってしまった方が効率いい場合もあると思うよ。
0687デフォルトの名無しさん2016/11/01(火) 21:58:59.56ID:S2XAyews
なんか今日はIDが変わるなぁ
ちなみに>>685にレスしてる俺は>>682と同一人物ね。
0688デフォルトの名無しさん2016/11/01(火) 22:48:08.08ID:4xEbagYF
そんなに似たクラスを作ることが少ないからなぁ
0689デフォルトの名無しさん2016/11/02(水) 06:54:16.45ID:64RcP31b
ここは質問スレなので VBA で OOP スレでも作ってそっちでやってくれ
0690デフォルトの名無しさん2016/11/02(水) 11:42:10.89ID:Yw0kRdid
>>689
まあまあ。
どうやっても不便さが解消されないからしょうがないのさ
無毛な議論だけどね〜
0691デフォルトの名無しさん2016/11/02(水) 11:55:25.28ID:R/WpPams
エクセルとしてはメインの機能じゃないし仕方ないね
0692デフォルトの名無しさん2016/11/02(水) 13:00:59.81ID:A9UccZAb
なんで変数の宣言がディメンジョンなのはどうして?
0693デフォルトの名無しさん2016/11/02(水) 15:02:30.51ID:qOvtD6b4
>>692
dimentionには「大きさ」という意味がある
変数の表現できる範囲やビット幅、消費するメモリ量などを定義しているから「大きさ」で問題ない
0694デフォルトの名無しさん2016/11/02(水) 15:22:41.28ID:1v9qW2Lt
×無毛な議論
○不毛な議論

ある意味ハァハァ w
0695デフォルトの名無しさん2016/11/02(水) 16:32:13.33ID:cswDNzjo
>>692
昔は配列以外の変数は宣言が必要なかった(まあ今でも Option Explicit つけなきゃ同じだが)
でも配列は宣言しないと関数呼び出しと区別がつかないから配列宣言文として Dim が作られた
その後で普通の変数も宣言するようになったが予約語増やすのもなんなので Dim を流用した
0696デフォルトの名無しさん2016/11/02(水) 16:50:43.21ID:A9UccZAb
>>695
ありがとう
やっぱその説が最有力候補か
0697デフォルトの名無しさん2016/11/02(水) 18:05:34.18ID:UqjLMoVv
>>695
懐かしいなぁ。まだ頭に「Visual」がついていなかった頃の話だよな。
WindowsどころかMS-DOSすらなかった
PC-8001とかPC-8801とかが全盛期だったころの話。
0698デフォルトの名無しさん2016/11/02(水) 19:00:28.78ID:MaMEq4Kz
10個以下の配列なら宣言しなくても使えるとか言う方言もあった気がする
0699デフォルトの名無しさん2016/11/02(水) 21:42:14.93ID:MMGUl9NM
クラスの話の後に昔の話になってスレ違いに次ぐスレ違いになりそうだけど
どっちも、知ってる人にとっては話膨らみ易いよね。
興味のない人ごめんね。
0700デフォルトの名無しさん2016/11/02(水) 21:55:24.53ID:Yw0kRdid
>>693
× dimention
○ dimension
0701デフォルトの名無しさん2016/11/02(水) 22:10:03.32ID:dzejWKHl
「ディメン ション 」で覚えるから、-tionと書いてしまう あるある
「ディメン ジョン 」と覚えればヴィジョンとかの連想から-sionと書くようになる。
0702デフォルトの名無しさん2016/11/02(水) 22:13:31.23ID:MMGUl9NM
ならば俺はREMとGOSUBを使おう
0703デフォルトの名無しさん2016/11/02(水) 22:24:45.63ID:SLAFVIbm
>>697
その頃はPC用のOSと言ったらCP/Mだったな

>>698
あったあった
0704デフォルトの名無しさん2016/11/02(水) 22:32:20.04ID:Yw0kRdid
ReDim Preserve ってムダに重厚な響きじゃない?
0705デフォルトの名無しさん2016/11/02(水) 22:43:27.94ID:4QljUUb8
>>608
変わらないが
>>704
ナイスセンス
0706デフォルトの名無しさん2016/11/02(水) 22:57:12.00ID:EkFiU+Sm
>>695
逆だと思ってたわ。
Variant型っていう便利なのが出来て、宣言不要になりましたって。

>>704
何か、Redimって言いたいだけじゃね?
って思うときあるわ。
0707デフォルトの名無しさん2016/11/02(水) 23:45:30.80ID:wsFczBeE
初期のポケコンのBASICでは変数が26個しかなくて、しかも配列と共用
A(1)がB、A(2)がC〜A(25)がZなんて割り当てになってた
0708デフォルトの名無しさん2016/11/03(木) 17:47:38.98ID:if4cNPkv
Excle VBA ベーシックでA〜Cまで問題があって、そのうちのA、Bの問9に関する問題について質問。

セルA1には100が入力されている状態。

@
Sub Sample()
ActiveCell = Func1(Activecell)
End sub

Funcion Func1(tmp as long)
Fun1 = Func1*10
End Function

→A1には0が出る
0709デフォルトの名無しさん2016/11/03(木) 17:47:54.07ID:if4cNPkv
〜続き〜

A
Sub Sample()
ActiveCell = Func1(Activecell)
End sub

Funcion Func1(tmp as long)
Fun1 = tmp*10
End Function

→A1には1000が出る

この@とAの結果が理解できないのだが・・・。
@はアクティブセルに100が入ってるんだから、
100×10で1000じゃないの?
なぜ0になる?
解説読んでも分からない俺に丁寧に教えてほしい。
Aはtmp = Func1 =Activecell = 100だから100×10で1000という認識で良い?

※解説には引数を使用せず、Func1の初期値は0なので、0になる
と書いてあってワケワケメ。
0710デフォルトの名無しさん2016/11/03(木) 17:49:03.05ID:if4cNPkv
ageてスマンm(__)m
VBAマジ初心者なのでよろ
0711デフォルトの名無しさん2016/11/03(木) 18:02:45.01ID:9GUNfw2l
>>708
@
Fun1 = Func1*10

これはFun1 = 0 *10
なのでFun1 = 0
0712デフォルトの名無しさん2016/11/03(木) 18:12:11.10ID:rcOPv7wx
>>708
まず Func と Fun を間違えてるけど問題はそこじゃなくて、正解はたぶん
Func1 = tmp * 10
0713デフォルトの名無しさん2016/11/03(木) 18:12:40.04ID:rhExFOFr
>>708
Func1(ActiveCell)と呼び出した場合、ActiveCellの値はFunc1に渡るのではなくtmpに渡る。
@の場合はtmpからFunc1へ値を渡す手段が存在していない。
0714デフォルトの名無しさん2016/11/03(木) 18:38:54.88ID:NjbREez3
>>709
> @はアクティブセルに100が入ってるんだから、
> 100×10で1000じゃないの?
> なぜ0になる?

> Funcion Func1(tmp as long)
> Func1 = Func1*10
> End Function
の中の
Func1 = Func1*10
で、右側の Func1 は関数の戻り値用の変数で誰も設定してないから 0 になってる
(正しくは Variant の Empty だけど説明がめんどいので知ってる人は突っ込まないでね)
なのでこの式を実行した結果として左側の Func1 に 0 が代入されてこれが関数の戻り値となるため
0715デフォルトの名無しさん2016/11/03(木) 20:02:49.56ID:Zd6a9awn
>>708です。
レスくれた人、ありがとう。

・・・しかし理解できないorz

>>714
Func1はアクティブセルって設定してるからいいんじゃないの?100になるのでは?
これはダメなの?
@とAの違いがどうしても分からない。
0716デフォルトの名無しさん2016/11/03(木) 20:12:16.93ID:Zd6a9awn
戻り値がそもそも分かっていない・・・orz
0717デフォルトの名無しさん2016/11/03(木) 20:13:45.02ID:hi6D5Bdb
同一スコープで変数名と関数名が被るのってアリ?
なんでこんな無意味な問題を出すんだか
0718デフォルトの名無しさん2016/11/03(木) 20:15:43.34ID:Zd6a9awn
質問続き

Funcion Func1(tmp as long)

これはどう理解すればいいの?↑

Func1 = tmp なの?
0719デフォルトの名無しさん2016/11/03(木) 20:17:39.43ID:Z2ns8N+e
>>716
「戻り値」だけじゃなく、「引数」も分かってないんじゃない?
解説の
>引数を使用せず、Func1の初期値は0なので、0になる
がすべてなんだけどな
0720デフォルトの名無しさん2016/11/03(木) 20:20:39.28ID:Zd6a9awn
>>719
>引数を使用せず、Func1の初期値は0なので、0になる

いや、これが理解できないんだわ。
Activecellは100だから、Func1(activecell)=100じゃないの??
0721デフォルトの名無しさん2016/11/03(木) 20:27:15.48ID:OnkSCOBV
>>720
根本的に勘違いしてる

ActiveCell = Func1(Activecell)
↑こう書いたらFunc1にActivecellの値が渡されると思い込んでるでしょ?それが間違い
実際にはFunc1の冒頭で Func1(tmp As Long) って書いてるんで、Activecellの値が渡されるのは
Func1内のtmpって変数になるわけ
ところがFunc1の内部ではtmpが使われてないので、引数としてFunc1に渡したActivecellの値は
どこにも使われることなくスルーされてるんだよ
つまりこのFunc1という関数は全く意味のない死に関数
Func1に引数の値を渡したかったらFunc1の内部で Func1 = tmp と書かないとダメ
0722デフォルトの名無しさん2016/11/03(木) 20:29:22.84ID:Z2ns8N+e
>>720
まず「引数」を理解してほしいかな…
関数に「渡す」ものだよ。
関数の値が「それになる」わけじゃない

VBAの場合、戻り値を関数名に代入するから、それとごっちゃになって分からなくなってるのかな…?
0723デフォルトの名無しさん2016/11/03(木) 20:32:34.42ID:Zd6a9awn
>>721

>ActiveCell = Func1(Activecell)
>↑こう書いたらFunc1にActivecellの値が渡されると思い込んでるでしょ?それが間違い

そうだよ。

>実際にはFunc1の冒頭で Func1(tmp As Long) って書いてるんで、Activecellの値が渡されるのは
>Func1内のtmpって変数になるわけ
>ところがFunc1の内部ではtmpが使われてないので、引数としてFunc1に渡したActivecellの値は
>どこにも使われることなくスルーされてるんだよ

>Func1に引数の値を渡したかったらFunc1の内部で Func1 = tmp と書かないとダメ

な、なるほど・・・・・・・・・・。

少し分かってきたけど、

>Funcion Func1(tmp as long)

はどういう意味なの?

tmp(=func1)はlong型の変数です、って意味?
0724デフォルトの名無しさん2016/11/03(木) 20:42:27.23ID:OnkSCOBV
>>723
>はどういう意味なの?

Func1はLong型の変数tmpを参照渡しで受け取って加工して何かの値を返す変数です っていう意味
ただし、さっきも言ったとおり何もしなくてもtmpの値がFunc1に渡されるわけではないので、
tmpをどう使うかはきちっとプログラマーがFunc1の内部に記述する必要がある
それを忘れると↑のような意味のない関数になってしまう

ちなみに関数がどういう型を返すかは引数のカッコの後に As を付けて指定する
Function Func1(tmp As Long) As Double
とすれば、Func1はLong型の引数を受け取って加工してDouble型の値を返す関数になる
0725デフォルトの名無しさん2016/11/03(木) 20:44:00.90ID:OnkSCOBV
>>724訂正

誤:Func1はLong型の変数tmpを参照渡しで受け取って加工して何かの値を返す"変数"です
正:Func1はLong型の変数tmpを参照渡しで受け取って加工して何かの値を返す"関数"です
0726デフォルトの名無しさん2016/11/03(木) 20:49:33.71ID:CvLLcWs6
>>723
Func1と言うのは関数の名前
tmpは変数の名前
Activecell=Func1(Activecell)
は関数Func1にActivecell.valueを渡して呼び出すと言う事
そして関数Func1()からの戻り値をActivecell.valueに設定すると言う事

Function Func1(tmp as Long)は
関数Func1()の内容を決めますよと言う宣言
そしてFunc1()の中では呼び出された時に渡された値をtmpという変数に入れて扱うと言う事

て言うかなんで基礎知識も無いのに問題解いてるの?
0727デフォルトの名無しさん2016/11/03(木) 20:53:23.23ID:Zd6a9awn
関数ってのはsumとかifみたいな関数のこと?
引数の意味がよく分からんのだが・・・。
0728デフォルトの名無しさん2016/11/03(木) 20:55:18.37ID:rhExFOFr
>>727
関数は数学の授業とかで使う関数と同じ意味。読み方も一緒。

ActiveCell = Func1(Activecell)はy = f(x)と同じ。
引数は検索すりゃ意味が出てくる。
0729デフォルトの名無しさん2016/11/03(木) 20:57:00.47ID:CvLLcWs6
>>727
sumとかと一緒
sumとかに足し算する対象を指定するじゃん
それが引数

VBAでは関数を自分で作れる
その自作関数にFunc1と言う名前をつけるのが
Function Func1(tmp as Long)
そして引数はLong型の値を取りますよ
と言う事
0730デフォルトの名無しさん2016/11/03(木) 21:02:16.85ID:OnkSCOBV
>>727
関数ってのはある値を入力すると内部で加工して何かの値を返してくるブラックボックスだと思えばいい
ブラックボックスに入力する「ある値」が引数、加工されて返ってくる「何かの値」が戻り値とか返り値とか呼ばれるもの
SUMとかIFとかのアレも「ある値を入力すると何かの加工をして値を返す」という意味では関数だけど、
VBAのコード中でFunction hoge〜の形で使われる関数とは別モノ(「ワークシート関数」とか呼ばれて区別されてるようだ)

関数とか引数を知らないとなると余りにも基本的な知識がなさすぎる
まずはVBAの入門者向け解説書を1冊じっくり読んだ方がいいと思う
0731デフォルトの名無しさん2016/11/03(木) 21:04:59.49ID:Zd6a9awn
>>728-730
なるほど、分かりやすい。
テキストは田中亨のVBAベーシックは読んだけど、分かりにくいのが本音。
今日はこれから出かけるので、また今度スレに来るかも。

レスくれた人、ありがとうm(_ _)m
0732デフォルトの名無しさん2016/11/03(木) 21:12:59.53ID:NjbREez3
>>715
(1) Sub Sample()
(2) ActiveCell = Func1(ActiveCell)
(3) End sub

(4) Funcion Func1(tmp as long)
(5) Func1 = Func1*10
(6) End Function

で1ステップ毎に説明すると

(1) 開始
(2) ActiveCell の値 (100) を持って関数 Func1 を呼び出す
(4) 持って来た値 (100) を tmp に入れる (tmp が 100 になる)
  Func1 と言う戻り値用の変数が作られる (初期値は 0)
(5) 0 * 10 の計算結果の 0 が Func1 に書き込まれる
(6) Func1 変数の値 (0) を持って呼び出し元に戻る
(2) 戻された値 (0) を ActiveCell に書き込む
(3) 終わり

ってこと
0733デフォルトの名無しさん2016/11/03(木) 21:16:51.03ID:NjbREez3
>>717
> 同一スコープで変数名と関数名が被るのってアリ?
VBA の仕様を理解してないなら ROM ってなさいよ
0734デフォルトの名無しさん2016/11/03(木) 21:26:03.24ID:OnkSCOBV
>>733
VB.NETからVBAに入ったけど、最初関数の値の返し方が分からなくて戸惑ったわw
return辺りで返すのかなと思ってたらまさか関数名に値を代入して返す仕様とは・・・
0735デフォルトの名無しさん2016/11/03(木) 21:59:36.56ID:NjbREez3
>>734
Pascal を真似たんだろうがちょっと理解しづらい仕様だと思う
0736デフォルトの名無しさん2016/11/03(木) 22:34:34.93ID:Xw98VJcy
とは言っても完全に関数名を変数と同様に扱える訳じゃないから紛らわしい
0737デフォルトの名無しさん2016/11/04(金) 01:40:01.99ID:jyKXR8RP
なんでisじゃなくてasなのかus達は知らない 押忍
0738デフォルトの名無しさん2016/11/04(金) 08:49:30.77ID:MzKLrXxJ
Funcion Func1(tmp as long) as long

と書くだけでだいぶわかりやすくなると思う
0739デフォルトの名無しさん2016/11/04(金) 08:59:12.73ID:sU8qFob4
>>737
X is Y ⇒ X は Y だ
X as Y ⇒ X を Y として

宣言時なら as でしょ
0740デフォルトの名無しさん2016/11/04(金) 11:31:22.21ID:J71JD+W4
関数内の代入文で自分自身の関数名を右辺に書いたら再帰
0741デフォルトの名無しさん2016/11/04(金) 11:50:13.81ID:FBxZsWlP
>>740
Yes
0742デフォルトの名無しさん2016/11/04(金) 12:04:26.76ID:yq4B+Q21
でもこれは再帰にならないのか
なんだか面倒な仕様だな

(4) Function Func1(tmp As Long)
(5) Func1 = Func1 * 10
(6) End Function
0743デフォルトの名無しさん2016/11/04(金) 12:05:46.88ID:MzKLrXxJ
再帰にしたけりゃパラメータを指定する必要あり
0744デフォルトの名無しさん2016/11/04(金) 12:16:27.54ID:8TwcW80x
Function Func1(tmp As Long)
Dim Func1(10) As Long
Func1 = Func1(1) * 10
End Function
0745デフォルトの名無しさん2016/11/04(金) 17:02:16.56ID:FBxZsWlP
>>744
ムリ
0746デフォルトの名無しさん2016/11/04(金) 18:39:59.28ID:MzKLrXxJ
Excelで試せばいいのに
0747デフォルトの名無しさん2016/11/04(金) 21:25:17.31ID:wIulNpsz
>>743
パラメータ?
モジュールレベルスコープの変数のこと?
0748デフォルトの名無しさん2016/11/04(金) 22:26:44.93ID:MzKLrXxJ
パラメータ≠メンバ変数
0749デフォルトの名無しさん2016/11/04(金) 22:58:10.62ID:FBxZsWlP
paramとargを使い分ける
0750デフォルトの名無しさん2016/11/04(金) 22:58:42.01ID:wIulNpsz
再帰はたまに便利。
調子に乗って使うとスタックがオーバーフローしたりするのと
ちょっと普通の作りより癖があるので扱いに慣れるまで注意が必要。
0751デフォルトの名無しさん2016/11/05(土) 01:38:57.19ID:JVJJflNV
ここの人たちは、VBAでアセンブラ使えそうな気がする。
0752デフォルトの名無しさん2016/11/05(土) 02:08:42.34ID:fEy9fbAW
76
0753デフォルトの名無しさん2016/11/05(土) 05:11:11.62ID:uHyI3o9M
vbaって簡単そうに見えてむずいな
特にシート操作が
0754デフォルトの名無しさん2016/11/05(土) 05:51:08.02ID:YXcxY70Q
大体のことはできるから楽なイメージあるなぁ
シート操作のどこで引っかかったかは知らないけどマクロの記録でやりたい操作をやったらある程度のプログラムもできてる
+αをくっつけてやればいったん完成

vbaは汚くても動けば目的を達成できてる
後は趣味の世界
きれいに並び替えたり共通点見つけてメソッド化したりメソッド増えてきたら種類ごとにモジュールけたり
0755デフォルトの名無しさん2016/11/05(土) 07:05:50.52ID:vH5G11t0
WindowsAPIとかCreateObjectとかVBAからも使えるってだけで本来のものじゃないけど、
何してもいいと割り切ると意外と拡張できて実用的な言語ではある。
0756デフォルトの名無しさん2016/11/05(土) 10:08:16.98ID:i5CUd//Y
むしろincludeやimport無しで実用的な言語ってそんなにあるんだろうか。
0757デフォルトの名無しさん2016/11/05(土) 10:25:32.07ID:cY9pivXa
VBAで連装配列を使う方法はわかったんですが
データを放り込んでゆくだけで自動的に格納・拡張されていき
添え字管理が不要ないわゆるリスト?はあるんでしょうか
あるならどうやれば使えますか
0758デフォルトの名無しさん2016/11/05(土) 10:29:10.03ID:i5CUd//Y
>>757
Collection型使えばいいんじゃないの?
0759デフォルトの名無しさん2016/11/05(土) 10:54:31.98ID:p62EnB4H
VB.NETは進化を間違えたよなあ
VB6の文法のまま進化すれば良かったのに
COBOL並みに過去資産が膨大過ぎてVBA.NETには移行できなさそう
0760デフォルトの名無しさん2016/11/05(土) 11:03:07.76ID:Eh5dh6IO
>>751
マジレスすると、使えないことはない
アセンブラでDLL作ってDeclareでリンクすればいいんで
0761デフォルトの名無しさん2016/11/05(土) 11:09:10.40ID:xa6BaB1I
>>757
確かにCollectionが一番近い。
ただジェネリックも使えないし
IEnumerableを実装している訳ではないので
.NetのListと同じ訳には行かない。
って言うか.NetにもCollectionはあるから分かるか。
そう言った意味では、ない。
0762デフォルトの名無しさん2016/11/05(土) 15:42:59.66ID:6wNzhQFs
>>761
> .NetのListと同じ訳には行かない。
そんな後付けの要件言われてもなぁ...
0763デフォルトの名無しさん2016/11/05(土) 18:40:13.12ID:dOhxOPN3
>>762
後付けも何も最初からリストって言ってるじゃん
0764デフォルトの名無しさん2016/11/05(土) 19:03:02.53ID:6wNzhQFs
>>763
いちいち説明しないとわからんのか...
「 .Netの」Listと同じ
0765デフォルトの名無しさん2016/11/05(土) 19:05:04.94ID:LRmP76b+
B列に入力がある最終行を特定(仮にn番とします)してA1から範囲指定し、左詰めに削除するコードを書くことができました。

Range(Range("A1"), Cells(Rows.Count, 2).End(xlUp)).Delete Shift:=xlToLeft

↑これは期待した通りに作動したのですが、それに加えてC列1番からC列n番を範囲指定し左詰めに削除するためにはどうすればいいかが分かりません。
どなたかご教示お願いします。
0766デフォルトの名無しさん2016/11/05(土) 19:11:16.23ID:dOhxOPN3
>>764
じゃあ何のリストだと思ってるのさ
0767デフォルトの名無しさん2016/11/05(土) 19:24:53.01ID:6wNzhQFs
>>766
日本語読めないバカは黙ってろよ

> データを放り込んでゆくだけで自動的に格納・拡張されていき
> 添え字管理が不要ないわゆるリスト
0768デフォルトの名無しさん2016/11/05(土) 19:32:51.78ID:vH5G11t0
質問者ではない>>761の単なる感想っぽいコメントを「後付けの要件」と呼ぶ感覚も良くわからないけどな。
0769デフォルトの名無しさん2016/11/05(土) 19:41:59.58ID:YXcxY70Q
仲良く喧嘩しな
07707652016/11/05(土) 19:42:37.22ID:LRmP76b+
たびたび失礼します。先ほどの質問に関してはResizeを使って解決することが出来ました。
また質問で恐縮なんですがお願いします。

A列に入力がある最終行を特定し(仮にn番とします)、A1〜Anのセル内が空白か「a」と入力されているか「b」と入力されているかのどれかに当てはまる場合、
そのA列該当セル〜C列の同じ行番号までを上詰めで削除するにはどうすればいいでしょうか。

  Dim i As Long
For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row
If Cells(i, 1) = "" Or Cells(i, 1) = "a" Or Cells(i, 1) = "b" Then
Range(Cells(i, 1), Cells(i, 4)).Delete shift:=xlShiftUp
End If
Next

    ↑このように書いて動作させてみたのですが思うようにいきませんでした。
0771デフォルトの名無しさん2016/11/05(土) 19:44:27.24ID:dOhxOPN3
>>767
それは「いわゆるリスト」ではないな
0772デフォルトの名無しさん2016/11/05(土) 19:49:50.80ID:9mC8a8qM
>>770
行削除は最下行から上に向ってループして、
現在行の下の行を削除していくようにすると行番号がずれなくていいよ
0773デフォルトの名無しさん2016/11/05(土) 19:55:40.66ID:LRmP76b+
>>772
ありがとうございます。書き換えるとしたら

Range(Cells(i, 1), Cells(i, 4)).Delete shift:=xlShiftUp

この部分になるのでしょうか?
0774デフォルトの名無しさん2016/11/05(土) 19:57:42.64ID:6wNzhQFs
>>768
え゛っ?
> ただジェネリックも使えない
> IEnumerableを実装している訳ではない
って言うのをただの感想ってとる人もいるんだな...

>>771
はいはい
君のリストの定義には興味がないからどうでもいい
0775デフォルトの名無しさん2016/11/05(土) 20:02:40.97ID:Dz6KYDLT
>>773
forのto前後を入れ替えてstep -1を最後に追加する
0776デフォルトの名無しさん2016/11/05(土) 20:03:17.58ID:Dz6KYDLT
>>761
無ければ作れば良いじゃない
0777デフォルトの名無しさん2016/11/05(土) 20:06:35.21ID:LRmP76b+
>>775
For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row

For i = Cells(Rows.Count, 1).End(xlUp).Row To 1 Step -1

こんな感じでしょうか
0778デフォルトの名無しさん2016/11/05(土) 20:07:03.11ID:dOhxOPN3
まぁバカはほっといて
今シートの列を1→Aとか27→AAとか、或いはその逆に変換するロジックを組んでいるんだけど、
どういった組み方が短くて見易いコードになると思う?

とりあえず今は敢えて再帰は入れてないけど。
0779デフォルトの名無しさん2016/11/05(土) 20:34:26.52ID:4BVVHIRI
>>774
内容に関わらず当事者じゃない者のコメントなんだから感想みたいなもんさ。
「後付け」ってのは言い出した本人が後から条件を追加することを言うわけだろ?
0780デフォルトの名無しさん2016/11/05(土) 20:37:53.33ID:4BVVHIRI
ちなみに

> データを放り込んでゆくだけで自動的に格納・拡張されていき
> 添え字管理が不要ないわゆるリスト

これは「いわゆるリスト」のイメージに合ってはいる
0781デフォルトの名無しさん2016/11/05(土) 20:53:42.34ID:6wNzhQFs
>>779
「後付け」じゃなくて「勝手な」って言えばいいのか?
0782デフォルトの名無しさん2016/11/05(土) 21:04:44.33ID:Eh5dh6IO
>>778
Split(Cells(列).Address, "$")(1)
Cells(, "AA").Column
0783デフォルトの名無しさん2016/11/05(土) 21:06:38.33ID:Dz6KYDLT
>>778
26進数に変換するだけじゃね?
0784デフォルトの名無しさん2016/11/05(土) 21:08:12.47ID:cY9pivXa
荒れさせちゃってゴメンなさいね
まさに後付けなんですが、他に知っている言語がPythonだったから
うっかり「いわゆるリスト」って書きましたが、不適切でしたね
VBAのコレクションはキーを一緒に指定する(連想辞書と同じ?)ようで
残念ながら私の欲しいものとは違いました
0785デフォルトの名無しさん2016/11/05(土) 21:23:54.07ID:6wNzhQFs
>>778
バカに限って必要もないのに再帰とか言い出して笑うわ

・このアルゴリズムを実装する
 ⇒ https://support.microsoft.com/ja-jp/kb/833402
・Address( ) を使う
・テーブル作って一発変換

等々なんとでもなるやろ
0786デフォルトの名無しさん2016/11/05(土) 21:24:08.28ID:dOhxOPN3
>>782
有難う。一瞬シートオブジェクトに依存するからダメかと思ったけど考えてみたら
シートが無い状態ってブックがグラフのみで構成されているかアドインくらいしかないから
そもそもそう言ったマクロを走らせることがおかしいということで大丈夫だね。
これいいわ。

>>783
まぁそう。後はアスキーコードで変換すればいいと思ってたけど、>>782で行けそうだから
とりあえず何も問題が起きなければこれを使わせて貰うかな。
0787デフォルトの名無しさん2016/11/05(土) 21:31:12.06ID:6wNzhQFs
>>784
ああ、最初に
連想配列を使う方法はわかった
って書いてあるな、見落としてた
直接にはないので ReDim で自分で拡張するか、個数が知れてるなら文字列に変換して適当なセパレータとともに追加していくとかぐらいしかやったことない
0788デフォルトの名無しさん2016/11/05(土) 21:33:33.34ID:dOhxOPN3
>>785
何とでも作れるところで「どうすれば短くて見やすいコードになるか」と言ったはずだ。
>>767の暴言をそっくりお返しさせて貰うわ
「日本語読めないバカは黙ってろよ」
0789デフォルトの名無しさん2016/11/05(土) 22:00:31.03ID:6wNzhQFs
>>788
選択肢書いてあるだろ?
Address 使う奴が短いのはわかりきってるがシートがない状態で使えないって後付けで条件追加されても困るしな w
0790デフォルトの名無しさん2016/11/05(土) 22:01:56.06ID:cY9pivXa
>>787
リストに放り込んだデータをFor Each i in〜的に処理するコーディングを
他言語で知ってしまうと、VBAのデータ構造は使いづらくて・・・
.NETにリストはあるようなので、それをVBAから利用する方法がないか調べてみます
0791デフォルトの名無しさん2016/11/05(土) 22:06:16.00ID:YXcxY70Q
似たようなクラスを作れば良いと思う
必要なメソッドを必要に応じて追加していけば使いやすい個人用array型を作れる
0792デフォルトの名無しさん2016/11/05(土) 22:12:01.43ID:gy9UaMj5
これないと辛いなぁめんどくさいなぁって処理はもはやマクロでやるべきではない
0793デフォルトの名無しさん2016/11/05(土) 22:17:01.49ID:dOhxOPN3
>>790
Linqやラムダ式は使えないけど、絞り込みや並べ替えを行う程度であれば
ひょっとするとRecordSetで何とかなるかもよ。
0794デフォルトの名無しさん2016/11/05(土) 22:17:32.77ID:Dz6KYDLT
>>790
自作クラスの中でCollectionを使えば良いんじゃね
キーをクラス変数で要素追加毎にインクリメントすれば良いのでは?
0795デフォルトの名無しさん2016/11/05(土) 22:20:50.87ID:G9TH40zB
Collectionて一意キーだっけ(よく知らん)
それならリスト的には使えないな
0796デフォルトの名無しさん2016/11/05(土) 22:22:33.32ID:9mC8a8qM
Collection、キーを指定しなくても使えるよ…
0797デフォルトの名無しさん2016/11/05(土) 22:26:23.21ID:YXcxY70Q
こんなクラス作っとけばfor eachでいい感じに使えると思う


private var() as string

Public Sub Class_Initialize()
redim var(0)
End Sub

public sub add(s as string)
if(0<len(var(0))) then redim preserve var(ubound(var)+1)
var(ubound(var))=s
end sub

public property get getList() as string()
getList=var
end property
0798デフォルトの名無しさん2016/11/05(土) 22:29:00.64ID:i5CUd//Y
>>792
標準で実装されている機能の組み合わせだけで表面上はだいたい表現出来るしな。
0799デフォルトの名無しさん2016/11/05(土) 22:35:44.04ID:6wNzhQFs
>>790
まあ Python や C#、最近だと C++ とかでもリスト作ってさくっと for each みたいな構文で処理できるから、それら使った後で VBA 使うと色々もどかしいわな
一応 ReDim 使った動的配列でも for each は使えるみたいだけどね

>>795
一意キーだよ
>>794 の言うように自前で生成すれば重複しないって話
0800デフォルトの名無しさん2016/11/05(土) 22:46:37.73ID:6wNzhQFs
>>797
それなにも追加してない状態で for each 回すと var(0) が参照されてループが一回回っちゃうとか
add("")
add("a")
ってやると要素が "a" だけになるとか
ちょっと問題あるかと
まあ、VBA では空の配列を表現できないので最初の問題はしょうがないとしても
クラスにするなら普通に上限を別の変数で管理した方がいいと思う
0801デフォルトの名無しさん2016/11/05(土) 22:47:47.97ID:dOhxOPN3
>>795
本当のところは>>796が言うように
設定しなければ一意とはならずに
値のみ設定して行くことができる。
0802デフォルトの名無しさん2016/11/05(土) 22:52:48.85ID:YXcxY70Q
>>800
まぁこのままだとそうだな
こんな雑なものをそのまま使うことはないしその辺は使うときにチョコチョコ手を入れればいいと思う
0803デフォルトの名無しさん2016/11/05(土) 23:21:28.04ID:G9TH40zB
>>800
空の配列ってArray()のこと?
0804デフォルトの名無しさん2016/11/06(日) 03:18:43.48ID:10u3IhnO
空の配列ってか、要素数0個の配列じゃね
VBAだけで普通にやってたら作成できんはず

WebServiceToolkitで取得したデータが要素数0個の配列になって困った覚えがあるな
0805デフォルトの名無しさん2016/11/06(日) 03:36:25.68ID:pNBJcExn
・テキスト検索でQiitaをググるのは情弱
・画像検索でスライドの特定の1枚から興味のあるスライド本コンテンツ
 を辿る俺は情況
0806デフォルトの名無しさん2016/11/06(日) 04:17:25.35ID:3q2RctVy
うむ。貴兄の情況はよく分かった
0807デフォルトの名無しさん2016/11/06(日) 06:13:06.49ID:WIxoq9wl
情況
0808デフォルトの名無しさん2016/11/06(日) 07:27:01.07ID:dZD22YhG
情況は英語で検索する
0809デフォルトの名無しさん2016/11/06(日) 07:43:36.88ID:ZJ/PQVXx
>>804
0810デフォルトの名無しさん2016/11/06(日) 08:01:02.31ID:TsO3NfE3
Array() は不思議だぞ。
IsMissing = True かつ IsArray = True になるんだ。
これを実行してみ?

Sub MissingExpr(ByRef a As Variant, Optional ByRef b As Variant)
If IsMissing(a) Then
Debug.Print "a is missing"
Else
Debug.Print "a is not missing"
End If
If IsArray(a) Then
Debug.Print "a is an array"
Else
Debug.Print "a is not an array"
End If
If IsMissing(b) Then
Debug.Print "b is missing"
Else
Debug.Print "b is not missing"
End If
If IsArray(b) Then
Debug.Print "b is an array"
Else
Debug.Print "b is not an array"
End If
End Sub

Sub MissingExprTest()
Call MissingExpr(Array())
End Sub
0811デフォルトの名無しさん2016/11/06(日) 08:41:07.14ID:GihBZw3q
型が設定されていて値が設定されていない状態だからそれでいいんじゃないの?
0812デフォルトの名無しさん2016/11/06(日) 08:50:36.06ID:TsO3NfE3
>>811
なるほど。
しかし b の方はEmptyでもNullでもなくIsMissing属性しか持っていないようだ。
0813デフォルトの名無しさん2016/11/06(日) 08:54:41.12ID:TsO3NfE3
そうじゃないwww
Array() が IsMissing = True になることの意外さを言いたかったんだ。
0814デフォルトの名無しさん2016/11/06(日) 10:01:01.90ID:aWGLyRUt
>>803
ああすまん array() は確かに空の配列なんだけど Variant の配列になるから
String とかの配列を想定してた
0815デフォルトの名無しさん2016/11/06(日) 12:56:27.94ID:XCfSw/Ua
不思議も何もVariant型のパラメータ読み取っているだけだから、
フォーマットの許す限りどんな判定の組み合わせもあり得るだろ。
0816デフォルトの名無しさん2016/11/06(日) 13:54:57.24ID:gUXTTT9M
Optional パラメータの時でないと意味を持たない IsMissing( ) が True になるのはなんでかなー
ってことでしょ

組み合わせとか言ってる奴は意味わからん
0817デフォルトの名無しさん2016/11/06(日) 14:33:51.86ID:ZJ/PQVXx
>>815
だけど明示的に Array() を渡したとき IsMissing だけで判断すると誤認するよ。
0818デフォルトの名無しさん2016/11/07(月) 15:18:15.66ID:nniwu0bC
vbaからゴミ箱を開く方法なんて無いでしょうか?
0819デフォルトの名無しさん2016/11/07(月) 15:37:35.30ID:VYBRu5rO
>>818
Sub ごみ箱を開く()
  With CreateObject("Shell.Application")
    .Explore "shell:RecycleBinFolder"
  End With
End Sub
0820デフォルトの名無しさん2016/11/07(月) 21:56:27.64ID:2N1s34vg
だからどんな用途だよwwwwwwwwwwwww
0821デフォルトの名無しさん2016/11/07(月) 22:05:53.92ID:a2KGFTus
気にしたら負け
0822デフォルトの名無しさん2016/11/07(月) 22:37:20.14ID:ASyIjsM7
ゴミあさりが好きなんでしょ
0823デフォルトの名無しさん2016/11/07(月) 23:13:32.43ID:hti3dUBl
確かに気になるw

でもそこは突っ込まないのがお約束
0824デフォルトの名無しさん2016/11/08(火) 00:07:19.86ID:6Fz71b9f
先日はアドバイスどうもです
いろいろ調べて、コレクションをリスト的に使えた感じなので書いておきます
引数にカッコを付けるものと付けないものがあったり
位置指定の引数が前だったり後ろだったりと少し統一感に欠けるところがありますが
ともかくこれで配列の煩わしいところを回避できそうです

Dim ar As Object
Set ar = CreateObject("System.Collections.ArrayList")
'全データ削除
ar.Clear
'末尾にデータ追加
ar.Add "A"
'要素数を求める
MsgBox ar.Count
'指定位置のデータ参照
MsgBox ar(0)
'指定位置にデータ挿入
ar.Insert 0, "B"
'指定位置から右方向へデータ位置を検索
ar.IndexOf("A", 0)
'指定位置のデータ削除
ar.Removeat(1)
'指定位置のデータ置換
ar(0) = "C"
'データの存在確認
If ar.Contains("B") Then 〜
'全要素の順参照
For Each Variant型変数 In ar 〜
0825デフォルトの名無しさん2016/11/09(水) 00:32:05.84ID:nfVB7G/H
ていうかさ、どうしてもVBAで表示しなきゃダメなの?
普通に、セルにリンク貼ればいいじゃん。
$リサイコー.ビンの中にゴミ箱あるから。
0826デフォルトの名無しさん2016/11/09(水) 14:31:54.77ID:J2xqIWXl
どなたかお願いします。チェックボックスを使って集計をしたいのですが

(例)
A1 ☑ B1 True C1 □ D1 False E1 ☑ F1 True
A2 □ B2 False C2 ☑ D2 True E2 □ F2 False

となっている場合、
別シートのA1に「元シートB1のTrue数/元シートF1のTrue数」、別シートA2に「元シートB2のTrue数/元シートF2のTrue数」が転記される関数を入力しています。
(この場合だと、別シートA1には「1/1」、別シートA2には「0/0」の計算結果が反映されます)。

しかしこのやり方だと、
「元シートにチェックを入れる→別シートにおいて集計→二度目の集計として元シートにチェックを入れる
→別シートにおいて1回目の集計結果に加えるかたちで2回目の集計結果を反映→3回目の集計として元シートに……」
といった繰り返しの計算ができません。

そこで、以下のような処理が可能なボタンを作りたいと思っています。
元シートのチェック入れ作業が終わってから押す→別シートにおいて集計される。なおかつ元シートのチェック欄がまっさらになる
→再び元シートでのチェック作業を終えてから押す→別シートにおいて1回目の結果に上乗せされるかたちで集計される。なおかつ再び元シートのチェック欄がまっさらになる。
→再び元シートのチェック作業を終えてから……

こういった感じで繰り返しの処理ができるボタンを作りたいと思っています。
こういったことは可能でしょうか。もしも可能ならば手順を教えていただきたいと思っています。
0827デフォルトの名無しさん2016/11/09(水) 14:57:26.81ID:PFTCi+bF
>>826

>別シートのA1に「元シートB1のTrue数/元シートF1のTrue数」、別シートA2に「元シートB2のTrue数/元シートF2のTrue数」が転記される関数を入力

ここを、sheet2として、A1に元のB1のt数、A2に元のF1のt数、A3に元のB2のt数、A4にF2のt数とする。この場合だと1,1,0,0
で、下方向にデータが積み上がっていくようにしては?
2回目のデータは2行目、3回目は3行目、以下略
計算(割り算、足し算)はそのデータを使ってsheet3で行う。
0828デフォルトの名無しさん2016/11/09(水) 14:57:30.76ID:mLDsYS4L
2枚のシートだけでやろうとするから難しくなってるような…

データ入力をする「元シート」、元シートの計算をする「別シート」の他に
「別シート」での計算結果を累積していく「合計シート」を作る

で、更に「別シート」と「合計シート」を串刺し計算する「作業シート」を作っておく

そうするとVBAで作るのは
1.「作業シート」をまるっと「合計シート」に値で貼り付け
2.「元シート」のチェックをクリア
だけですむんじゃないかな
0829デフォルトの名無しさん2016/11/09(水) 21:43:35.15ID:4D6UFSts
チェックボックスのイベントと、
シートチェンジのイベントを使えばいいんじゃ?
0830デフォルトの名無しさん2016/11/10(木) 12:42:24.44ID:d3OX96o+
「Private sub」で始まるコードの実行のさせ方が分かりません。
「sub」で始まるときのように"標準モジュールにコードを入力→F5でマクロ実行"という手順を踏もうとすると
このブック内で既に存在しているマクロ名を選択させられるダイアログボックスが出現するだけで他はなにもおこりません。
どのようにすればいいのでしょうか
0831デフォルトの名無しさん2016/11/10(木) 13:01:12.38ID:ABjoCTHb
>>830
Public Sub で始まるコードの中からそいつを呼ぶ
0832デフォルトの名無しさん2016/11/10(木) 13:21:53.74ID:ho/Pu//S
>>830
「Private sub」だからというよりも
引数が必要な プロシージャを F5で実行しようとしてない?

Private sub Test(hoge as Long)

のように ( ) の中に 引数指定が あるんじゃね?
この場合は F5では 実行できないと思うよ
0833デフォルトの名無しさん2016/11/10(木) 13:47:12.35ID:X35QhmbO
>>832
いや、privateだからだよ。
加えて、引数がある場合はpublicでも実行できないというだけ。
0834デフォルトの名無しさん2016/11/10(木) 17:53:16.33ID:ho/Pu//S
>>833
よく分らんけど
なんか俺が想定してる操作とは違うんだな 了解した
ごめんね >>830

Vbeで 実行したいプロシージャに カーソル置いて F5 って操作の事だと思ったのよね(^^
0835デフォルトの名無しさん2016/11/10(木) 18:17:00.43ID:X35QhmbO
>>833
ごめん、俺の方が間違ってた。
sub内にカーソルがあるときにF5の場合だね。
>>832が正しい。
0836デフォルトの名無しさん2016/11/10(木) 20:15:41.20ID:N2YC4I8N
With Application.FileDialog(msoFileDialogFilePicker)
If .Show Then SourcePath = .SelectedItems(1)
End With

If Len(SourcePath) Then
TempPath = CreateObject("Scripting.FileSystemObject").GetSpecialFolder(2).Path & "\Temp.tmp"
Shell "copy " & SourcePath & " " & TempPath
End If

とやると、Shellのところで「ファイルがありません」と出てしまいます。

Debug.Print "copy " & SourcePath & " " & TempPath

とやって出てきた文字列と同じものをコマンドプロンプトで打ち込むと成功するのですが、何が間違ってるのでしょうか?
0837デフォルトの名無しさん2016/11/10(木) 20:22:35.36ID:bXVtYMGa
>>836
thisworkbook.pathを追加するとか
0838デフォルトの名無しさん2016/11/10(木) 20:51:10.18ID:65UijVtD
何その\テンプテンプ
0839デフォルトの名無しさん2016/11/10(木) 21:12:48.06ID:APk4FFQW
>>836
Shell "cmd /c copy " & SourcePath & " " & TempPath
もしくは
Shell "xcopy " & SourcePath & " " & TempPath
0840デフォルトの名無しさん2016/11/10(木) 21:18:18.99ID:N2YC4I8N
>>839
ありがとうございます。試してみたいと思います。
0841デフォルトの名無しさん2016/11/10(木) 22:01:34.16ID:y/H7xYoY
windows7 32bit
EXCEL 2007
IE11
を使用しています

VBAを使用し
BASEURL =
0842デフォルトの名無しさん2016/11/10(木) 22:43:49.15ID:pEVMYV3p
>>841
2chのバグだろう

書き込み確認画面が出る際、" を使うと、そこで文字列の終了とみなされる。
" の代わりに、\" とエスケープすれば、どうだろう?
0843デフォルトの名無しさん2016/11/10(木) 22:44:35.78ID:y8lx0u6h
質門です。
D12~D16を結合、D17~D21を結合、D22~D26を結合・・という形で縦に規則的に
複数行のまとまりを作っていく作業を300回行いたいのですが、どのようにしたらよいでしょうか。
0844デフォルトの名無しさん2016/11/10(木) 22:47:42.61ID:65UijVtD
普通にフォーネクスコとマージセルしかないと思うけど。
0845デフォルトの名無しさん2016/11/10(木) 22:48:48.86ID:ERyYOelv
>>843
相対アドレスでマクロの記録をして
forで繰り返す
0846デフォルトの名無しさん2016/11/10(木) 22:51:30.51ID:C4thLsRU
>>843
相対アドレスでマクロの記録をして
300回実行を押す
0847デフォルトの名無しさん2016/11/10(木) 23:09:42.95ID:y8lx0u6h
ありがとうございます。
みなさんすごいっすね。。
いや自分が大したことないのはわかってますけども。
0848デフォルトの名無しさん2016/11/10(木) 23:11:38.54ID:C6WoAcNN
D列前提?
で、1500行ちょいまで、5行ずつ結合したセルをズラーっと並べるということ?
0849デフォルトの名無しさん2016/11/10(木) 23:24:17.22ID:C6WoAcNN
手動でやるなら
(1)D12から16を結合して、すべてを範囲選択(Ctrl+A)
(2)その結合したセルに数値の1を入力する。
(3)すべての行の高さを小さくする。まあ、4くらいかな。
(4)1で結合したセルの右下の小さな四角(フィルハンドル)を、したにずーとドラッグ。数値が300になるまで。

(2)は300個目がわかりやすくするため、(3)はドラッグしやすくするため。
数字が邪魔ならD列を選択してデリート。
行の高さは好きなように変更。
0850デフォルトの名無しさん2016/11/10(木) 23:26:46.61ID:C6WoAcNN
範囲選択の手順がおかしいか。数値入力後に全選択ですね。
0851デフォルトの名無しさん2016/11/11(金) 00:01:52.59ID:zMjrip9k
VBAスレだった。大変失礼しました。
dim i as integer
for i=1 to 300
でやってください。
0852デフォルトの名無しさん2016/11/11(金) 00:03:08.39ID:GlnYZJcU
不要なvbaを作るくらいなら標準機能を提供するのも大切と思う
0853デフォルトの名無しさん2016/11/11(金) 23:20:47.66ID:8zpQ9HPA
他人が作ったソースコードを読んだ時、
変数名がウンコとかゲロだったら、
私は、どんな気持ちになるでしょう。
0854デフォルトの名無しさん2016/11/12(土) 00:09:36.73ID:nJWkDdF7
(´・ω・`)知らんがな
0855デフォルトの名無しさん2016/11/12(土) 00:45:03.30ID:UW74nP38
>>853
そう言えば昔、変数名がサザエさんに出てくる人物名で出来てたのを見たことがあるぞ。
海平やなぎえの名前が出てきたときはネタ切れ近いなと思ったもんだ。
0856デフォルトの名無しさん2016/11/12(土) 01:17:42.88ID:cF4FMkKt
シートの保護の引数のtruefalseを取得するにはどうしたらいいですか?
シートが保護されているかどうかではなく、オブジェクトが保護されているか、列削除が許されているかなどの引数になる部分を判別したいです。
0857デフォルトの名無しさん2016/11/12(土) 02:00:51.27ID:/qY7Fe9v
>>856
これじゃね?

Protection オブジェクト
https://msdn.microsoft.com/ja-jp/library/office/ff839872.aspx
0858デフォルトの名無しさん2016/11/12(土) 07:09:25.09ID:gb02Qdrd
http://qiita.com/advent-calendar/2016/vb

Visual Basic Advent Calendar 2016
「Visual Basic Advent CalendarはVisual Basic絡めば.NETでもVBでもOfficeでも発表できるAdvent Calendarです。」
ToolやライブラリのTipsから、書籍紹介、Visual Basicへの熱い思い吐露、何でも良いので是非ご参加ください!!
※毎年記事が少ないため、新規記事でなくても今年書いた記事であれば、リンクするといった方法でも構いません。
0859デフォルトの名無しさん2016/11/12(土) 13:05:10.42ID:bdV5Mpg7
変数名、悩むな。

↓こうやって書くぐらいなら
Dim Saidai As Long '最大値

↓最初からこうするか、
Dim 最大値 As Long

↓こんなんでも良いんじゃないかって。
Dim a As Long '最大値
0860デフォルトの名無しさん2016/11/12(土) 14:24:02.76ID:bhw+jnlA
>>859
3番目は絶対にない
保守性が落ちるから自分の首を絞めるだけ
使い捨ての小規模なコードならコメントなんて書かないし、型指定も省略するのが普通だから
0861デフォルトの名無しさん2016/11/12(土) 15:03:04.04ID:11HP6hAM
>>860
そうかな?
ローカル変数がひとつだけのプロシージャはかなりの割合を占めるし、だいたい a, b, x, tmp のたぐいで済ますよ。
0862デフォルトの名無しさん2016/11/12(土) 15:17:25.70ID:Ayj+NND5
俺は使い捨ての小規模なコードでも型はちゃんと指定するがな
0863デフォルトの名無しさん2016/11/12(土) 15:19:08.08ID:11HP6hAM
型は指定するだろうね。
変数名は考えたらむしろ損した気分
0864デフォルトの名無しさん2016/11/12(土) 16:03:05.47ID:aSOc4HNc
こんなの宗教論争みたいなもんで好きなようにやれよとしか。
グループや会社でとかなら命名規則ってのを作ってそれに従えで済む。また作って無くてもそれなりに他者のこと考えて命名するだろ。
0865デフォルトの名無しさん2016/11/12(土) 17:09:28.07ID:kLqJUNFv
一文字の変数はForループのカウンタで使うi,jとか座標を表すX,Y,Z辺りは
コメントがなくても分かりやすいな
さすがに最大値をaとするとある程度長いコードでは混乱しそうだ
0866デフォルトの名無しさん2016/11/12(土) 17:44:53.99ID:gb02Qdrd
MaxValu
0867デフォルトの名無しさん2016/11/12(土) 17:45:13.81ID:0OeGt4X7
変数名は分かり易く簡潔なのが基本だから仕事場の規則を守った上でそれだけ気をつけてればいい気がする。
0868デフォルトの名無しさん2016/11/12(土) 18:26:27.18ID:gRMP0FIA
MiniStopとセットで使えば岡田の回し者だな
0869デフォルトの名無しさん2016/11/12(土) 18:31:28.81ID:ZDhDT3ub
名前に悩む前にコード整理した方がいい
名前で悩むってことはその変数の意味が不明瞭ってことだからね
綺麗なコードを書けば変数の意図が明確になり名前では悩まない
というか名前で悩むどころか変数そのものが不要だったと気が付くことも多い
0870デフォルトの名無しさん2016/11/12(土) 20:31:49.31ID:Ayj+NND5
さすがに変数が不要だったとかいうレベルはクリアしてからの変数名の検討だと思うが

まあ最終的には宗教論争になるのは間違いないけどw
0871デフォルトの名無しさん2016/11/12(土) 23:08:09.58ID:l9OhshgV
>>870
理想論で言えばそうだけどね
人間は不完全な生き物だから仕方がない
うまくやっている前提で名前に悩むより
名前に悩んでるってことはうまくできてないんだって考えたほうがいい
0872デフォルトの名無しさん2016/11/12(土) 23:14:22.54ID:gAoMoCce
一番悩むのが一時的な変数の名前だけども
関数をそのまま変数と同じ扱いに出来るから、本当に後から変数が不要である事に気がつくケースも結構ある。
0873デフォルトの名無しさん2016/11/12(土) 23:22:30.47ID:jqiT4x9G
その前にお前らはそのマクロが不要である事に気がつくべきなんじゃないかw
0874デフォルトの名無しさん2016/11/12(土) 23:51:13.13ID:Cma5TRha
>>872
一時的な変数なら
tmp1とかで良いんじゃね
0875デフォルトの名無しさん2016/11/12(土) 23:57:16.26ID:ZEtGmRlw
お金をかけないでこの問題を解決する方法があったら、書き込んで下さい。


【IT】エクセルをワープロのように使うとデータの再利用が困難、河野太郎議員が文科省へ全廃を指示★2 [無断転載禁止]&copy;2ch.net
http://potato.2ch.net/test/read.cgi/bizplus/1478338699/
0876デフォルトの名無しさん2016/11/13(日) 00:09:41.63ID:5nPhLLJA
>>875
教育にも啓蒙にも金がかかるから絶対無理
0877デフォルトの名無しさん2016/11/13(日) 01:30:53.78ID:kb3K5XaB
神エクセルって嫌味の意味での神かよ。
0878デフォルトの名無しさん2016/11/13(日) 04:17:38.04ID:UKerATrZ
>>859
2番目に落ち着いてる
いかにもシロート臭いがそんなんで格好つけても仕方ねえ
一目瞭然なのが一番だ
0879デフォルトの名無しさん2016/11/13(日) 16:37:49.03ID:mDEMZo5d
以下の作業を考えています。
@アクティブなexcelからi eのウインドウを起動する
(この時点でieのウインドウがアクティブになる)
A既存のexcelのウインドウをアクティブにする

@は簡単なのですがAがうまくいきません。
以下のものを使ってみたのですが、タスクバーのexcelが点滅するだけです。
appactivate
setforeground
何かいい方法はございますでしょうか。
0880デフォルトの名無しさん2016/11/13(日) 17:35:33.42ID:C4V9mz3A
>>395

=2・PI()は表示できるようになった(yoyakuにPIを追加した)
のですが
PI()・2はエラーになる。

どうしてだろう。
0881デフォルトの名無しさん2016/11/13(日) 18:35:09.11ID:X+rsvORY
>>879
ieのobject.visible=false
じゃダメ?
0882デフォルトの名無しさん2016/11/14(月) 03:28:25.66ID:qE38ruGr
vbaでb列に名前を削除としその下にチェックボックス
その右の列にデータを入力cからh列を入力
行は2行目から10行目
そのうえでb列のチェックボックスにチェックを入れてコマンドボタンを押すと
cからh列の値のみ削除されデータを繰り上げるということをしたいのですが
今のところできたのがチェックボックスとコマンドボタンで中の制御構文
をどうしたらいいのかわかりません。
どなたか作っていただけませんか?
データは入力規則で入力したいのであくまで行の削除ではなくて値のみの削除で
そのデータを削除したら下のデータが繰り上がるということをしたいです。
0883デフォルトの名無しさん2016/11/14(月) 04:36:57.62ID:Gs7eAaE8
絵かサンプルアップしてください。
よくわからない。特にB列
あとチェックボックスをワークシートに配置は面倒臭いしあんまりおすすめでないけど、チェックボックスじゃないといけないのかな。
0884デフォルトの名無しさん2016/11/14(月) 05:24:55.36ID:vkotuMbC
テスト
i1739584-1479068655.jpg
0885デフォルトの名無しさん2016/11/14(月) 05:29:43.18ID:vkotuMbC
多分ごくごく簡単なものだと推察されますがいかんせんVBAを初めて
むしろまだはじまってないくマクロでシクハクしている状態です。
やりたいのは削除を各行を選択後削除のコマンドボタンを押して
さらに開いた行にデータを以降させるということです。
いろいろ調べた結果一行チェックボックスにマクロを登録し一行ごとに削除
並べ替えのコマンドボタンにて行の並べ替えを実行でき一応やりたいことができました。
がこれを一つのコマンドボタンで行いたいです。
http://iup.2ch-library.com/i/i1739584-1479068655.jpg
08868952016/11/14(月) 05:33:25.88ID:vkotuMbC
ちなみに、一行ごとに
Range("C3:H3").Select
Selection.ClearContents
というコードをマクロの記録にて登録しました。
08878832016/11/14(月) 06:04:36.90ID:Gs7eAaE8
Dim i As Integer, j As Integer, k As Integer
'(1)まずチェックした行のデータ削除

For i = 2 To 10 'データ範囲の行数(ここでは2から10で固定)
For j = 3 To 8 'データ範囲の列数(ここではC-Hで固定)
If Cells(i, 2) = True Then
Cells(i, j) = ”” 'B列がTRUEの場合、C-H列の値をクリア
End If
Next j
Next i

'(2)C-Hが空白か調べて、空白なら上に詰める
For i = 2 To 10
For j = 3 To 8
If Cells(i, j) = ”” Then
Cells(i, j) = Cells(Cells(i, j).End(xlDown).Row, j)
Cells(Cells(i, j).End(xlDown).Row, j) = ””
End If
Next j
Next i

'チェックボックスのチェックを全て外す
Dim chkbox As Object
For Each chkbox In ActiveSheet.CheckBoxes
chkbox.Value = 0
Next
End Sub
08888832016/11/14(月) 06:08:32.00ID:Gs7eAaE8
わたしも初心者なので、動作は保証しませんが。

ダブルクォーテーション3か所、全角にしてるので半角に直してください。

(1)と(2)の処理は同時にできるかもしれないけど、分けてます。
あとチェックボックスのリンク先をB列にしてるので、ほかの列にするなら、
If Cells(i, 2) = Trueのところを変更。
0889デフォルトの名無しさん2016/11/14(月) 06:22:41.23ID:vkotuMbC
ありがとう!できました。すごいですね。
ちなみに難易度はどれくらいですか?
0890デフォルトの名無しさん2016/11/14(月) 06:31:19.90ID:Gs7eAaE8
かなり易しい部類だと思います。
10段階で1か1.5くらいでしょう。
基本を勉強すれば2週間くらいで書けると思います。最後のチェックを外すところはネットで調べましたが。

(2)のところはあとから思ったけど、空白かどうか判定するよりも1と同じようにtrueかどうかにした方が良かったかもしれません。
0891デフォルトの名無しさん2016/11/14(月) 06:36:14.46ID:Gs7eAaE8
あと変数kはいらなかったです。
k as integerのところは消しておいてください。
0892デフォルトの名無しさん2016/11/14(月) 06:42:53.80ID:vkotuMbC
やっと変数を覚えた段階なので今その制御構文に取り掛かっていたのですが
自分でそれを一から考えても全く思い浮かびませんでした。
助かりました。
0893デフォルトの名無しさん2016/11/14(月) 07:30:43.10ID:zK1b0bJz
好みなんだろうけど
シクハク → 四苦八苦
0894デフォルトの名無しさん2016/11/14(月) 08:16:07.77ID:9G/79pzu
クハサハシ
0895デフォルトの名無しさん2016/11/14(月) 08:38:57.31ID:VJoz8++w
>>857
おお!ありがとう
こういう検索しても出ないオブジェクトってどうやって探してるの?
0896デフォルトの名無しさん2016/11/14(月) 09:42:06.08ID:XBbATuSO
>>879
WindowsAPIのが確実な気がする
0897デフォルトの名無しさん2016/11/14(月) 10:01:20.25ID:y/BxAY6M
>>896
×WindowsAPIのが確実な気がする
◎WindowsAPIの方が確実な気がする
〇WindowsAPIが確実な気がする

正しい日本語をしゃべりなさい。
0898デフォルトの名無しさん2016/11/14(月) 10:06:41.68ID:mMXXKTme
>>879
一番簡単なのは

Sendkeys "%{TAB}"

ただしタイミングによっては失敗することがある

AppActivateで失敗するのは、これがウィンドウの切り替えだけでなくテキストボックスなどにフォーカスを移す命令だから
入力エリアなどが存在しない場合は失敗してタスクバーのアイコンが点滅して知らせてくれる
ほかにもAppActivateが失敗する条件は色々あるけど、詳しくはマニュアルを読んでくれ
0899デフォルトの名無しさん2016/11/14(月) 10:09:58.91ID:y/BxAY6M

ただしタイミングによっては失敗することがある
AppActivateで失敗するのは、これがウィンドウの切り替えだけでなくテキストボックスなどにフォーカスを移す命令だから
入力エリアなどが存在しない場合は失敗してタスクバーのアイコンが点滅して知らせてくれる
ほかにもAppActivateが失敗する条件は色々あるけど、詳しくはマニュアルを読んでくれ

×
ただしタイミングによっては失敗することのがある
AppActivateで失敗するのは、これのがウィンドウの切り替えだけでなくテキストボックスなどにフォーカスを移す命令だから
入力エリアなどのが存在しない場合は失敗してタスクバーのアイコンのが点滅して知らせてくれる
ほかにもAppActivateのが失敗する条件は色々あるけど、詳しくはマニュアルを読んでくれ
0900デフォルトの名無しさん2016/11/14(月) 10:11:55.47ID:bYidlaNb
その時、「正しい日本語」なんていう、どこにも存在しない物を信じてる人がまだいたとは驚きだ、と次郎は思ったのだった
0901デフォルトの名無しさん2016/11/14(月) 10:20:11.44ID:3bgtRy5M
>>896
今api解読してますありがとう。
declare以下の仕組みに四苦八苦。
>>898
ありがとうございます。
試してみます。
0902デフォルトの名無しさん2016/11/14(月) 11:06:26.96ID:3bgtRy5M
api使ってできました。
ありがとうございました。
09038812016/11/14(月) 11:31:58.97ID:7yXlcOLW
>>902
ダメなのか・・・しょぼーん。
0904デフォルトの名無しさん2016/11/14(月) 21:12:12.23ID:YreTgBx8
標準モジュールにあるaというプロシージャをcustomUIのリボンからも右クリックのコンテキストからも、他の標準モジュールからも実行出来るようにしたいのですが上手く行きません

標準モジュールは
Sub a (ByVal control as IRibboncontrol)
msgbox "hoge"
End sub

Sub b()
Dim control as IRibboncontrol
Call a(control)
End sub

Sub auto_open()
Dim control as IRibboncontrol
With Application.CommandBars("Cell").Controls.Add()
.Caption = "hogeを表示"
.OnAction = "'a(control)'"
End With
End Sub

でbからは呼び出して手動でも実行でき、またcustomUI14.xmlで作ったリボンからも実行できましたが、追加した右クリックメニューからは実行出来ません。
引数の渡し方もしくは引数にしているcontrolの宣言が違うと思うのでググって色々書き方を変えてみましたが
追加したメニューから実行すると「オブジェクトがありません」か「引数を省略出来ません」になってしまいます。
bでcontrolが宣言だけで何もSETしてないのに動くのも謎です。

どこをどう直せば良いでしょうか

hoge
0905デフォルトの名無しさん2016/11/14(月) 21:31:58.98ID:RYCjZu6f
>>904
とりあえずdebug.printとかデバッガでどう呼び出されてるか確認したら?
0906デフォルトの名無しさん2016/11/14(月) 21:32:22.95ID:E11ED6xY
以下のようなデータがあります。
データ http://iup.2ch-library.com/i/i1739863-1479124886.png

これを所定の様式に入力し、以下のような一覧表
様式 http://iup.2ch-library.com/i/i1739864-1479124886.png

を作成するためのマクロを作成していますが、管理番号・納入年月が
同じ場合、入力欄へデータを横並びに入力させ、異なる場合は
入力欄を移動させる方法がわかりません。

(条件)
・一つの管理番号には、一つの納入先(+納入場所)しか対応しない。
・管理番号と販売月度が同じなら、異なる製品分類でも横列でまとめる。
・管理番号、販売月度のいずれかが異なる場合、次の入力欄へ移動する。

当初、元データに対して、
1.管理番号、納入先名称。納入年月を変数で取得、様式へ転記
2.select case で分類毎の入力列を指定し、それをDo while 〜Loop で
  で繰り返し処理(管理番号・納入年月が同じ間は繰り返し)
というやり方を考え、自分でコードを作ってみたのですが、どうしても
こちらが希望するような処理ができません。
0907デフォルトの名無しさん2016/11/14(月) 21:35:18.69ID:E11ED6xY
どのようなコードを組んだら、
様式 http://iup.2ch-library.com/i/i1739864-1479124886.png
のようにデータ入力させることができるのか、どなたかお知恵を
お貸し頂けますよう、お願いいたします。
0908デフォルトの名無しさん2016/11/14(月) 21:41:04.76ID:Gs7eAaE8
複数条件ならselect case より、if thenの方が使いやすいのでは?
0909デフォルトの名無しさん2016/11/14(月) 21:45:22.91ID:pylbFMMV
使いやすいかどうかではなく、
どの方法が速いかで考えて、
ハマったでござる。
0910デフォルトの名無しさん2016/11/14(月) 22:03:21.82ID:34lnUZ5u
現状でマクロを作ったとしても将来分類Noが増えたらどうすんだとか
セルの連結しまくりとか自分が作らされるのでなければ考えたくないw
0911デフォルトの名無しさん2016/11/14(月) 22:22:01.19ID:p26anzny
>>907
最初のレコードへの行オフセットとレコードの行数とレコード内の各プロパティへの行列オフセットを定数で用意すればシンプルなループ処理だけでデータを読み込めるよ
0912デフォルトの名無しさん2016/11/14(月) 22:25:51.06ID:/njF1aB/
ピボットテーブルだかクロス集計だかを駆使して加工後、様式に当てはめる
Vector 辺りにいろいろフリーソフト出してる作者に依頼して¥20,000 程度の案件
やたらと言葉遣いが丁寧だけれど、業務として請け負ってるものをここで聞くなら
それなりに偽装は必要  成果物があからさまなのでこれは発注側からクレーム来るケース
発注者は上司かも知らんが
0913デフォルトの名無しさん2016/11/14(月) 22:37:50.59ID:tO38JPdI
>>907
そういうフォーマットに印刷したいだけでしょ
ならばAccessでやるのがふつう
0914デフォルトの名無しさん2016/11/14(月) 23:18:07.65ID:8ZP1uHGR
ナンバーと名称は一意なんだろか
横並びにするのが勿体無い
0915デフォルトの名無しさん2016/11/14(月) 23:53:46.11ID:7yXlcOLW
・管理番号と販売月度が同じなら、異なる製品分類でも横列でまとめる。
・管理番号、販売月度のいずれかが異なる場合、次の入力欄へ移動する。
そのまま書けばよいと思うのですけれど・・・。どこでひっかかってる?
セル結合とかの書式は別のマクロで整えれば後々の変更もやりやすいかな。

(条件の順序かえたけど)
(ソートが必要ならまずソート)1行づつ最後までなめる
管理番号、販売月と前行管理番号、前行販売月と比較
・管理番号、販売月度のいずれかが異なる場合、新レコード記入
・管理番号と販売月度が同じなら、製品分類を該当列に記入
記念日だったら、メッセージを出して終了
0916デフォルトの名無しさん2016/11/15(火) 00:39:37.66ID:XpOheRi2
>>904
OnActionの引数には変数の値は使えなかったと思う
(.OnAction = "'a ""引数""'" ←とかのように文字列の引数は出来るけど)

a()関数の引数をOptionalにしてメニューからの呼び出し時は引数無しにしたら?

-----------------
Sub a(Optional ByVal control As IRibbonControl)
 If (control Is Nothing) Then
  MsgBox "hoge->menu"
 Else
  MsgBox "hoge->Ribbon"
 End If
End Sub

Sub auto_open()
 With Application.CommandBars("Cell").Controls.Add()
  .Caption = "hogeを表示"
  .OnAction = "a"
 End With
End Sub
0917デフォルトの名無しさん2016/11/15(火) 01:07:54.55ID:B219Se7j
vbaって基本引数にByVal付けたほうがいいんですか?
0918デフォルトの名無しさん2016/11/15(火) 04:40:03.19ID:v8aL5YBj
>>917
基本は「適切に使い分ける」

どちらかと言えば、付けなくていいように考える
0919デフォルトの名無しさん2016/11/15(火) 07:02:23.61ID:B219Se7j
>>918
ありがとうございます
やはり速くする為でしょうか?
変数の再利用に気を付けなければ
0920デフォルトの名無しさん2016/11/15(火) 07:44:01.78ID:+FB/ARQG
>>919
byval と byref の違いは理解してますか?
byrefの必要がなければbyvalの方が安全だと思う
0921デフォルトの名無しさん2016/11/15(火) 07:48:04.12ID:MOCCR4Fa
>>919
速度に違いはないと思う
個人的にはどのように扱うかを見分けるために記載するイメージ

詳しくはココ
https://msdn.microsoft.com/ja-jp/library/cc436524(v=vs.71).aspx
0922デフォルトの名無しさん2016/11/15(火) 08:08:55.68ID:wcWx6QZb
>>907
・そういうフォーマットからデータを入力したい
・すでにあるデータをそのフォーマットで出力したい
どっち?

>>913
Access 廚は巣に帰れよ
0923デフォルトの名無しさん2016/11/15(火) 08:14:24.73ID:I1rOpQ0I
>>915
>管理番号、販売月と前行管理番号、前行販売月と比較
この部分で引っかかっています。
手元に残っている、Do Loop文を設定する前の式ですが、どこを修正するべきでしょうか?

Sub Main_Make()

Dim DataFileName, strFileName As String
'DataFileName = データファイル名、strFileName = 様式ファイル名

Dim Data_GYO As Integer
Dim KANRI,NONYU,BUNRUI,MONTH,BASYO,JURYO As String
Dim MaxRow_Data2 As Integer

Workbooks(DataFileName).Worksheets(1).Activate
Workbooks(DataFileName).Worksheets(1).Range(
09249232016/11/15(火) 08:17:50.12ID:I1rOpQ0I
途中で切れてしまいました。

Sub Main_Make()

Dim DataFileName, strFileName As String
'DataFileName = データファイル名、strFileName = 様式ファイル名

Dim Data_GYO As Integer
Dim KANRI,NONYU,BUNRUI,MONTH,BASYO,JURYO As String
Dim MaxRow_Data2 As Integer

Workbooks(DataFileName).Worksheets(1).Activate
Workbooks(DataFileName).Worksheets(1).Range("A1").Select

MaxRow_Data2 = Workbooks(DataFileName).Worksheets(1).Cells(Rows.Count, 1).End(xlUp).Row
09259232016/11/15(火) 08:19:17.53ID:I1rOpQ0I
Workbooks(strFileName).Worksheets(1).Activate
Workbooks(strFileName).Worksheets(1).Range("C10").Select

For Data_GYO = 1 To MaxRow_Data2
'//転記データを変数として取得
KANRI = Workbooks(DataFileName).Worksheets(1).Cells(Data_GYO, 1).Value
NONYU = Workbooks(DataFileName).Worksheets(1).Cells(Data_GYO, 4).Value
MONTH = Workbooks(DataFileName).Worksheets(1).Cells(Data_GYO, 6).Value
BASYO = Workbooks(DataFileName).Worksheets(1).Cells(Data_GYO, 8).Value
JURYO = Workbooks(DataFileName).Worksheets(1).Cells(Data_GYO, 9).Value

'//管理番号と納入先を入力する。
Workbooks(strFileName).Worksheets(1).Cells((4 * str_GYO -1), 1) = KANRI
Workbooks(strFileName).Worksheets(1).Cells((4 * str_GYO -1), 3) = NONYU

BUNRUI = Workbooks(DataFileName).Worksheets(1).Cells(Tmp_GYO2, 5).Value
09269232016/11/15(火) 08:20:19.39ID:I1rOpQ0I
Select Case BUNRUI
Case 1
 Workbooks(strFileName).Worksheets(1).Cells((4 * str_GYO -1), 3).Value = MONTH
 Workbooks(strFileName).Worksheets(1).Cells((4 * str_GYO -1), 3).Value = BASYO
 Workbooks(strFileName).Worksheets(1).Cells((4 * str_GYO -1), 3).Value = JURYO
Case 2
 Workbooks(strFileName).Worksheets(1).Cells((4 * str_GYO -1), 4).Value = MONTH
 Workbooks(strFileName).Worksheets(1).Cells((4 * str_GYO -1), 4).Value = BASYO
 Workbooks(strFileName).Worksheets(1).Cells((4 * str_GYO -1), 4).Value = JURYO
Case 3
 Workbooks(strFileName).Worksheets(1).Cells((4 * str_GYO -1), 5).Value = MONTH
 Workbooks(strFileName).Worksheets(1).Cells((4 * str_GYO -1), 5).Value = BASYO
 Workbooks(strFileName).Worksheets(1).Cells((4 * str_GYO -1), 5).Value = JURYO
Case Else
 Workbooks(strFileName).Worksheets(1).Cells((4 * str_GYO -1), 6).Value = MONTH
 Workbooks(strFileName).Worksheets(1).Cells((4 * str_GYO -1), 6).Value = BASYO
 Workbooks(strFileName).Worksheets(1).Cells((4 * str_GYO -1), 6).Value = JURYO
End Select
Next Tmp_GYO2
End Sub
09279232016/11/15(火) 08:21:39.53ID:I1rOpQ0I
あ゛ー、str_GYOの変数宣言忘れてた…
0928デフォルトの名無しさん2016/11/15(火) 08:51:10.12ID:B219Se7j
>>920-921
perの参照渡し・Cのポインタ的なものと認識してます
呼び出し元のを変える必要がなければByValで良さそうですね
ありがとうございました
0929デフォルトの名無しさん2016/11/15(火) 10:30:41.82ID:pbCCsymd
エクセルの条件付き書式を全取得し
シートに書き込みたいのですが良い方法はありませんか?
09309152016/11/15(火) 10:36:13.00ID:qrZELqcd
まずは落ち着いて、人の話を聞いてくださいな。
やり方はいくらでもあるのだけれど「比較してから分岐」って書いたでしょ。
それを試みたのならともかく、
夏井いつき先生じゃないんだから、あなたの書いたものを全部読むのもうまく修正するのも面倒です。
「引っかかる」というのは「書いたけどうまく動作しない、なぜだ?」というときに
使ってください。まるっきり書けないなら「わかりません」です。
整理できてきましたか?cells(a,b)とcells(a-1,b)を比較すればいいんですよ。
あぁエクセルって便利。他言語だと配列とかコレクションとかしたり入れ替えたりしなきゃならない。
09319152016/11/15(火) 10:53:57.16ID:qrZELqcd
ごめん、930は >>923 あて。落ち着け俺。
0932デフォルトの名無しさん2016/11/15(火) 11:01:19.80ID:qrZELqcd
お詫びついでに
>>929
マクロの記録、全選択、コピー、別シート、形式を選択して貼り付け--数式と数値の書式
マクロの記録終了 alt+F11 でらしいマクロを見る。
ということではなくて、PasteSpecialの定数を引っ張りだしたいということ?
0933デフォルトの名無しさん2016/11/15(火) 11:49:08.54ID:3RGLlSyj
>>929
条件付き書式を全取得って具体的にはどう言うこと?
0934デフォルトの名無しさん2016/11/15(火) 11:53:38.10ID:pbCCsymd
>>933
条件付き書式で色をつけてるんだが
その条件を取得したいんや
結合セルの取得方法がイマイチわからん
0935デフォルトの名無しさん2016/11/15(火) 12:00:39.77ID:C8x5T/UR
>>934
range.formatconditionsコレクションで取得できるみたいだが
0936デフォルトの名無しさん2016/11/15(火) 12:04:32.51ID:MOCCR4Fa
>>930
夏井いつきって何?

実際コードが出てくるのだから「書いたけどうまく動作しない、なぜだ?」に当てはまる

お前が書いたことと特定の相手に伝わったかどうかは別問題
0937デフォルトの名無しさん2016/11/15(火) 12:21:13.41ID:mEh6VPdi
>>928
速度に関して、配列は違いが出るからそこだけ注意すればおk
0938デフォルトの名無しさん2016/11/15(火) 12:26:01.35ID:xzLWMGHa
>>936
そのコードの
>管理番号、販売月と前行管理番号、前行販売月と比較
しているつもりのところはどこですか
0939デフォルトの名無しさん2016/11/15(火) 12:39:15.10ID:b39+S9Ed
夏井いつきってアレだろ?ヤれない方のBBA
この手のBBAはまるで利用価値がない
09409232016/11/15(火) 13:00:16.35ID:I1rOpQ0I
>>915
>cells(a,b)とcells(a-1,b)を比較すればいいんですよ。
こんな単純な事に気が付いていませんでした。。。
ご指摘ありがとうございます。

残る原因は、ループ処理させるポイントが間違っている事ですが、
こちらについては自分で虱潰しに調べて直してみます。

本当にありがとうございました!
0941デフォルトの名無しさん2016/11/15(火) 13:17:06.92ID:pbCCsymd
>>935
適用先はどうしる?
09429322016/11/15(火) 13:49:04.47ID:qrZELqcd
>>934
fcds = cells(a,b).FormatConditions
value = fcds(i).propaty
って感じ?未だに2002だからあてずっぽ。
結合はMergeCellsとMergeAreaあたりを検索してみてはいかがでしょうか。
この辺ってマクロの記録じゃでてこんなのかな。
>>938
フォローありがとう。
>>939
きっと、その人とは違うと思います。
>>940
上から言うようで気がひけるけれど、マクロは自分がやっていること
(操作の手順、目で見てこれとこれを比べるとか手の動き以外も含む)
をその順番に書く、繰り返してるならループするし、分岐するならifする。
そんだけのことです。お礼はあるがお詫びはないのね。がんばってね。
09439322016/11/15(火) 13:55:09.54ID:qrZELqcd
>>941
Countプロパティ
・・・なんか最初っから俺のこと無視てるよなー。まぁいいけど。以降、黙りますです。
0944デフォルトの名無しさん2016/11/15(火) 18:52:44.86ID:mEh6VPdi
#If ステートメントを使ってアプリがエクセルかどうかを判定するってできないでしょうか?
0945デフォルトの名無しさん2016/11/15(火) 19:19:23.49ID:C8x5T/UR
>>944
application.nameでなんか取れそう
0946デフォルトの名無しさん2016/11/15(火) 20:28:16.40ID:mEh6VPdi
>>945
それはダメだったんですよ
#If Right(Application.Name, 5) = "Excel" Then
とか
0947デフォルトの名無しさん2016/11/15(火) 20:37:21.04ID:+FB/ARQG
>>946
なんで#付けないといけない?
プリプロセッサじゃなくて普通のifでよく無い?
0948デフォルトの名無しさん2016/11/15(火) 20:45:18.05ID:DZRsu6fB
プロジェクトのプロパティ開いて「条件付きコンパイル引数」に
条件付きコンパイラ定数を宣言すればいいんじゃ
0949デフォルトの名無しさん2016/11/15(火) 21:51:06.87ID:mEh6VPdi
Officeで使う共通VBAを .bas ファイルにしてインポートして使ってるんだけど、ひとつだけ引数に
Range オブジェクトを持つ関数がある(エクセルのときだけの関数)。
できればこれを #If で選択コンパイルしたい。
関数ひとつだけで .bas ファイルを作るのもなんか悔しいし。
0950デフォルトの名無しさん2016/11/15(火) 22:33:36.55ID:vvWxU9vK
エクセルの時以外は使わなくて済むなら、エクセルの時も使わなくて済むんじゃないのか。

どうしてもセル使わないと出来ない事ならbasを分離するか、
必ずExcel.Applicationを生成して使うようにするかのどっちかしかないと思うんだが。
0951デフォルトの名無しさん2016/11/15(火) 22:47:46.37ID:M+oXlzF6
>>949
As Objectでレイトバインディングでいけないかね?
0952デフォルトの名無しさん2016/11/15(火) 23:29:01.88ID:mEh6VPdi
>>950,951
まあそうなりますかね。。。
As Object で TypeName をチェックしてやってみます。
0953デフォルトの名無しさん2016/11/16(水) 12:28:26.30ID:rMPmma8i
>>942
いや合ってるわwそれともお前ブスBBA専か?w
0954デフォルトの名無しさん2016/11/16(水) 13:00:12.92ID:Df5TP3Hl
>>942
それはどうかな
09559422016/11/16(水) 13:29:13.73ID:X37uQtHl
>>953
人の価値は性的なもの以外もたくさんあるのですよ。
ヤれない方のBBAということはヤれる方のBBA(とは限らんか)が存在するわけで
その人がわからないのでそんなVBAだったらエラーがでる。とスレにあわす。
>>954
操作をそのまま書く旨のことを指して言っているのであれば、
操作をそのまま書くもの以外なら他の言語を使って必要ならところでExcelを
他言語から操作するほうが楽な例しか思いつかんのだが間違っているかもしれんね。
0956デフォルトの名無しさん2016/11/16(水) 20:54:02.15ID:ZWRfUawl
>>916
ウヒューーー!
そんな手があったのか、出来ました!
サンキューーーーーう!うひゅー!!
0957デフォルトの名無しさん2016/11/16(水) 22:39:50.85ID:3axx9vSG
>>956
Sub b()とはいったい何だったのか
0958デフォルトの名無しさん2016/11/17(木) 02:46:59.40ID:hgkL7lQN
>>957
Sub a単体でひとつの目的を叶えるもので利便性のためリボンとコンテキスト両方から実行可能にしたいけど、
もっと大きい目的を叶えるsub bの中の1ステップとしてもsub aを流用しています
0959デフォルトの名無しさん2016/11/17(木) 02:52:59.36ID:hWgAVNcQ
そんなある日、Sub c()が現れて、こう言いました
0960デフォルトの名無しさん2016/11/17(木) 06:31:14.61ID:NGDL6wiI
サビシー
0961デフォルトの名無しさん2016/11/17(木) 08:48:55.51ID:p1ecJ/vx
>>960
うんこれこれ
0962デフォルトの名無しさん2016/11/17(木) 12:29:40.77ID:ir/fHuQ7
>>955
もはや支離滅裂だなw
知らんくせに分かったふりしたかるからそうなる
たかがブスBBAの話題なのにw
0963デフォルトの名無しさん2016/11/17(木) 13:35:40.91ID:cCW+kjNA
ブックAには「店舗1」〜「店舗100」の100枚のシートがあり、
それぞれ、1〜253行目までデータが存在しています。

新たなブックBまたはブックAの101枚目でも構わないのですが、
その1枚のシートに、上から
「店舗1の253行のデータ」→「店舗2の253行のデータ」→・・・
と、縦に並べたデータベースを作りたいのですが、
どのようなマクロを記述したらいいでしょう?
0964デフォルトの名無しさん2016/11/17(木) 13:46:54.01ID:SIbcJcrO
>>963
Sub CollectData()
  Dim w As Worksheet
  Dim dst As Worksheet
  Dim rowNum As Long
  
  Set dst = Worksheets("Summary")
  rowNum = 1
  
  For Each w In Worksheets
    If w.Name <> "Summary" Then
      dst.Rows(rowNum) = w.Rows(253).Value
      rowNum = rowNum + 1
    End If
  Next
End Sub
0965デフォルトの名無しさん2016/11/17(木) 14:13:15.10ID:cCW+kjNA
>>964
早速ありがとうございます!
末尾の空のシート名を「Summary」にすればいいのですね?
動作確認できました!が・・・説明が下手ですみません。
「253行目のデータ」ではなく「全253行のデータ(1〜253行)」をコピーしたかったのです><
0966デフォルトの名無しさん2016/11/17(木) 14:31:59.15ID:SIbcJcrO
For Each w In Worksheets
  If w.Name <> "Summary" Then
    dst.Range(rowNum & ":" & rowNum + 252) = w.Range("1:253").Value
    rowNum = rowNum + 252
  End If
Next
0967デフォルトの名無しさん2016/11/17(木) 14:33:57.96ID:SIbcJcrO
間違った。
rowNum = rowNum + 252

rowNum = rowNum + 253
0968デフォルトの名無しさん2016/11/17(木) 14:35:39.10ID:/vRe99Sl
rowNum = rowNum + 252

rowNum = rowNum + 253
0969デフォルトの名無しさん2016/11/17(木) 15:33:17.59ID:cCW+kjNA
完璧にイメージ通りに動作しました!
ありがとうございます!神です!
0970デフォルトの名無しさん2016/11/17(木) 16:14:03.10ID:UCWuOxD4
お前は紙だな
0971デフォルトの名無しさん2016/11/17(木) 17:36:30.49ID:cCW+kjNA
>>970
VBAのレベルはまだまだペーペーなので(ペーパーではないです!)
これから精進します!
0972デフォルトの名無しさん2016/11/17(木) 20:01:47.45ID:ymY9UHmK
Option Explicit

を記述しないと

  Dim i, m, k As Integer
  Dim Re, Im As Single

のように型宣言してもすべてVariant型として扱われてしまうのでしょうか?
0973デフォルトの名無しさん2016/11/17(木) 20:12:15.62ID:2uEvXvbE
Excel2016です。

Sheet1.Range("hoge")
Sheet2.Range("piyo")

2つは、同じ構造で値だけが違う表の範囲です。

hoge の各セルには、piyo と値が異なっていれば
フォントを太字にする条件付き書式が設定されています。


hoge から、条件付き書式で太字になっているセルを
抽出しようと思い、試しに各セルの

.FormatConditions(i).Font.Bold の値を調べてみました。

しかし、実際は hoge と piyo の値は同じで、
太字になっていないにもかかわらず、すべてのセルで
.Font.Bold = True が返ってきます(Italic などは False です)。

また、各セルの条件付き書式は、表の先頭(左肩)のセルの
ものがすべてのセルに設定されているように見えます。
しかし、条件付き書式自体は正しく動作しています。
これはなぜでしょうか?

また、この方法で条件付き書式で太字になっているセルを
取り出すことはできないのでしょうか?
0974デフォルトの名無しさん2016/11/17(木) 20:12:24.96ID:+ZjZtLcR
試してみれば?
0975デフォルトの名無しさん2016/11/17(木) 20:26:41.30ID:tywuRODY
>>972
option explicit
は変数宣言を省略できなくなるだけ
宣言したらその型になる
0976デフォルトの名無しさん2016/11/17(木) 20:29:15.27ID:tywuRODY
>>973
なんでformatconsitionsの値を見るの?
fontとかの値を見るんじゃね?
0977デフォルトの名無しさん2016/11/17(木) 20:42:12.97ID:/vRe99Sl
>>973
FormatConditionsから見たら条件付き書式のtrue時にどう設定するかを見てる
0978デフォルトの名無しさん2016/11/17(木) 20:45:05.64ID:bN2Unndl
>>973
エクセルに限った話ではないけど
GUIって全部アプリの内部状態を評価して描画してるだけだよ
シートや行や列やセルのスタイルや条件付き書式などを全部評価した結果が画面に表示される
逆方向はなにも保障されていない
09799722016/11/17(木) 20:50:57.77ID:ymY9UHmK
>>975
Public Sub BitRev()
  Dim i, m, k, N, tmp As Integer
  Dim X(8) As Integer
  N = 8
  For i = 0 To N - 1
   X(i) = Cells(i + 5, 3)
  Next i
  m = N / 2 'ビットリバース
  For i = 1 To N - 1
    If m < i Then
     tmp = X(i): X(i) = X(m): X(m) = tmp
    End If
    k = N / 2
    Do While m >= k
     m = m - k
     k = k / 2
    Loop
    m = m + k
  Next i
  For i = 0 To N - 1
   Cells(i + 5, 4) = X(i)
  Next i
End Sub
0980972 続き2016/11/17(木) 20:51:38.46ID:ymY9UHmK
 上記は FFT で使うビットリバース処理のコードです。これでうまくいくのですが、
N = 8 でコードを追っていてわからないところがあります。i ループの一番最後です。
  i = 7: m = 7
    tmp = X(7): X(7) = X(7): X(7) = tmp → X(7) = X7 つまり変化なし
    m = 7,k = 4 なので Do Loop 実行
     m = m - k = 3: k = k/2 = 2
    m = 3,k = 2 なので Do Loop 実行
     m = m - k = 1: k = k/2 = 1
    m = 1,k = 1 なので Do Loop 実行
     m = m - k = 0: k = k/2 = 0
    m = 0,k = 0 なので Do Loop 実行 ----> 無限ループになるのではないか?
 k はIntger で宣言されているので k=1 のとき k = k/2 = 0 になりそうな気がしますが、ウォッチ式
で確認すると k や m はVarian 型になるため無限ループに陥ることなく無事に終了します(笑)。
 このへんがよくわからないのです。
0981デフォルトの名無しさん2016/11/17(木) 21:09:22.18ID:BkewidrX
>>979
Dim i, m, k As Integer

Dim i As Variant, m As Variant, k As Integer
と同じ。
カンマ(,)で区切られた宣言は別々のもの。kだけがInteger

そしてお前は
「な、何だってーーーーーーーーーーーーーーーー!!!」
と叫ぶ。
0982デフォルトの名無しさん2016/11/17(木) 21:22:15.07ID:tywuRODY
>>979
k as integer, N as integer...て書かないとダメ
09839792016/11/17(木) 21:25:28.05ID:ymY9UHmK
>>981

「な、何だってーーーーーーーーーーーーーーーー!!!」(wwwwwwww

 しかし、変な仕様だね。オリジナルのVBもそうなの?
0984デフォルトの名無しさん2016/11/17(木) 21:58:42.86ID:Ys/NYtTF
.NETじゃないVBはそう
あまりにも勘違いしてるやつが多いから.NETでは変更された
0985デフォルトの名無しさん2016/11/17(木) 23:13:33.57ID:bKtKjNO6
勘違いしても問題なく動きそうだしな。
0986デフォルトの名無しさん2016/11/18(金) 00:45:04.30ID:U1YQXM59
「As Integer」がいくつも並ぶと無駄に行が長くなるし入力の手間もかかるから

Dim i%, m%, k%

と書くといいよ
%記号がIntegerの意味になってる
0987デフォルトの名無しさん2016/11/18(金) 00:51:57.72ID:vUpgzFVU
昔のBasicでそんなのあったな。
1!で1.0とか。
何でそんな無茶な省略(?)するのか分からんが。
0988デフォルトの名無しさん2016/11/18(金) 00:57:03.99ID:tuDs4bs9
As Intger ←9byte
% ←1byte
0989デフォルトの名無しさん2016/11/18(金) 01:55:24.71ID:2VD0UvCt
Integerってなんのためにあるの?
処理速度も上限もlongのほうが優れてるのに
0990デフォルトの名無しさん2016/11/18(金) 02:06:53.26ID:AbvFQZDc
>>988
変数名とAsをスペースで区切るから10バイト必要
0991デフォルトの名無しさん2016/11/18(金) 03:50:41.11ID:Wcv7uPyj
あれ、次スレは?
0992デフォルトの名無しさん2016/11/18(金) 07:25:21.94ID:rPv8IQdA
ほい
Excel VBA 質問スレ Part44 [無断転載禁止]©2ch.net
http://echo.2ch.net/test/read.cgi/tech/1479421482/
0993デフォルトの名無しさん2016/11/18(金) 08:56:22.56ID:UEe/F1lM
>>987
省略じゃなくて計算結果の型を指定するため
整数/整数の答えの型が整数となるため小数部分がなくなる
なので1!で小数のある型を混ぜる
0994デフォルトの名無しさん2016/11/18(金) 10:23:41.19ID:Be0cF+Zw
integerの方がコードミスとかエラー発見しやすい。
中級者以上なら、longでいいかもしれないが。
0995デフォルトの名無しさん2016/11/18(金) 12:30:47.79ID:2VD0UvCt
>>994
なぜ発見しやすいの?
0996デフォルトの名無しさん2016/11/18(金) 12:32:42.63ID:2VD0UvCt
あ、早めにオーバーフローしてくれるからとかか?
0997デフォルトの名無しさん2016/11/18(金) 16:14:17.83ID:EHaPpLVd
ですです。
0998デフォルトの名無しさん2016/11/18(金) 16:25:13.14ID:QgeexoD7
Integer の使用を薦めているようにも読めるので少し不適切だな
0999デフォルトの名無しさん2016/11/18(金) 22:17:33.62ID:juYsShrJ
適正な型指定は必要だけど
IntegerでもLongでもいいときは
俺はLongを使ってるな
1000デフォルトの名無しさん2016/11/18(金) 22:28:38.19ID:0glHI/U7
Integer 使ったから早めにオーバーフローしてくれてバグを発見できた!
・・・

そんなことってある?
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
life time: 62日 3時間 48分 27秒
10021002Over 1000Thread
2ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


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

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

▼ プレミアム会員登録はこちら ▼
http://premium.2ch.net/

▼ 浪人ログインはこちら ▼
https://login.2ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。