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

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

レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん2017/02/17(金) 23:42:25.33ID:AYehqi+e
ExcelのVBAに関する質問スレです
コード書き込みや作成依頼もOK

※前スレ
Excel VBA 質問スレ Part45
http://echo.2ch.net/test/read.cgi/tech/1483379476/

※注意
このスレで回答してるのは殆どがVariantを使えない初心者ですが
大目に見てあげてください
0002デフォルトの名無しさん2017/02/17(金) 23:58:26.48ID:2mT5ROZr
2ch初心者みたいだが、一度やってみたかった。

2GETぉぉぉぉぉぉぉ!!!!
0003デフォルトの名無しさん2017/02/18(土) 00:06:46.04ID:XJ34BKHl
Long型を格好良く出来ないだろうか?

    __          __ \\
   /  /   ̄  / /  /
 /  /  __/   _/
  ̄ ̄
みたいな感じで。
0004デフォルトの名無しさん2017/02/18(土) 08:46:22.71ID:uqTw3F8T
コレクション最強伝説はじまる
0005デフォルトの名無しさん2017/02/18(土) 09:04:33.80ID:fWF8oK3d
そうなのか...
コレクション用の便利アルゴリズム集を実装せねば!
0006デフォルトの名無しさん2017/02/18(土) 10:01:17.91ID:uqTw3F8T
ばかやろ
ディクショナリだろ
0007デフォルトの名無しさん2017/02/18(土) 14:31:06.52ID:sNsK+hAD
いや、あのね、普通に多次元配列もCollectionもDictionaryもクラスも全部使うぞ。
その上できちんと型指定もする。
オブジェクト指向的な使い方もするし。
0008デフォルトの名無しさん2017/02/18(土) 15:12:05.05ID:R2U23ibp
>>7
用途によりけりやね
ArrayListなんかもなかなか使いやすいし
0009デフォルトの名無しさん2017/02/18(土) 15:14:21.93ID:d8X+Upmx
>>1

※関連スレ
VBAなんでも質問スレ Part2
http://echo.2ch.net/test/read.cgi/tech/1432173164/
Access VBA 質問スレ Part1
http://echo.2ch.net/test/read.cgi/tech/1328536426/
Excel総合相談所 125
http://echo.2ch.net/test/read.cgi/bsoft/1481369538/
0010デフォルトの名無しさん2017/02/18(土) 20:02:52.44ID:etUVWXQH
どんなに理想を唱えても、実際に作る段階だと例外がちょくちょく発生するからな。
0011デフォルトの名無しさん2017/02/18(土) 22:57:26.18ID:G2ckVYLI
無能どもすっかりおとなしくなったな
0012デフォルトの名無しさん2017/02/18(土) 23:02:06.81ID:uqTw3F8T
まったくだ
0013デフォルトの名無しさん2017/02/18(土) 23:37:56.86ID:R2U23ibp
variantおじさんまだいるの?
0014デフォルトの名無しさん2017/02/19(日) 00:10:11.38ID:nLURoMmz
結論だけ教えて
0015デフォルトの名無しさん2017/02/19(日) 00:10:51.40ID:io38xkSf
>>13
無能なvariantおじさんどもがおとなしくなったから平和なんだよ
0016デフォルトの名無しさん2017/02/19(日) 00:10:52.57ID:+0PX9x4E
過程を飛ばすやつにろくなのはいない
0017デフォルトの名無しさん2017/02/19(日) 00:23:29.37ID:nLURoMmz
タイムリーに最近いいねされた投稿に上がってる
http://qiita.com/tomochan154/items/9dd43fa04a8073f7c6f3

「今どき配列使ってる男の人って・・・」
0018デフォルトの名無しさん2017/02/19(日) 01:37:04.40ID:fGPiSekn
>>17
はどう結論づけたの?
0019デフォルトの名無しさん2017/02/19(日) 01:39:39.55ID:99UtXzmV
VSTOって使わないの?
Macでは使えないけどWindowsならVBAよりC#とか使ったほうが生産性も保守性も高いと思うんだが
0020デフォルトの名無しさん2017/02/19(日) 03:13:08.97ID:MnxFh2MZ
>>19
C#で表計算機能を実装すると生産性が低くなると思うけどな
0021デフォルトの名無しさん2017/02/19(日) 03:33:54.26ID:vZUhP3Rm
>>17
配列の初期化チェックについてはsgnで分かるでしょ。
それかOn Error Resume NextでErr.Number調べるか。

言いたいことは分かるけど記事に書かれてる程度だったら配列の方が良いんじゃね?
コレクションクラスにするならもうちょっと機能が追加されてるとかさ。
例なんだろうけど。
0022デフォルトの名無しさん2017/02/19(日) 04:07:53.06ID:99UtXzmV
>>20
表計算機能はExcelが持ってるのになんでまた実装する必要があるんだよ
VBAで表計算機能を実装してるわけじゃないだろ?
0023デフォルトの名無しさん2017/02/19(日) 07:48:14.83ID:nLURoMmz
>>21
未初期化配列に Sgn 使うと内部エラーになった。
Not Not の方法は使えた。

なにか変わったのかな?
0024デフォルトの名無しさん2017/02/19(日) 08:33:29.86ID:ngALvOwB
>>19
ブックに含めて配布できればな〜
おばちゃんにアドインの追加なんて無理
0025デフォルトの名無しさん2017/02/19(日) 08:45:27.62ID:S05u5zif
>>24
おばちゃんじゃなくても無理w
0026デフォルトの名無しさん2017/02/19(日) 09:05:13.23ID:TZ/mXSM2
ブックに詰めて配布とか最悪だからやめろ
社内資産のコード重複が爆発的に増えていく
0027デフォルトの名無しさん2017/02/19(日) 09:32:56.19ID:7UYT3oOX
本当はjavascriptアドインをサーバーから配布してもらうのが一番楽なんだけどな
0028デフォルトの名無しさん2017/02/19(日) 09:37:31.82ID:XGSYoBCD
>>24
アドインの追加を自動的にするツール作れば良いじゃん
0029デフォルトの名無しさん2017/02/19(日) 10:09:48.15ID:eSq0skhb
爆発的てw
一発マクロ一兆個とか持ってんのかなこの人w
0030デフォルトの名無しさん2017/02/19(日) 11:59:22.39ID:MnxFh2MZ
>>19
C#でどうやってVBAと同様の事を実現するの?
シート構造に依存してるとコードとバラバラになったりする

C#のVBAに対するメリットとして保守性とか生産性を上げてるけど
保守性とか生産性の指標は何でどの程度違うの?
0031デフォルトの名無しさん2017/02/19(日) 12:26:16.97ID:VpaxOYNN
>>30
そりゃ時間よ
マイクロおーだーっす
0032デフォルトの名無しさん2017/02/19(日) 12:58:09.38ID:QFvkxUvl
時間て
0033デフォルトの名無しさん2017/02/19(日) 14:04:49.83ID:vZUhP3Rm
Excel関連ならVBAの方が良い。
VBAでできないことをする場合はC#とかVB.net使う。
0034デフォルトの名無しさん2017/02/19(日) 14:14:07.73ID:t4P0HCuO
他の言語が使える環境で、あえてOffice製品を介する必要のある仕事なんてそんなにあるのだろうか・・・。
0035デフォルトの名無しさん2017/02/19(日) 14:15:01.46ID:NrkH7giX
質問です。
Excel2016のウィンドウをVBAでモーダルフォーム上のボタンを押したときにマルチディスプレイ環境でエクセルの画面の大きさを変える動きを再現したいと思っています。

色々検索して、存在するデスクトップの情報を列挙するには
EnumDisplayMonitors()
GetMonitorInfo()
MONITORINFO構造体
現在エクセルウィンドウの存在するデスクトップは
MonitorFromRect()
辺りを使えばできそうなことは分かったのですが、自分でAPIを定義したことがないのでDeclare文が書けません。
VBで定義したサンプルを纏めたページとか無いのでしょうか。
0036デフォルトの名無しさん2017/02/19(日) 14:23:26.29ID:vZUhP3Rm
>>35
そのAPIは使ったことないし、調べていないけど、Declare書けなくて、他人の書いたのを拝借したいなら"Declare"と一緒にそれぞれの関数ググってみたら?
0037デフォルトの名無しさん2017/02/19(日) 14:44:41.05ID:2tImzZ1x
>>30
コード品質をメトリクスとして計測するツールは他の言語環境だとあるけどVBAってそもそもそういうのあんの?
VBA環境は言語そのものも大概だけどそういったエコシステムが貧弱すぎて比べてどうなのってレベルにすら達していないと思う
0038デフォルトの名無しさん2017/02/19(日) 14:46:23.41ID:mIodhKJ0
配列が駄目なら、セルの値をまとめて取りたいときにはどうすりゃいいんだ?
0039デフォルトの名無しさん2017/02/19(日) 14:49:08.78ID:aYQEkC2u
>>38
そこは2次元配列でいいんだよ
問題はその2次元配列をビジネスロジックでも使い続けてしまうバカが多い事
0040デフォルトの名無しさん2017/02/19(日) 15:13:41.86ID:QFvkxUvl
>>39
DBテーブルやCSVデータの展開は?
もしかして2次元配列じゃなくて1次元配列の配列を使う?
0041デフォルトの名無しさん2017/02/19(日) 15:15:37.38ID:XGSYoBCD
配列で受け取った上で扱いやすい形にして処理するってことだろう
つかまあ、配列は配列で利点がないわけでもないとは思うよ
いろんな形のリストをしっかり状況によって使い分けることが大事なんじゃないの
0042デフォルトの名無しさん2017/02/19(日) 15:24:58.45ID:MnxFh2MZ
>>37
行数とかなら自分で作ればいい
エクスポートしてテキストエディタで見ても分かるし

他になんの指標が必要?
修正率とかならリポジトリとかでリビジョン管理して差分の数をカウントすれば良くね?

diffコマンドでもいいんじゃね
0043デフォルトの名無しさん2017/02/19(日) 15:26:11.43ID:aYQEkC2u
>>40
同じだよ
むしろそこでなぜ配列の配列とか2次元配列へ向かってしまうのか
多次元配列脳って面白いね
0044デフォルトの名無しさん2017/02/19(日) 15:33:15.72ID:MnxFh2MZ
>>43
具体的にはどうしてる?
構造体の配列とか?
レコードセットオブジェクトとか?
0045デフォルトの名無しさん2017/02/19(日) 15:39:46.74ID:aYQEkC2u
>>44
オブジェクトにマップ
0046デフォルトの名無しさん2017/02/19(日) 15:47:49.05ID:MnxFh2MZ
>>45
VBAでO/Rマッピング(のこと?)ってどうやるの
列数が50とかあったりする場合は?
50とか変数持つクラス作ってそれを配列なりコレクションに入れるってこと?
0047デフォルトの名無しさん2017/02/19(日) 16:11:14.76ID:QFvkxUvl
何かの業務で同じ構造を固定的に使い続ける話だとしたらそれでいいけど、そんな話じゃないわな。
0048デフォルトの名無しさん2017/02/19(日) 16:12:56.97ID:NrkH7giX
>>36
はっ・・言われてみれば・・・・。
調べてみたら出てきました。ありがとうございます。
0049デフォルトの名無しさん2017/02/19(日) 16:18:26.23ID:aYQEkC2u
>>46
他の言語と同じだよ
マッパーを手で書いたりコード生成したり
その前に何十も列持ってる事に疑問を持ってデータ構造見直したりだな
逆に2次元配列文化の人ってこういうデカイテーブルをどう扱ってるんだ?
1列目には商品コード
2列目には商品名
3列目には価格

みたいなドキュメントベースのルールがあって
間違えないように注意して地道に2次元配列にアクセスすんの?
何十箇所でアクセスしてたらどうすんの?
仕様変更する時めんどくさくね?

>>47
変化が激しい業務こそオブジェクト指向だよ
2次元配列を頻繁に使うシステムで仕様変更とかどう考えても地獄だろ
0050デフォルトの名無しさん2017/02/19(日) 16:18:53.63ID:99UtXzmV
ブックに含めて配布したいなら
アドインじゃなくてドキュメントレベルにすればいいんじゃ?

アドインでもClick Onceのインストールくらい
おばちゃんでもできるよ
0051デフォルトの名無しさん2017/02/19(日) 16:22:11.74ID:99UtXzmV
>>30
C#に反応しすぎ VBでも出来るから
どうやって実現するかは自分で調べて

バージョン管理のしやすさ、部品の再利用性、テストコードの書きやすさ、
リファクタリングのしやすさ、もろもろ違う
VBAだとコードを管理するのに独自の工夫をいくつも積み重ねる必要がある
0052デフォルトの名無しさん2017/02/19(日) 16:29:46.20ID:vZUhP3Rm
できるけど配列使うことも多いな。
どっちにするかはその時の状況による。

何でも配列を否定は良くない。
大抵、大したことない時は配列かな。
でも多次元配列使う時もあるね。

その時格好いい方を使うな。
0053デフォルトの名無しさん2017/02/19(日) 16:39:21.27ID:XGSYoBCD
列数がクソほどある場合でもそのデータ全部使う訳じゃないことの方が多いと思うんだわ
まあ、取り回ししやすい方を選ぶだけだけど
0054デフォルトの名無しさん2017/02/19(日) 16:40:35.84ID:MnxFh2MZ
>>49
SQL使う
0055デフォルトの名無しさん2017/02/19(日) 16:50:04.52ID:aYQEkC2u
>>53
同時に使わない属性が大量にあるならまずその構造が正しいのか疑問を持つよね
0056デフォルトの名無しさん2017/02/19(日) 16:51:27.10ID:MnxFh2MZ
>>49
商品コード=1とかやっとけばいいんじゃね?

商品コード=find().column
とかでも良いし
0057デフォルトの名無しさん2017/02/19(日) 16:55:40.18ID:MnxFh2MZ
>>55
正規化したらjoin操作とか必要な場合どうするの?

正規化を知らない上司が一つにまとめないと理解できないことが問題だが
0058デフォルトの名無しさん2017/02/19(日) 17:10:16.65ID:JyXmk48j
p = "P001,ペン,100"
a = "P002,アップル,200"
カンマで区切って1個めは商品コード、2個めは商品名、3個めは価格
こういうコードを冗談抜きで書いてしまう人が世の中には少なからず居る
データを配列にして何番めには何が入ってるなんてやる人はそれと大差がないって自覚してほしい
0059デフォルトの名無しさん2017/02/19(日) 17:25:46.68ID:QFvkxUvl
>>49
さすがにエクセルVBAを業務システムとして使う訳じゃないでしょ?
手元のデータ分析とかその都度アドホックな使い方するわけじゃん。
「仕様変更」ってのは今呼び出したSELECT文が5列あったとして、その場でもう一列追加して6列見てみようとか、
そういう使い方するんだよ。
0060デフォルトの名無しさん2017/02/19(日) 17:33:38.18ID:JyXmk48j
>>59
そういう使い方でも同じだよ
オブジェクト化しておけば追加した列をじゃあどう扱おうかというところを簡単に柔軟に安全にコードに反映させることができる
これが配列だったらどう扱おうかを決めてからコードを書き換えるまでの労力は大きい
0061デフォルトの名無しさん2017/02/19(日) 17:39:29.01ID:QFvkxUvl
>>49
CSVにしたってそうさ。
ドキュメントベースのルールがあってデータ構造決まったものに対するシステム?
VBAでやるとしたらプロトタイプ作りとかPOCだよ。
0062デフォルトの名無しさん2017/02/19(日) 18:03:57.10ID:QFvkxUvl
>>60
面倒くさいよ。
アドホックなレコード構造を扱うたびにわざわざクラスモジュールを追加するのかよ?
個別の作業なんて一切モジュールシートにコードを追加せずにやるのが理想さ。
0063デフォルトの名無しさん2017/02/19(日) 18:34:30.66ID:QFvkxUvl
>>60
SQLからのクエリ結果をオブジェクトにマップするとき、どっからか転記するわけでしょ?
2次元配列にまずバッファリングしておくんじゃないの。
だったら2次元配列にテーブルを読み込むライブラリは必要になると思うけど?
0064デフォルトの名無しさん2017/02/19(日) 18:42:27.47ID:JyXmk48j
>>62
マッピングがめんどくさいということは
マッピングしないでコードを書くとよりめんどくさいということだよ
属性が増えた時にコードを追加せずにできる処理なんてたかが知れてる

>>63
SQLからのマップで2次元配列の出番はないだろ
VBAだとDAOかADOだろレコードからオブジェクトに直接マップすればいい
0065デフォルトの名無しさん2017/02/19(日) 18:48:38.74ID:MnxFh2MZ
>>60
オブジェクトにマッピングする時に元データの構造に依存するんじゃないの?
0066デフォルトの名無しさん2017/02/19(日) 18:52:47.97ID:JyXmk48j
>>65
依存する
しかしオブジェクトにした後はエクセルシートやDBテーブルやCSVファイルの構造に依存しなくなる
データとインとアウトのところだけ面倒を見れば後は全て扱いやすいオブジェクト指向の世界でコードを書ける
0067デフォルトの名無しさん2017/02/19(日) 18:56:58.46ID:QFvkxUvl
>>64
それ新しいクラスを作るごとにレコードセットのMoveNextやら.Fields()やらのアルゴリズムを毎回実装するはめにならないか?
0068デフォルトの名無しさん2017/02/19(日) 18:59:59.71ID:QFvkxUvl
>>66
オブジェクト指向を否定は誰も否定していなくて、配列とはまるで直交した概念だと言ってるんだが。
そして配列に対する汎用アルゴリズムは、要素がオブジェクトの場合も変わらず必要になる。
0069デフォルトの名無しさん2017/02/19(日) 19:33:54.44ID:JyXmk48j
>>67
コード生成すればいいじゃん
0070デフォルトの名無しさん2017/02/19(日) 19:38:47.00ID:JyXmk48j
>>68
付いてこれてないぞ

オブジェクトの配列の是非の話なんて誰もしてない
オブジェクトにすべきところを露出した配列という物理的なデータ構造で扱っているというところを問題にしてるんだよ今は
0071デフォルトの名無しさん2017/02/19(日) 19:44:00.15ID:E9SW8wQ3
>>70
配列では難しくてオブジェクトに入れると簡単に出来る事の具体例はなに?
配列とかsheetで困る事が思い浮かばないんだけど
0072デフォルトの名無しさん2017/02/19(日) 19:44:18.37ID:fGPiSekn
vbaでクエリ扱ってないやつが
なにかたってるの
>>64
>>67
0073デフォルトの名無しさん2017/02/19(日) 19:44:39.24ID:QFvkxUvl
>>70
違う
あんたは配列要らない派なんだろ

それに対してオブジェクト要らない派はここにいない
0074デフォルトの名無しさん2017/02/19(日) 19:45:11.31ID:QFvkxUvl
>>72
0075デフォルトの名無しさん2017/02/19(日) 19:48:25.53ID:E9SW8wQ3
レコードセットからsheetにクエリの結果をペースト出来るからmovenextとか使わなくても済むかもね
0076デフォルトの名無しさん2017/02/19(日) 19:52:55.44ID:JyXmk48j
>>71
なんでもできるよ
まあなんでもできるのは配列でもそうだがそれいっちゃ機械語でなんでもできるよと言ってるようなものだな
オブジェクト指向で書けば何をやってもシートや配列に依存したコードより美しく柔軟でメンテナンスしやすいコードができる
配列やシートというインフラストラクチャに依存しないということは規模が大きくなってきたときにデータをAccessに移行しようとかオフィスをやめて本格的なシステムにしようとなった時に簡単に移植できる
まあ事務員のおばちゃん程度の仕事内容なら脳トレ気分で配列いじるのも悪くないかな
0077デフォルトの名無しさん2017/02/19(日) 19:52:59.48ID:fGPiSekn
>>74
気にせずどうぞ
0078デフォルトの名無しさん2017/02/19(日) 19:53:17.05ID:JyXmk48j
>>73
とりあえず前スレからじっくり読み直してこい
0079デフォルトの名無しさん2017/02/19(日) 20:29:33.71ID:QFvkxUvl
>>78
あんたこそ前スレの>>995に答えてないじゃないか。だからまだ続くんだよ。

ユーザーは自分のクラスを作っていくらでも便利に使えばいいさ。
でもライブラリは特定の業務に依存しないから、入出力の型は汎用的なものでなければならない。
ライブラリ側からユーザーに「引数はこのクラス使ってね。出力はこのクラスね。」なんてできない。
そして 同じアルゴリズムを重複して実装するのは絶対に我慢ならないから、Variantとか配列を多用せざるを得ない。
ユーザーがオブジェクト指向のメリットを享受するのに邪魔になる点がないんだからあんたの反論は始めから的はずれ。
0080デフォルトの名無しさん2017/02/19(日) 20:37:13.77ID:ngALvOwB
>>50
> ブックに含めて配布したいなら
> アドインじゃなくてドキュメントレベルにすればいいんじゃ?
はあ?
それになんの意味が...

> アドインでもClick Onceのインストールくらい
> おばちゃんでもできるよ
おばちゃんなめんなよ w
0081デフォルトの名無しさん2017/02/19(日) 20:42:45.80ID:JyXmk48j
>>79
何にでも使える汎用的な処理なんていう幻想はプログラミング一年生で卒業しような
そんなものは目的がボンヤリしすぎててユーザーが使い方を理解できない
目的が明確で責務の少ないクラスを豊富に用意する
それがライブラリ製造担当の仕事だ
0082デフォルトの名無しさん2017/02/19(日) 20:42:51.21ID:t4P0HCuO
>>76
結局は多次元配列である必要の無い処理は、
多次元配列以外の適切な方法があるっていう至極当たり前の話なんだな。
0083デフォルトの名無しさん2017/02/19(日) 20:47:29.11ID:JyXmk48j
>>82
そう
それだけの話
ついでに加えるとすれば多次元配列である必要がある処理なんて殆どない
オブジェクトのコレクション(1次元配列を含む)で事足りる
0084デフォルトの名無しさん2017/02/19(日) 20:47:50.59ID:fGPiSekn
>>82
適切さってなに?
0085デフォルトの名無しさん2017/02/19(日) 20:50:46.37ID:MnxFh2MZ
>>82
オブジェクト志向が考えられる前もアルゴリズムを実現はできてたんじゃね

単に好みの問題なきがするな

SQL使えばアクセスへの移行なんてすぐに出来るし
MySQLとかのRDBMS使うシステムへも簡単に移行出来る

レコードセットをそのまま使うか配列にいれるかオブジェクトにいれるかくらいの違いでしかない
0086デフォルトの名無しさん2017/02/19(日) 20:55:17.51ID:QFvkxUvl
>>81
はあ?
配列の連結や比較可能なオブジェクトのサーチやソートは要素が何であっても汎用的なものだし同一アルゴリズムになる。
それは二度実装しちゃダメなんだよ。
そのためにGenericをサポートした言語があるんじゃないか。
なにも知らないんだな。
0087デフォルトの名無しさん2017/02/19(日) 20:55:35.92ID:t4P0HCuO
>>83
社員がそれなりに居る会社だとスケジュール管理で魔方陣みたいな計算しなきゃならない事が多いから、
事務方からするとマクロで組む大多数のロジックに二次元配列が必要になるんで「ほとんど要らない」は感覚的に合わないんだよね。

そういう経験上の齟齬で変に話がこじれてるんだと思うなぁ。
0088デフォルトの名無しさん2017/02/19(日) 20:56:35.39ID:JyXmk48j
>>85
配列やレコードセットをそのまま使うとクラスに凝集すべき処理がシステムのあちこちに分散してそれが成長すると保守不能になる
業界にはそういうシステムが無数に存在する
ビジネスロジックをクラスとして分離するよりDAOそのままその方が早く安く上がるという流れが昔あってそのツケを今支払っている
配列もDAOそのままと大差ないかどちらかというとより悪い
0089デフォルトの名無しさん2017/02/19(日) 20:58:47.19ID:XGSYoBCD
>>87
これはVariantおじさんにもいえることで、VBAでライブラリ配布して云々ってあんまり一般的じゃない使い方だと思うんだよね
これはまあ、俺の経験不足による認識の甘さなのかもしれないけど実際どうなんだろう
0090デフォルトの名無しさん2017/02/19(日) 21:03:34.34ID:JyXmk48j
>>86
それは何にでも使えるものじゃないだろ
リストならリスト
ディクショナリならディクショナリ
そうやってクラスを分けていくんだよ
0091デフォルトの名無しさん2017/02/19(日) 21:04:06.74ID:fGPiSekn
>>89
一般的普通常識的は
なにも答えをあたえないよ気をつけて
0092デフォルトの名無しさん2017/02/19(日) 21:09:43.13ID:JyXmk48j
>>87
それはデータ構造やアルゴリズムが悪いだけだろうね
0093デフォルトの名無しさん2017/02/19(日) 21:11:18.54ID:XGSYoBCD
>>91
どういうこと?
俺としては、ここにいるVBAerたちにそういう使い方もよくするものならそうであるとただしてもらえるかな、と
自分の知らない世界を知れるのは楽しいこと
0094デフォルトの名無しさん2017/02/19(日) 21:23:09.89ID:fGPiSekn
観点を合わせて喋れんのな
0095デフォルトの名無しさん2017/02/19(日) 21:37:02.73ID:QFvkxUvl
>>90
「要素が」何であっても
って書いてあるだろ?
0096デフォルトの名無しさん2017/02/19(日) 21:39:05.86ID:QFvkxUvl
>>90
要素側とコンテナ側を混同してんじゃねーよ
0097デフォルトの名無しさん2017/02/19(日) 21:45:38.72ID:QFvkxUvl
要素側は基本型だったりユーザー定義のクラスだったりいろいろある。
コンテナ側もいろいろあるけどVBAでは限られている。
アルゴリズムはコンテナごとに違うけど要素には依存しないようにしたい。

ここまでが基本的な背景な。
これが共有できないんじゃ話にならん。
>>81みたいなのは話にならないってこった。
0098デフォルトの名無しさん2017/02/19(日) 22:03:40.26ID:t4P0HCuO
結局、何の話がしたいんだか見ていてよく分からん。

「こんな書き方をすれば、どんな状況にも応用が利く!」みたいな
便利でスマートな手法があるならQiita辺りにまとめておいて欲しい。
0099デフォルトの名無しさん2017/02/19(日) 22:05:22.67ID:JyXmk48j
>>97
そもそも発端は>>79
これがジェネリックコレクションに限定したレスには読めないよ
0100デフォルトの名無しさん2017/02/19(日) 22:07:15.38ID:JyXmk48j
>>98
そんなものはないからオブジェクト指向を使えってこと
0101デフォルトの名無しさん2017/02/19(日) 22:13:07.99ID:t4P0HCuO
>>100
オブジェクト指向ってのは何の事を言ってるんだ?
もしかして「クラスにまとめれば何でも応用が利く」みたいな頭の悪い話じゃないよね?
だとしたら「王道は無いから地道に作れ」という初歩的な話を誰にも伝わらないような言い方で発信し続けているわけ?
0102デフォルトの名無しさん2017/02/19(日) 22:18:28.89ID:JyXmk48j
>>101
オブジェクト指向ってのは隠蔽と抽象化の事だよ
多次元配列やシートなんていう物理的な構造やインフラストラクチャにべったり依存したコードは保守性もクソもない酷いコードになる
だからオブジェクト指向を使ってそういう部分をロジックから分離しろ
そういう常識的で当たり前の主張を繰り返してるだけ
0103デフォルトの名無しさん2017/02/19(日) 22:22:35.59ID:WiCL4BWV
で、VBAはそれが不完全で〜っていつものお話が始まると
0104デフォルトの名無しさん2017/02/19(日) 22:33:14.77ID:vZUhP3Rm
俺は型指定は必要と言ってたが配列も使うぞ。
オブジェクト指向的なコードも書くけどオブジェクト指向原理主義者は近くに来ないで欲しいね。

俺はその時の状況に併せて使う。
個別クラスをコレクションクラスで宣言するけどインターフェースまで実装するのはあえて止めとこうとかな。
0105デフォルトの名無しさん2017/02/19(日) 22:33:47.53ID:QFvkxUvl
>>100
あんたが正しい見解を持っていることはわかったよ。
あんたは要素側の話をしている。

VBAは(いくつかある)コンテナに対する満足なアルゴリズム系ライブラリを備えていない。
そのうち配列に関するライブラリを整備することには意義があるってこった。
0106デフォルトの名無しさん2017/02/19(日) 22:33:52.56ID:99UtXzmV
>>80
VBやC#で開発してもブックに含めて配布したきゃできるつーことだよ
やらない言い訳並べてるだけならもういいや
0107デフォルトの名無しさん2017/02/19(日) 22:34:33.21ID:NcV9GFqq
まだ不毛な議題を引きずってんの?
0108デフォルトの名無しさん2017/02/19(日) 22:38:44.61ID:vZUhP3Rm
>>106
ExcelだったらVBAの方が普通は良い。
それだけで完結出来るんだから。

C#使うメリットがあればC#使うし、C#じゃないと出来ないこともあるからその時はC#となるけど、そんなことはそうそう無いと思う。
0109デフォルトの名無しさん2017/02/19(日) 22:43:07.80ID:vZUhP3Rm
個人的はVBE弄る時はVBAだとどうしてもセキュリティ上の問題があってC#やVB.net使う場合があるのと、VBE上でToolWindow作るのはVBAでは出来ないからって時だな。
0110デフォルトの名無しさん2017/02/19(日) 22:45:22.07ID:7UYT3oOX
シート内で完結する話ならVBAで良いし
それを超えるんなら他の方法を使えば良い
そもそもexcelでやるべき事なのかは一旦考えて欲しいけど
0111デフォルトの名無しさん2017/02/19(日) 22:49:09.98ID:t4P0HCuO
>>102
考えてる事、言いたい事はようやく見えてきたけど、あまりにもふわふわ〜っとしてて非現実的だなぁ。
っていうかもう君の主張は「セルを積極的に使え」っていう話に行き着く。君の主張してる内容全て盛り込んでるよRangeオブジェクト。

まぁ、一度実際にプログラミングで仕事して理想論がクソの役にも立たない事を経験すれば考え方がもうちょっと柔らかくなるんじゃないかな。
0112デフォルトの名無しさん2017/02/19(日) 22:57:40.52ID:JyXmk48j
>>105
そうだね

>>111
行き着かねえよバカが
セルを積極的に隠蔽しろって話だろ真逆じゃねえか
何がRangeだよド素人が

世界中のプログラマ達が現実的な答えを積み重ねてきた結論がオブジェクト指向だろうが
ろくなコードも書かずに現実が見えてねえのは完全にお前の方だよ
0113デフォルトの名無しさん2017/02/19(日) 23:07:33.14ID:t4P0HCuO
>>112
Rangeオブジェクト自体が世界中のプログラマが現実的な答えを積み重ねた結果、
データの本来の姿を隠匿して提供するオブジェクト指向プログラミングの塊なんだけどな。

まぁなんかその辺のアルゴリズムだかロジックだかの本を読んでお勉強したんだろうけど、
ロジックを構成する為の感覚ってのは実際に仕事してないと身につかないから、
なんかヘンテコな理論にたどり着くんだろうなぁ。
0114デフォルトの名無しさん2017/02/19(日) 23:09:05.58ID:XGSYoBCD
variantおじさんはなんでいちいち煽るかねw
ここ大事なとこよ?
人間誰しも自分が普遍と思いたがるからそこを是するべきならそうすべき
0115デフォルトの名無しさん2017/02/19(日) 23:11:40.89ID:XGSYoBCD
Rangeオブジェクトはセルに値を出し入れするためには優秀なオブジェクトなんじゃない?
その値を受け取ってゴニョゴニョ加工するための出し入れのためにValueプロパティがある
0116デフォルトの名無しさん2017/02/19(日) 23:17:26.44ID:JyXmk48j
>>113
シートレンジセル…
どこからどう見てもスプレッドシートじゃねえか
ファイルなどといったより低レベルで物理的な実装は隠蔽できてるがスプレッドシートという構造からは逃れられてねえんだよ
そこをユーザー定義クラスで隠蔽して使えと言ってるんだいい加減理解しろ
0117デフォルトの名無しさん2017/02/19(日) 23:29:42.36ID:99UtXzmV
>>108
20~30行のモジュール2~3個くらいの短いコード書いてるだけならいいけど
それ以上の規模をまともに書いてるんなら意固地にVBAに執着せずにまずはちゃんと試したらいいと思うけどね
エラーハンドリング・コード補完・デバッグみたいのも全く違うよ

>>109
VBEはAlt+F11で起動するVBAのエディターのことだよ
0118デフォルトの名無しさん2017/02/19(日) 23:37:44.25ID:NcV9GFqq
お互い求めていないものを押し付けあっても押し返されるだけだよ
やりたいことを実現できてるならそれで良いじゃない
不毛な議題は終わろうよ

ある程度経験があるからこそ自分のやり方に誇りを持つことはあると思うけど実現方法は唯一無二ってわけではないよ
0119デフォルトの名無しさん2017/02/19(日) 23:41:17.00ID:XGSYoBCD
なんつーの?
セル↔コードじゃなくて、セル↔オブジェクトで値をやり取りしよう是っていうことではなくて?
0120デフォルトの名無しさん2017/02/19(日) 23:42:03.47ID:99UtXzmV
VSTO使わないの?に対する返答が試したこともないの丸出しだったからついついね
VBA量産してる人は会社にとって負債になってることが多々あるから気をつけてね
じゃ
0121デフォルトの名無しさん2017/02/19(日) 23:45:03.65ID:nLURoMmz
>>114
誰?
0122デフォルトの名無しさん2017/02/19(日) 23:57:08.00ID:t4P0HCuO
>>116
セルにそれぞれ名前付けて管理出来るから、工夫次第でいくらでもスプレッドシートから離れられるよ。
エクセルが表計算ソフトで、GUIがあれだから、スプレッドシートという概念に囚われてしまって、
そういう見た目に囚われない利用法ってのは発想しづらいかもね。

まぁ出来るというだけであって、俺はやらないが。
0123デフォルトの名無しさん2017/02/20(月) 00:09:03.46ID:ApsJgVoj
>>117
何言ってんの?
VBEがVisualBasicEditorの略だなんて常識だろ。
ソースコード弄り廻すプログラムの話してるのに。
ウィルスと同じことすることになるからセキュリティの問題に成るんだろ。

ウィルスってのはこちらの環境をターゲットに作られるわけじゃない。
だから自分の作ったコードとの区別をチェックすればくぐり抜けられるとは思えないんだ。
しかしAuto_Openの直後にウィルス実行するコード埋め込められるとチェックする前に実行されちまうから回避出来ない。
その点、セキュリティセンターでVBE弄るマクロ禁止して、コードエディタ弄るのはC#とかVB.netで作れば回避できるっつう話
0124デフォルトの名無しさん2017/02/20(月) 00:12:18.88ID:ApsJgVoj
>>120
VBEの話について来れずに勝手に勘違いしたあげく使ったこともないとこれまた勝手に勘違い。

君のレベルが透けて見えるな。
0125デフォルトの名無しさん2017/02/20(月) 00:47:30.26ID:ZD0+Rhad
>>88
クラスじゃなくてもモジュールに集めれば良いだけ
0126デフォルトの名無しさん2017/02/20(月) 01:06:49.31ID:ZD0+Rhad
>>123
署名すれば良くね
0127デフォルトの名無しさん2017/02/20(月) 01:31:51.92ID:E/pOlJmJ
>>123
メタプログラミングの話をしてたのね 理解できなくてごめんよ
ウィルスじゃなくてウイルスな
0128デフォルトの名無しさん2017/02/20(月) 01:42:21.73ID:lb9gJlVL
シートの中身をそのままDAOやADOでマッピングって、まともにできなかったような記憶があるけどどうなの。
データ型を意図と違う型に勝手に変換されたり、表現できないデータにはNULLしか取れなかったり。
その辺の検証が面倒なのとデータそのものが消えるのは危険て判断で結局使い物にならなかった。
新規に作るなら1個1個検証してけばいいけど既存のデータの移行には怖くて使えないと思う。
0129デフォルトの名無しさん2017/02/20(月) 04:58:32.86ID:NZ2LT6oB
>>106
そんな機能がサポートされたんだ
やり方書いた URL 教えて
0130デフォルトの名無しさん2017/02/20(月) 13:43:12.65ID:k0LX482/
C#はmarshallingのコストが高すぎなのと、オブジェクトの解放漏れが出やすいので、VBAと同じ感覚で使うと痛い目見る。
C#からExcelを操作する必要があるなら、VBAでメソッド書いてC#では基本runくらいに押さえた方がいい。
0131デフォルトの名無しさん2017/02/20(月) 13:52:00.83ID:k0LX482/
C#はmarshallingのコストが高すぎなのと、オブジェクトの解放漏れが出やすいので、VBAと同じ感覚で使うと痛い目見る。
C#からExcelを操作する必要があるなら、VBAでメソッド書いてC#では基本runくらいに押さえた方がいい。
0132デフォルトの名無しさん2017/02/20(月) 13:52:30.07ID:RpMws/Ns
マーシャリングって何だっけ?
幾度となく目にしたことがあるがさっぱり理解していない。
0133デフォルトの名無しさん2017/02/20(月) 13:53:21.70ID:k0LX482/
コピペミス、すまん。

VBEの話題だと、ユニットテストをやるときはVBEオブジェクト経由にするのが楽だと
思うが、それ以外の方法でやってる人はどうやってる?
0134デフォルトの名無しさん2017/02/20(月) 19:38:35.48ID:7yJYF54k
>>130
Microsoft.Office.Interop.Excel のオブジェクトは Disposable にしてくれよ
Marshal.ReleaseComObject みたいな低レイヤーのメソッド呼ばせるとか頭おかしい
0135デフォルトの名無しさん2017/02/20(月) 23:40:03.22ID:E/pOlJmJ
>>129
https://msdn.microsoft.com/en-us/library/f27xe9xb.aspx (英語)
https://msdn.microsoft.com/ja-jp/library/f27xe9xb.aspx (日本語)
0136デフォルトの名無しさん2017/02/20(月) 23:56:54.13ID:NZ2LT6oB
>>135
配布については書いてないようだが?
0137デフォルトの名無しさん2017/02/21(火) 00:06:15.76ID:aFqTV30T
>>136
よく読めよ〜もう〜
0138デフォルトの名無しさん2017/02/21(火) 04:56:40.98ID:pNCKJ7ep
>>137
で、どこにどう書いてあるの?
引用して下さい
0139デフォルトの名無しさん2017/02/21(火) 14:43:08.97ID:61uGwEv+
最近の流れ超うざいわ
・俺が知ってるアレを知らないお前馬鹿
・俺のやり方が最強、そうしないお前馬鹿
おなかいっぱい
0140デフォルトの名無しさん2017/02/21(火) 19:20:46.30ID:8I0Tfvzv
馬鹿同士の話は基本ウザいもの
0141デフォルトの名無しさん2017/02/21(火) 19:55:44.43ID:SZxBanng
ケースバイケースが受け入れられない阿呆に、かまう阿呆
0142デフォルトの名無しさん2017/02/21(火) 20:07:39.76ID:6AjaqXwj
>>141
同じあほなら踊りゃな損損
0143デフォルトの名無しさん2017/02/21(火) 21:10:07.61ID:aFqTV30T
>>139
おれVSTO使わないのって聞いた人間だけど別に自分のやり方が最強だとは思ってないよ
ただ学びもせず試しもせずに自分のやり方に固執してるやつはほんとバカだと思うし
組織の足を引っ張るマイナスの存在だと思う
0144デフォルトの名無しさん2017/02/21(火) 21:24:32.70ID:KepD5bS7
ホント>>118
0145デフォルトの名無しさん2017/02/21(火) 21:35:24.29ID:TXl7A71s
モジュールの引数に As Long とか As String とちゃんと型を明記してタイプセーフにするって話題、あまりよくわかってない。

As Long の引数に間違って文字列を渡すコードを書いたとする。
実行すると代入するタイミングで「実行時エラー '13' 型が一致しません」て出るけど、それがタイプセーフってことなの?
0146デフォルトの名無しさん2017/02/21(火) 22:21:14.41ID:6AjaqXwj
>>144
同意
0147デフォルトの名無しさん2017/02/21(火) 22:22:29.66ID:IOznZN+8
>>143
高々一つの手段に過ぎないんじゃね
エクセルを操作するのにpoershellでもperlでもphpでもjavaでも出来るけど全部試してみないとダメなの?
pythonとかでも出来るかもしれないし
言語は他にもあるわけだが
0148デフォルトの名無しさん2017/02/21(火) 22:33:46.27ID:aFqTV30T
はあ
>>118みたいな考え方がクソなんだよ
学ばないやつの典型
0149デフォルトの名無しさん2017/02/21(火) 22:34:45.03ID:/de5NySZ
エクセルからデータをテキストでエクスポートして処理したほうが簡単じゃないかな?
0150デフォルトの名無しさん2017/02/21(火) 22:39:15.14ID:KepD5bS7
>>148
学びもせず試しもせずに自分のやり方に固執してるやつは118のような考えにはならないと思うよ
0151デフォルトの名無しさん2017/02/21(火) 22:39:18.48ID:aFqTV30T
>>147
>高々一つの手段に過ぎないんじゃね
だから? 結局それも自分の今のやり方に固執して学ばない言い訳だろ?
それに言語の話をしてるわけじゃないんだが
0152デフォルトの名無しさん2017/02/21(火) 22:48:07.72ID:aFqTV30T
>>149
単なるデータ処理なら今はxmlになってるからエクスポートしなくても直接処理することもできる
そういうんじゃなくExcelをインタラクティブに操作する機能を拡張したいからVBAを使ってるんだと思うよ
0153デフォルトの名無しさん2017/02/21(火) 22:48:45.93ID:TXl7A71s
どれを選ぶかの問題に過ぎないような
0154デフォルトの名無しさん2017/02/21(火) 22:51:29.51ID:IOznZN+8
>>151
手段は沢山ある
それを全部試してみないと行けないの?
君は全部試したのか
なぜ自分以外は学んでないと決めつけてるのか知らないけど
0155デフォルトの名無しさん2017/02/21(火) 23:09:22.40ID:NsUhXqcm
>>145
そうだよ
入館証みたいなもん
0156デフォルトの名無しさん2017/02/21(火) 23:13:29.45ID:aFqTV30T
>>153
状況に応じて自分の道具箱から適切な道具を選ぶ判断ってのは
システム作ったりプログラミングする上ではすんげー大事なの
0157デフォルトの名無しさん2017/02/21(火) 23:17:46.66ID:aFqTV30T
>>154
新しい道具の使い方を学ぶには相応のコストがかかるから
それをやらずに今持ってる道具の使い方を磨くっていう選択ももちろんあるよ
そういう判断を意識的にしてるならいいんじゃない

少なくともこのスレのVSTOについてのレスでそういうのはなかったけどね
>>138のような教えて君のほうが可能性を感じる

君は全部試したのかなんて聞いてなんの意味あるのさ
0158デフォルトの名無しさん2017/02/21(火) 23:18:18.11ID:8I0Tfvzv
まぁそうでもないけどね
0159デフォルトの名無しさん2017/02/21(火) 23:18:35.43ID:IOznZN+8
>>156
どの程度大事だとか客観的なデータみたいなのはあるの?
自分の経験則?
他の人が使える事とか保守出来る事とかそういう面も大事だと思うけど
0160デフォルトの名無しさん2017/02/21(火) 23:20:58.45ID:/PEo8++7
VBAの保守は勘弁してくれ
0161デフォルトの名無しさん2017/02/21(火) 23:23:37.74ID:IOznZN+8
>>157
より適した方法を選択するには自分で試してないとわからないって事を君は言いたいんじゃないの?

VSTOよりVBAの方が適してるという判断だってあり得るだろう
その判断をVSTOを試さずにしている事が気にくわないんじゃね?
だったら君は全部の手段を試してその中から適切な選択をしてるんだろうなと思うわけだが
0162デフォルトの名無しさん2017/02/21(火) 23:23:59.32ID:TXl7A71s
>>155
じゃあテストカバレッジは大事ですね
0163デフォルトの名無しさん2017/02/21(火) 23:24:37.44ID:aFqTV30T
>>159
>他の人が使える事とか保守出来る事とかそういう面も大事だと思うけど
それが「状況応じて選ぶ」の「状況」だよ
保守出来なくてもいい場合だって結構あるんよ
0164デフォルトの名無しさん2017/02/21(火) 23:25:26.17ID:IOznZN+8
>>160
勘弁してほしいと言う気持ちはわかるけど
人事移動とかで仕方ない事もありうるし
0165デフォルトの名無しさん2017/02/21(火) 23:27:15.94ID:IOznZN+8
>>163
じゃ状況から考えて最初からVSTOは選択肢に入らない人だってありじゃね?
0166デフォルトの名無しさん2017/02/21(火) 23:29:13.95ID:NsUhXqcm
>>162
型指定した方が関数単体ではテストしやすいんでねえか?
0167デフォルトの名無しさん2017/02/21(火) 23:31:43.06ID:TXl7A71s
>>166
そうですね。
デバッグ→コンパイル したときにエラーになるのかと少し期待してました。
0168デフォルトの名無しさん2017/02/21(火) 23:32:00.62ID:pNCKJ7ep
>>143
>>138 に答えてからにしろよ...
0169デフォルトの名無しさん2017/02/21(火) 23:36:52.37ID:NsUhXqcm
>>167
他の言語あんまやらんのだけど、他ではコンパイルエラーになるんか?
0170デフォルトの名無しさん2017/02/21(火) 23:47:32.16ID:TXl7A71s
>>169
さっき試しにこれでコンパイルエラーも実行時エラーも(当然)起きないことを確認しました。
 If False Then
  Longを受け取るSub "abc"
 End If
True にするともちろん実行時エラーになるけど、コンパイルエラーにはならないですね。
両方ともコンパイルエラーには普通なると思っていたので。
0171デフォルトの名無しさん2017/02/22(水) 00:37:21.94ID:LNkI/xAf
今、思いつきました、私は。
GooooooogleやGREEEEEEEENの様に、
Loooooooooooooooong
0172デフォルトの名無しさん2017/02/22(水) 00:50:23.61ID:LNkI/xAf
IF ---- THEN
 -------
ELSE
 -------
END IF

現在、これが主流であるが、

IF ---- THEN
 -------
  ELSE
   -------
    END IF

こうしたら見やすくはならないだろうか。
0173デフォルトの名無しさん2017/02/22(水) 01:19:12.50ID:M4/9OkPn
ならないな
0174デフォルトの名無しさん2017/02/22(水) 05:34:42.22ID:JKZayb1O
ならない
0175デフォルトの名無しさん2017/02/22(水) 06:20:32.11ID:8qcLxLAJ
Pythonとか別言語も使える柔軟性をもたせて欲しいな
VBAは次期Officeでも改修無しだろうし
0176デフォルトの名無しさん2017/02/22(水) 07:29:32.41ID:+iWBq+NU
>>172
コーディングが上手くなるとelseブロックは驚くほど使わなくなるから気にしなくていいよ
0177デフォルトの名無しさん2017/02/22(水) 08:09:31.68ID:syi9s7VP
>>170
いや、VBAではそうなんだろうけど新し目の言語ではどうなんだろうなと
まあその式なら当然実行時にはならんよね
処理してないんだから
でも関数の外では止まるから中に入れちゃうよりはマシでしょ
0178デフォルトの名無しさん2017/02/22(水) 08:30:28.90ID:0wACQsqy
>>172
見やすくならない
でもとにかく可能性を提示していくのは好き
0179デフォルトの名無しさん2017/02/22(水) 08:33:33.34ID:WdsmAWXM
>>177
あのあといろいろ試してみたんだけど、

オブジェクトに対して、存在しないメソッドを呼び出してみると、「コンパイルエラー」。
つまり該当箇所にたどり着く前に止まるというか、全く進まない。

As Long 引数にStringを渡した場合は、その箇所にたどり着くまでは進む。

となりました。
どっちもインテリセンス的には分かってるんですけどね。(入力時にヒントが出てくる。)
0180デフォルトの名無しさん2017/02/22(水) 09:57:01.51ID:T1tKwjPz
>>175
COM使えばええんやで
0181デフォルトの名無しさん2017/02/22(水) 18:32:56.57ID:fluTtG1x
>>170
VBならOption Strict Onにすればコンパイルエラーになる
型を指定する言語ならコンパイルエラーになるほうが普通
https://ideone.com/ZN0oZy

VBAに同じオプションはないけどByRefにすればコンパイルエラーになる
ByValだと暗黙の型変換があるから実行時にならないとエラーかどうかわからない
0182デフォルトの名無しさん2017/02/22(水) 18:46:18.06ID:nFPUHBlJ
>>181
・ByRefでもコンパイルエラーとはならない
・そもそもByRef/ByValを省略したときはByRefなんだから、何も付けないときにコンパイルエラーにならないのなら、ByRefを付けてもコンパイルエラーにはならないのは道理
・ByValだとしてもコンパイルエラーとはならない
・暗黙の型変換はByRef/ByValで違いあんの?
・そもそもこの問題にByRef/ByValが関係あんの?
0183デフォルトの名無しさん2017/02/22(水) 19:10:47.91ID:fluTtG1x
>>182
一旦変数に入れてから関数に渡してね

>・暗黙の型変換はByRef/ByValで違いあんの?   →あるよ
>・そもそもこの問題にByRef/ByValが関係あんの? →暗黙の型変換の違い
0184デフォルトの名無しさん2017/02/22(水) 19:59:39.45ID:WdsmAWXM
>>182
ByRef As Double にLong変数を代入できないのは大抵の場合意図に反すると思う。
0185デフォルトの名無しさん2017/02/22(水) 20:01:03.86ID:WdsmAWXM
アンカー間違えた
0186デフォルトの名無しさん2017/02/22(水) 21:07:39.06ID:Wnnq/wUP
>>184
引数がDoubleであればそうである必要があるんだろうからそれでいいじゃん
ret = fnc(CDbl(lng))ってすりゃいいだけだし
実行時に型が違うって教えてくれるんだから
仮にvariantにしたら文字列もオブジェクトも入っちゃうし
タイプセーフって意味ならそういうことでしょ
0187デフォルトの名無しさん2017/02/22(水) 21:50:30.44ID:WdsmAWXM
>>186
Double で ByRef の必要があるってことは変更を呼び出し元に反映させる意図か
0188デフォルトの名無しさん2017/02/22(水) 22:22:41.27ID:+EuyfV64
>>183
ByRef a As Double という引数に

Dim x As Long
と宣言したx を渡すとコンパイルエラーになるけど、x+0 を渡すとコンパイルエラーにはならない。
もちろん 0 を渡ってもエラーにならないし、0& でもエラーにならない。

これってどうなの?あまり役に立たないじゃん?
0189デフォルトの名無しさん2017/02/22(水) 22:43:19.86ID:+EuyfV64
実際VBAでByRefに意味あるのってByRef Variantくらいじゃないか?
引数を変更する意図だったらあまり勧められるものじゃないし、Const 参照に出来ないものつらい。
0190デフォルトの名無しさん2017/02/22(水) 22:50:07.38ID:cnrdfYBn
>>189
オブジェクトをbyrefで渡すんじゃね
0191デフォルトの名無しさん2017/02/22(水) 22:50:52.98ID:fluTtG1x
>>188
コンパイルエラーにならない理由を説明したんであって
それを役に立たせるかどうかは君次第
0192デフォルトの名無しさん2017/02/22(水) 23:01:48.59ID:npRiHSqC
>>ByRefに意味あるのってByRef Variantくらいじゃないか?

例えばデータベースにアクセスする際にレコードが存在するかどうか
存在すれば関数の戻り値としてtrue、存在しなければfalseを返す
で存在すれば、Byref引数で与えた項目にレコードから値をセットする。
戻り値がtrueの時にのみそのByref引数で与えた項目を使うって言う事してる
けど?
別にそれがVariantであるとかどうとか関係ないし
0193デフォルトの名無しさん2017/02/22(水) 23:25:47.81ID:+EuyfV64
>>192
それっていわゆるout引数で返り値が成功/失敗ってパターンだよね。
0194デフォルトの名無しさん2017/02/22(水) 23:27:36.61ID:clkUvWrM
Byrefに意味があるの、Byvalでいーじゃんとか逆も昔に考えたりした事あるけど、色んな言語に触れたり、内部処理でプログラム変数が保存領域にどのように保存されるのかとか学んだりすると、
パソコンがいかに分かりやすく人間のクソコードをうまく処理してくれているか、理解した時に色々な書き方があってよかったと思えた。ようはちゃんとした使い分けなんだなと
0195デフォルトの名無しさん2017/02/22(水) 23:28:45.30ID:+EuyfV64
>>190
オブジェクトの場合は ByVal でも参照渡しだし効率上の問題はないし
変数を書き換えられない方がいいからByValが好み
0196デフォルトの名無しさん2017/02/22(水) 23:48:30.91ID:+EuyfV64
out変数はPrivate 関数ならいいけど、Public 関数ではちょっと避けたい。
あと効率の問題は無視できない。
特に深い意味はなく 基本はByValでVariantだけByRef

ほんと深い意味はないです
0197デフォルトの名無しさん2017/02/22(水) 23:49:35.88ID:yyIqMX9C
ByRefは配列厨だった時期に大きめの配列を渡すときに使ってた記憶がある
あとpropetyで値を受けるときにByRefじゃないとダメなのがあったような気がするわ
0198デフォルトの名無しさん2017/02/23(木) 00:11:35.30ID:TN/SG3Ii
いちいちディープコピー取られるの気持ち悪くないか?
メモリ的にも不利でしょ
0199デフォルトの名無しさん2017/02/23(木) 00:28:08.11ID:boStFqTs
ディープコピーじゃないよ
0200デフォルトの名無しさん2017/02/23(木) 06:17:34.80ID:H+4W8G4c
再帰処理でbyref使うかも
0201デフォルトの名無しさん2017/02/23(木) 08:16:36.07ID:OsbBjXDd
構造体ってbyvalだっけ?
0202デフォルトの名無しさん2017/02/23(木) 08:37:19.31ID:hO+UyGLC
>>201
Type のことだったらそもそもByValで渡せないんじゃ?
0203デフォルトの名無しさん2017/02/23(木) 08:41:19.30ID:OsbBjXDd
>>202
それそれ
構造体とかは参照渡ししかできなかったから仕方なくそうしてる

他で参照渡しする事はあまりないな
0204デフォルトの名無しさん2017/02/23(木) 10:33:29.58ID:5OVH7aZj
基本はbyrefもbyvalも書かない(なのでbyref)
必要なときだけbyval

つか、最近ここにいる奴らと話があわなさすぎてビビる
0205デフォルトの名無しさん2017/02/23(木) 10:57:43.31ID:hO+UyGLC
>>204
「必要なとき」ってのを具体的に示せば、実は話が合ってるのかもしれないよ
0206デフォルトの名無しさん2017/02/23(木) 11:00:08.85ID:5OVH7aZj
>>205
どうみてもあってないわけですが
> 特に深い意味はなく 基本はByValでVariantだけByRef
> ByRefは配列厨だった時期に大きめの配列を渡すときに使ってた記憶がある
> 再帰処理でbyref使うかも

あ、あと君がどうやってユニットテストしてるか教えてくれる?(プロかどうかの指標)
0207デフォルトの名無しさん2017/02/23(木) 11:41:44.16ID:hO+UyGLC
>>206
君は基本がByRefでByValが必要なのは例外的なケースだというスタイルなんだろ?
だからそれを示すのが話が早いと思うんだ。
それとユニットテストのやり方?
ユニットテストを書いて、ユニットテストを集めたモジュールに突っ込んで、必要なときにまとめて実行するだけだが。
0208デフォルトの名無しさん2017/02/23(木) 11:45:35.46ID:hO+UyGLC
例えば純粋な数学関数。Double→Doubleというやつ。
これは当然 ByVal x As Double だよね?
0209デフォルトの名無しさん2017/02/23(木) 11:45:52.32ID:5OVH7aZj
>>207
> だからそれを示すのが話が早いと思うんだ
declare以外で使った記憶ないね(あるかもしれないが)

> ユニットテストを書いて、ユニットテストを集めたモジュールに突っ込んで、必要なときにまとめて実行するだけだが。
それは大変ですね
プロだとしたら、お仕事頑張ってください
0210デフォルトの名無しさん2017/02/23(木) 11:47:24.05ID:hO+UyGLC
>>209
プロのわけないでしょ。何だよExcel VBAのプロって?
0211デフォルトの名無しさん2017/02/23(木) 11:53:22.98ID:5OVH7aZj
>>210
コードを書いて飯を食ってるプロのプログラマが、VBAで実装する案件とかあるでしょ

まじでこんなこと説明するの、疲れるわー
0212デフォルトの名無しさん2017/02/23(木) 11:55:16.28ID:hO+UyGLC
>>211
そういう人がここで議論するなよ

としか思えん
0213デフォルトの名無しさん2017/02/23(木) 11:57:21.44ID:hO+UyGLC
VBAのByRefとByValのことで話をしてたら「お前はプロか?」ですって。

もーやだーw
0214デフォルトの名無しさん2017/02/23(木) 12:00:06.36ID:hO+UyGLC
>>208に同意するんだったらそういう純粋関数を書くことがあまりないというだけで、一般化出来ることじゃないよなあ。
0215デフォルトの名無しさん2017/02/23(木) 12:00:51.58ID:5OVH7aZj
>>213
他のスレではもっとプロ比率高いからね
最近のあまりのひどさに、プロはいるんかいなと思ったまで

まあ、俺は前スレの奴みたいに押しつけなんぞはしなから
0216デフォルトの名無しさん2017/02/23(木) 12:04:03.42ID:gqahVnbf
>>215
お前はプロを見定める程には高位者なんだろ
なんでこんな所にいるんだよ
0217デフォルトの名無しさん2017/02/23(木) 12:08:15.24ID:GthJ2ZGJ
このスレこんなに荒れてたっけ?
0218デフォルトの名無しさん2017/02/23(木) 12:19:49.23ID:ahJQbyP7
前スレ後半から継続してる
 Variantこそ正義派 vs Variantはウンコ派
のくだらないシバき合いの空気だと思う

しばらくしたらおさまると思う
0219デフォルトの名無しさん2017/02/23(木) 12:21:15.10ID:hO+UyGLC
まあ意外といろいろなジャンルで使われているのかも知れないね。
ジャンルごとに常識が全然違っていて、外の世界のやり方が愚かに見えたり異常に見えたりするという。

「ユーザー」の意味が食い違ったまま議論してたりするのが一番不毛だと思う。
人によっては「将来の自分、もしくは同僚」のことを言ってたり、「システム納品先の顧客」のことを言ってたり。
0220デフォルトの名無しさん2017/02/23(木) 12:24:40.62ID:y8jS3dVi
自称プロ()があることないこと文句をつけて荒らしとるww
0221デフォルトの名無しさん2017/02/23(木) 12:26:54.10ID:exuatn0M
まだマウティングしきれてないからな
油断するなよ
0222デフォルトの名無しさん2017/02/23(木) 13:12:07.35ID:zwsWAD4F
別プロセスで開いたブックを変数に収める方法を教えてください。

↓現在はこのコードで別プロセスのブックを変数wb2に格納できていますがエラー回避のため回りくどいです。
Set wb2 = xlApp.Workbooks.Open "C:\開かれるファイル.xlsx" ←これだと構文エラーとなるためです。

Dim wb As Workbook, wb2 As Workbook
Dim xlApp As Application
Set xlApp = CreateObject("Excel.Application")
xlApp.Visible = True
xlApp.Workbooks.Open "C:\開かれるファイル.xlsx"

For Each wb In xlApp.Workbooks
Set wb2 = wb
Next


もっと直接的にWorkbook型の変数にブックを格納する方法を教えていただきたいのです。よろしくお願いします。
0223デフォルトの名無しさん2017/02/23(木) 13:33:18.05ID:hO+UyGLC
>>222
Workbooks.Countが0だとしても有効なんだからそのやり方でいいんじゃね?
0224デフォルトの名無しさん2017/02/23(木) 13:43:37.34ID:Q2T7iSLN
>>222
そりゃ、構文エラーになるの当然でしょ。

xlApp.Workbooks.Open "C:\開かれるファイル.xlsx"

が何かを返す形になっていない。

Set wb2 = xlApp.Workbooks.Open("C:\開かれるファイル.xlsx")

とする。
0225デフォルトの名無しさん2017/02/23(木) 13:48:54.96ID:VQq0xdbL
単にかっこのつけ忘れか
まれによくある
0226デフォルトの名無しさん2017/02/23(木) 14:02:22.28ID:Q2T7iSLN
でもマルチプロセスにする必要有るんかね?
正直、こんな所で躓いてる人だったらもっと前にすべきこと有るんじゃね?とも思う。

自分は速度アップの為に使うこともあるけど、シングルプロセスで遅くなる要因は全て取り除いた上でどうにも時間がかかる場合だ。
しかし経験上、実際にはマルチプロセスにしなければならない程の計算量になることは殆ど無い。
02272222017/02/23(木) 14:28:34.64ID:zwsWAD4F
もうレスがついてる。ありがとうございます。

あー、括弧の有無でしたか・・・そのへんのルールの理解はかなり曖昧です。
>>223>>224、ありがとうございました。

>>226、正直、別プロセスで開く必要が本当にあるのかはわかりません。
なんか別で開いたほうがよさそう。。。という理由で別プロセスで開いています。

ただ計算量は多いです。刻々と変化する、株価の現在値や取引高、売買注文の状況等の変化を記録し集計しグラフ化などを行っています。
今は毎日手作業で複数ブックを開いて、各ブックのマクロは正しく動いています(おそらく)が、起動を自動化しようとして今回の質問になったわけです。

別プロセスにする必要性が本当にあるかどうかはわかりませんが、別プロセスにすることのデメリットはあまり聞かないし、別プロセスでいいかなーって感じですがどうなんでしょう?
0228デフォルトの名無しさん2017/02/23(木) 14:43:44.88ID:Q2T7iSLN
>>227
デメリットはシングルプロセスのメリットを失うことです。

https://blogs.msdn.microsoft.com/office_client_development_support_blog/2017/01/13/merit-to-merge-process/

計算に使用するRangeをVariantで受けて配列で計算する程度の高速化は済んでいるんですか?
0229デフォルトの名無しさん2017/02/23(木) 14:56:32.87ID:hO+UyGLC
別プロセスでデータ連携がかったるくならないの?
0230デフォルトの名無しさん2017/02/23(木) 15:01:00.61ID:hO+UyGLC
RSSとかか
0231デフォルトの名無しさん2017/02/23(木) 15:01:07.48ID:zwsWAD4F
>>228レスありがとうございます。
>計算に使用するRangeをVariantで受けて配列で計算する程度の高速化は済んでいるんですか?
はい。Office TANAKAや他のいくつかの高速化テクニックのサイトには一通り目を通しており、基本的な高速化は済んでいると考えています。

貼って頂いたリンク先を読む限り、マルチプロセスのデメリットは余裕で受け入れられます。
0232デフォルトの名無しさん2017/02/23(木) 15:03:52.66ID:zwsWAD4F
>>229
今のところ不都合は出てきていません。
>>230
はい、楽天RSSで歩みや板データ取得してなんやかんやしてます。
0233デフォルトの名無しさん2017/02/23(木) 15:11:38.25ID:VrEZVwij
>>227
ざっくりと
Callで呼ぶ、あるいは返り値を利用する(変数に入れたり)する場合はカッコがいる
0234デフォルトの名無しさん2017/02/23(木) 15:54:13.70ID:HqeUFn+k
質問します
Static変数について
モジュール内のStatic変数を開放する方法はありますでしょうか
ENDを使うとほかのモジュールもリセットされて不都合があり使えません
0235デフォルトの名無しさん2017/02/23(木) 16:28:19.49ID:hO+UyGLC
>>234
プロシージャ内ではなくモジュール内?
型に応じてEmptyなりNothingなり0なりを代入する関数を書けばいいでしょ
0236デフォルトの名無しさん2017/02/23(木) 16:42:50.53ID:HqeUFn+k
>>235
オブジェクトならnothing 配列ならerase
Long等ならどうするのかと悩んでいました
0の代入で対処しておきます
0237デフォルトの名無しさん2017/02/23(木) 17:24:27.48ID:boStFqTs
>>209
ちなみにプロはどういうふうにユニットテストしてるのか教えてくれる?
ツールやフレームワークを使ってるならその名前も教えて
0238デフォルトの名無しさん2017/02/23(木) 17:33:52.36ID:zwsWAD4F
>>233
ありがとうございます。いくつかのサイトで勉強し直しました。
0239デフォルトの名無しさん2017/02/23(木) 19:06:41.92ID:wHDezemX
むやみにプロっぽい単語が飛び交っていて面白おかしいw
0240デフォルトの名無しさん2017/02/23(木) 20:49:52.48ID:oQLpCXm2
たぶん>>204はByValとByRefを間違えて逆に書いてしまったんだろう。
そう考えるとつじつまが合う。
0241デフォルトの名無しさん2017/02/23(木) 21:44:52.38ID:exuatn0M
>>237
プロだから料金が必要なんだよ
という気がする
0242デフォルトの名無しさん2017/02/23(木) 22:03:30.78ID:wHDezemX
ここのプロの人って事務のおねえさんにアドバイスの押し売りして凄く嫌われてそう
0243デフォルトの名無しさん2017/02/23(木) 22:14:07.50ID:osMc+8cA
>>237
assert
0244デフォルトの名無しさん2017/02/23(木) 23:49:16.37ID:yGS7m3AS
エクセルでVBA → このスレ
アクセスでVBA → わかる
ワードでVBA → まあ、わかる
パワーポイントでVBA → 使い道あるの?
0245デフォルトの名無しさん2017/02/23(木) 23:50:00.75ID:ahJQbyP7
アウトルックが抜けてるぞ
0246デフォルトの名無しさん2017/02/23(木) 23:52:16.48ID:oQLpCXm2
アウトルックは特定のファイルを立ち上げずにVBAが使えるのが利点
0247デフォルトの名無しさん2017/02/23(木) 23:54:35.36ID:yGS7m3AS
アウトルックでVBA → そんなのあるんか!?wwwwwwwwww
0248デフォルトの名無しさん2017/02/23(木) 23:57:24.56ID:V98aHpH+
VisioでVBA も抜けてる
0249デフォルトの名無しさん2017/02/24(金) 00:02:47.28ID:LZx0CBNb
>>247
メール振り分けとか出来る
自分の好きなように条件を決めてフォルダに移動させたり出来る
0250デフォルトの名無しさん2017/02/24(金) 00:25:29.71ID:y1rV1VB3
VisioでVBA → まずVisioがわからない
0251デフォルトの名無しさん2017/02/24(金) 00:50:55.65ID:hcCi+TdT
>>244
>パワーポイントでVBA → 使い道あるの?

簡単な例だとテンプレからパラメータ入力して顧客とかその状況にカスタマイズしたプレゼン資料を作るとか
Officeの処理を自動化したい場合と機能拡張したい場合にVBAやVSTOを使う
0252デフォルトの名無しさん2017/02/24(金) 06:16:51.42ID:pM2eDGo5
>>240
引数のデフォルトはByRefなんだから、逆になってはないだろう
0253デフォルトの名無しさん2017/02/24(金) 06:35:34.89ID:vf2veUcI
いちいちByVal付けると引数のところがくっそ汚くなるし、ByRef付けたときに扱い方を間違える可能性があるから、
全部ByRefで渡して内部で明示的に別の変数に代入してやるほうがいい。
0254デフォルトの名無しさん2017/02/24(金) 06:58:12.55ID:QNSCjKb1
byValが汚いって感覚はないな
0255デフォルトの名無しさん2017/02/24(金) 07:49:39.72ID:bfVuoLkP
どちらかが付いてないとなんか落ち着かないよな
0256デフォルトの名無しさん2017/02/24(金) 07:59:43.10ID:YZGHPd2K
>>247
結構便利だよ
定期的に送られてくるメールの添付ファイルを保存して、データベースにインポートするプログラムを起動したりしてる
0257デフォルトの名無しさん2017/02/24(金) 08:04:41.89ID:NmXs2kFS
>>253,255
ByValが付いてると汚いとも、なんか付いてないと落ち着かないとも思わない。
デフォルトがByRefであることを理解した上で必要があれば、ByValを使うのみ。淡々と。
0258デフォルトの名無しさん2017/02/24(金) 08:07:35.11ID:NmXs2kFS
>>253
「引数があると汚くなるから変数は全てpublicで」とか言われたら同意出来る?
0259デフォルトの名無しさん2017/02/24(金) 08:10:57.05ID:AVNM5GPI
>>257
書く側だけだなく、使う側のことも考慮すれば明示した方が望ましい
0260デフォルトの名無しさん2017/02/24(金) 11:07:17.89ID:AVNM5GPI
話ずれるけど、VBAで各行に引数置いてコメントを付けられないのが地味にクソ

Function f(ByVal v As Long, _ ' コメント
     ByRef a As Double _ ' コメント
  ) As Double

ってやりたい
0261デフォルトの名無しさん2017/02/24(金) 11:21:45.61ID:SIuzfcCY
>>259
気持ちはわかる。
けど、その考えを進めると
「オプションで省略出来る引数も全て明示するほうが良い」ってならない?それは極端すぎるか。
0262デフォルトの名無しさん2017/02/24(金) 12:23:19.93ID:JxaWophy
>>261
Optionalとか ParamArrayのことを言ってるの?
Optional にはほぼ全部 ByRef 付けてるけど。
0263デフォルトの名無しさん2017/02/24(金) 12:23:45.60ID:QNSCjKb1
>>261
optionalを書かなきゃ省略可とならないと思ってたけどできるの?
0264デフォルトの名無しさん2017/02/24(金) 12:40:30.93ID:HIj3FDgp
>>262,263
いや、メッセージボックス使う時に
ButtonsやらTitleも必ずいつも書く、って意味。
0265デフォルトの名無しさん2017/02/24(金) 12:57:13.30ID:JxaWophy
>>264
ああ、実引数のことか。それは省略するよ。てかそのためのオプションなんだし。
>>259では仮引数の話をしていた。
0266デフォルトの名無しさん2017/02/24(金) 12:58:11.46ID:QNSCjKb1
>>264
使う側は好きにしたらいいと思う

ただ作る側は使う側に考慮して明示的に作った方が親切だと思うよ
0267デフォルトの名無しさん2017/02/24(金) 14:29:02.02ID:9/tVKb6A
>>265,266
作ったプロシージャをライブラリ的に?他者に提供する(って事だよね?)なら、同意だな。
自分でしか読まないコードが多いんで「書かなくて良いものは書かずに済ませる」習慣が身についてしまって(^^;;
あと、idコロコロ変わってると思う、すまない。
0268デフォルトの名無しさん2017/02/24(金) 17:17:09.68ID:pLx05a5G
質問させてください。
A1:E1に別シートのA1:A20の中から入力されているセル(5個のみ)を入力する方法を考えておりますが、うまくできません。
A1:A20には5セルのみ数値が入力されており、その他はカラになっています。
お知恵をお貸しいただければ幸いです。
0269デフォルトの名無しさん2017/02/24(金) 17:54:52.40ID:eVhOHWHn
>>268
コピー元の A1:A20に
対象セル(空値以外)のセルが5個を超えてた場合どうする?
同様に5個未満の時どうすの?

絶対に5個である 前提だと
Set Source = Worksheets("sheet1").Range("A1:A20").SpecialCells(xlCellTypeConstants, 23)
Source.copy Worksheets("sheet2").Range("A1")
とかだけど
0270デフォルトの名無しさん2017/02/24(金) 18:14:04.63ID:uPA9vcnt
>>268
dim i as long,cnt as long
'ws1はデータ元、ws2は代入先
cnt = 0
for i = 1 to 20
if ws1.cells(i,1).Value <> "" then
ws2.cells(cnt,1).Value = ws1.cells(i,1).Value
cnt = cnt + 1
end if
next i
かな
あんまりクリップボードは使いたくないよね
0271デフォルトの名無しさん2017/02/24(金) 18:55:57.51ID:sVIebfPY
Set db = CreateObject("DAO. DBEngine.36").OpenDatabase("",Null,Null,{ODBC接続詞})
でSQL SERVERに接続しているんですが
ネットワークが切れてる場合などに
以下のダイアログが出ます

http://i.imgur.com/bDQc9Wz.png

これを表示させない方法はありますか?
OKボタンを押さないと処理が進まないので困ってます
ADODBだとダイアログは出ないのですが
DAOしか使えない環境です
0272デフォルトの名無しさん2017/02/24(金) 20:29:11.76ID:pLx05a5G
>>269 >>270
268です。ありがとうございます!
事前に5コ以上or以下の場合はエラーが出るようにしてありました。
しっかりお伝えできておらず申し訳ありません。

長いこと考えていたので、すぐにお答え頂き助かりました!
すんません、知恵袋みたいになっちゃいまして。
0273デフォルトの名無しさん2017/02/24(金) 21:10:37.12ID:1MHFSTAM
>>271
ネットワークから切り離さない
0274デフォルトの名無しさん2017/02/24(金) 21:32:17.86ID:KBFO5tFR
>>271
ウィンドウを監視してそのメッセージウィンドウが表示されたのを検知そたらすぐに閉じるというスレッドを実行すればいいよ
0275デフォルトの名無しさん2017/02/24(金) 21:35:33.95ID:ou+kvViR
>>272
エクセル上の機能を駆使するのもいいけど基本はifとforだから
0276デフォルトの名無しさん2017/02/24(金) 22:33:56.91ID:3s3jOtzD
>>271
普通にOn Errorでトラップできないのか?
0277デフォルトの名無しさん2017/02/25(土) 00:40:21.68ID:D6dFQ1fO
DAOは逆にマニアックだな
0278デフォルトの名無しさん2017/02/25(土) 03:07:16.89ID:N0qiiOPC
OLEDBが廃止の方向だから、ADOも今から新規で使うのは躊躇われるわ
0279デフォルトの名無しさん2017/02/25(土) 03:09:12.51ID:IvVV1H8V
>>209
プロの人、どういうふうにユニットテストしてるのか教えてよ
待ってるよー
0280デフォルトの名無しさん2017/02/25(土) 07:50:24.67ID:N9ovtMND
>>279
assertつってんだろカス
0281デフォルトの名無しさん2017/02/25(土) 08:36:20.81ID:D6dFQ1fO
>>278
これマジ?
DBに繋ぐ方法他にしらんのだけど
0282デフォルトの名無しさん2017/02/25(土) 08:48:58.69ID:NZ6bqScV
ODBC接続文字列でダイアログ出さない設定なり
WIndows上で出さない設定なりがあれば
万事解決する気がしてきました
探しつつ関連のスレがあればそっちで聞きます

>>273
ネットワークが切れるなんて
分かりにくい例えを出して申し訳ないけど
上のダイアログを表示させない方法を探してます

>>274
もう一つプログラムを動かして
常にウインドウを監視して閉じるってことはできるかもしれないけど厳しいです

>>276
処理前にOn Error Resume Nextおいてるけど
ダイアログは出てしまう
呼び出したDAOが出してるダイアログなので
VBA側で待ち構えても意味がないのかも

>>277
Access内で書くならDAOでいいと思うけど
外部DBに接続するならADOなんじゃないかなーという気はする
人が書いたPGなんでともかく
DAOでダイアログを出さない方法を模索します
0283デフォルトの名無しさん2017/02/25(土) 09:40:18.14ID:8VKSJua/
>>280
それは単に「ユニットテストを書いてます。中にassert文入れてます」という主張にしか聞こえないけど?
0284デフォルトの名無しさん2017/02/25(土) 09:44:59.46ID:8VKSJua/
>>278
DB詳しくないんで「純ODBCで繋いでいる俺に死角はなかった」と思っていいのかわからん。
0285デフォルトの名無しさん2017/02/25(土) 09:51:52.61ID:2vFA6XbA
>>283
そりゃないからよ
0286デフォルトの名無しさん2017/02/25(土) 10:27:01.59ID:N9ovtMND
>>283
ユニットテストとは本来そういうものだ
なんならassertじゃなくてprintでも問題ない
0287デフォルトの名無しさん2017/02/25(土) 10:53:22.34ID:8VKSJua/
>>209では一体何が言いたかったのかと
0288デフォルトの名無しさん2017/02/25(土) 11:48:30.96ID:UUkqw70R
Excelの外部データ取り込みはDAO?
ADO?
0289デフォルトの名無しさん2017/02/25(土) 12:23:28.37ID:2vFA6XbA
あんだお?
0290デフォルトの名無しさん2017/02/25(土) 15:50:29.76ID:IvVV1H8V
>>280
え、ほんとにプロのひと本人なの?
さすがにテストコードを書いて何らかのassertを使わない人はいないから
どういうやり方なのか全然分からないんだけど
0291デフォルトの名無しさん2017/02/25(土) 15:58:24.02ID:AevZg9Fs
>>278
>>281と同じくなんだけどホンマ?
0292デフォルトの名無しさん2017/02/25(土) 15:58:35.96ID:IvVV1H8V
>>282
ODBCのSQL_DRIVER_NOPROMPTってのがそれっぽいやつだと思うけど
DAOで使えるのかエラーダイアログも抑止するのかはわからない
0293デフォルトの名無しさん2017/02/25(土) 16:21:48.79ID:9TfgDVOx
>>290
いいか
ユニットテストとは本来どういうものか考えろ
機能を実行して期待する動作と比較して期待通りだったかどうか可視化する
そしてそれをいつでも繰り返し実行できるように保つ
それさえ満たせばそれ以外のことはどうだっていいんだよ
手でテストコードを書きためてもいいし
テストコードを規約化して自動化してもいい
綺麗にレポートにしたっていい
他人の書いたそれをパクってもいい
そんなものはユニットテストの本質ではないので好きにすればいい
こんな簡単なことなのにやり方がわからないなら多分思考能力ゼロのバカなんだろうな
何でもかんでも他人任せでフレームワークがないと何もできない子供
0294デフォルトの名無しさん2017/02/25(土) 16:28:50.64ID:8VKSJua/
>>293
だからお前は>>209で何が言いたかったんだよ?
それを言わないから続くんだよ。
0295デフォルトの名無しさん2017/02/25(土) 16:32:21.89ID:zqm3AbRf
>>282
DAOは詳しくないんで ダイアログ出さない方法はしらんけど
接続できるか事前に調べるってのはどう?

1)ADOで接続してみてエラーなら終了(OKなら即切断)
2)DAO接続して処理
とか
0296デフォルトの名無しさん2017/02/25(土) 16:37:18.34ID:9TfgDVOx
>>294
知らんわ
>>209に聞けよ
0297デフォルトの名無しさん2017/02/25(土) 16:40:09.69ID:IvVV1H8V
>>293
別にバカにしたくて聞いてるんじゃないんだけどな
もうそういう回答しかしないならいいよ自称プロさん
0298デフォルトの名無しさん2017/02/25(土) 17:14:53.72ID:hdmL7pMG
>>292
ありがとう、月曜に調べてみるよ

>>295
接続文字列が無理だったら
ADOでエラー確認するよ、ありがとう
0299デフォルトの名無しさん2017/02/25(土) 17:19:09.53ID:IvVV1H8V
自分はVBAでAssertDateみたいなマッチャー関数と結果出力用の関数を幾つか用意して
その汎用的なモジュールとモジュール単位でテストケースを書いた別モジュールを用意してそれを実行してる
リフレクションとかは使わずテストスイートの管理はマニュアルで出力は基本イミディエイトウィンドウ

結果表示を見やすくするのが難しいしマニュアル管理が面倒くさいので次やる時はツール使うつもり
Macなのであんまり選択肢ないんだけどね

自称プロ氏以外で自分はこんなやり方してるよって人がいたら教えてね
0300デフォルトの名無しさん2017/02/25(土) 19:55:51.75ID:hngPS/il
テストか
ちゃんとやったこと無いな
おすすめの本とかある?
0301デフォルトの名無しさん2017/02/25(土) 21:05:33.03ID:GLyd7N/c
すんません。VBAで使えるエスケープ文字とかまとめたのとかありませんか
\r\n とかVBAだとどうだったか一覧で確認したく
0302デフォルトの名無しさん2017/02/25(土) 21:22:36.39ID:InN1hs8k
質問です。
ダイスゲームを作っているのですが、
「ダイスを選んで(d4〜d12)振る。出目が最大値なら振り足していく」の
「出目が最大値なら振り足し」の部分がうまくいかず。
何かヒントだけでもいただけないでしょうか?
よろしくお願いします。
0303デフォルトの名無しさん2017/02/25(土) 21:26:49.58ID:z4sM9zVw
>>301

Visual Basic の定数
https://msdn.microsoft.com/ja-jp/library/office/gg251522.aspx

└その他の定数
  https://msdn.microsoft.com/ja-jp/library/office/gg278800.aspx
0304デフォルトの名無しさん2017/02/25(土) 21:42:51.80ID:IvVV1H8V
>>300
ユニットテストに関して今まで自分が読んだ中ででコレって本は正直ないね
今まで読んだ中で一番参考になったと思うのはxUnit Test Patternsだけど人に勧めるほどじゃない
おすすめ本があればおれも知りたい
0305デフォルトの名無しさん2017/02/25(土) 21:52:34.65ID:IvVV1H8V
>>302
これ誤爆じゃなく?
0306デフォルトの名無しさん2017/02/25(土) 23:08:25.16ID:IvVV1H8V
誤爆じゃないなら
Do~Untilとかのループを使えばいいと思うよ

Do
score = RollDie(demension)
total = total + score
Loop Until score <> demension
0307デフォルトの名無しさん2017/02/25(土) 23:59:41.36ID:THbYlaQi
>>306
>demension

高度なギャグ?
0308デフォルトの名無しさん2017/02/26(日) 00:49:24.34ID:Jc/HEYW+
MMX200MHzの頃は、WindowsAPIでも使わないと、
絵の動きがカクカクだったけど、
今なら標準機能だけでも高速に動いたりする?
0309デフォルトの名無しさん2017/02/26(日) 01:08:21.13ID:xChU2zdP
>>308
そうね
0310デフォルトの名無しさん2017/02/26(日) 01:22:54.38ID:/2VmdLBu
>>307
ハハハこりゃごめん
無意識だったわ
0311デフォルトの名無しさん2017/02/26(日) 16:12:12.81ID:no7L8kFb
>>304
なるほどねえ
大まかな基本的な様式を学びたいねえ
0312デフォルトの名無しさん2017/02/26(日) 18:31:38.72ID:R965yTZc
何言ってんのかわからんけど、excelなの?
0313デフォルトの名無しさん2017/02/26(日) 19:23:51.79ID:AZYnfb42
>>311
基本的な様式はassertかprintだよ
0314デフォルトの名無しさん2017/02/26(日) 19:26:46.18ID:uwzeEkf6
>>313
カバレッジとかの計算は出来るの?
0315デフォルトの名無しさん2017/02/26(日) 21:21:18.49ID:5EEU5ZpJ
俺のユニットテスト
0316デフォルトの名無しさん2017/02/26(日) 21:32:20.06ID:no7L8kFb
>>313
どうassertやprintするか、ってのが様式でしょ
0317デフォルトの名無しさん2017/02/26(日) 21:34:59.96ID:5EEU5ZpJ
>>316
ですよねー
0318デフォルトの名無しさん2017/02/26(日) 21:40:18.38ID:/2VmdLBu
>>316
ですよねー
0319デフォルトの名無しさん2017/02/26(日) 23:03:16.98ID:AZYnfb42
>>316
違うよ
ユニットテストの様式つまり共通の形式とは
機能を実行して期待する結果と比較して期待通りだったか可視化する
繰り返し実行できるようにする
この2点だけ
要するに共通してやる事はassertかprintってこと
0320デフォルトの名無しさん2017/02/26(日) 23:05:16.29ID:AZYnfb42
どうやってassertやprintするかって部分は様式ではなく個々の実装に当たる
実装は言語やフレームワークや実装者によって様々
0321デフォルトの名無しさん2017/02/26(日) 23:09:43.75ID:AZYnfb42
ある実装ではカバレッジをサポートする
ある実装ではテストケースの自動作成をサポートする
ある実装ではレポーティングをサポートする
……
こういった便利な機能は最近では当たり前ではあるが個々の実装がサポートしているだけであって様式ではない
VBAの手作りユニットテストがこういった機能をサポートして居なくとも先に述べた様式さえ守ればそれはユニットテストなのだ
0322デフォルトの名無しさん2017/02/26(日) 23:12:14.71ID:5EEU5ZpJ
>>321
お前は「基本的な様式はassertかprintだよ」と言った
0323デフォルトの名無しさん2017/02/26(日) 23:32:26.48ID:AZYnfb42
>>322
そうだよ
0324デフォルトの名無しさん2017/02/26(日) 23:33:49.65ID:no7L8kFb
>>319
様式って言葉が間違いなら手順でもいいけど
0325デフォルトの名無しさん2017/02/26(日) 23:40:35.36ID:S7QG1cJ6
重要なのはユニットテストの定義じゃなくて具体的なやり方の話だしな
0326デフォルトの名無しさん2017/02/27(月) 06:20:51.03ID:MTBn4+hr
また自称プロ()が困った話をしだしたよ
0327デフォルトの名無しさん2017/02/27(月) 09:06:43.18ID:Rm2//oz0
セルの値が変化して、Worksheet_Calculateの実行が始まり、実行が終わる前に他のセルの値が変化したらどうなるの?
それまで動いていたWorksheet_Calculateは中断され、新たにWorksheet_Calculateが開始されるの?
0328デフォルトの名無しさん2017/02/27(月) 10:11:54.88ID:FuQm8dQR
>>327
そんなことがどういう状況で起こるの?
0329デフォルトの名無しさん2017/02/27(月) 10:30:46.57ID:Rm2//oz0
>>328
>>227>>232を読んでふと疑問に思ったのよ。
一つのシートにA社の現在の株価とB社の現在の株価があったとして、それらがリアルタイムで変化するわけ。
あるときA社の株価が変化してWorksheet_Calculateが動き出して終了する前にB社の株価が変化したらどうなるんだろ?って疑問です。

今これに関して困っているというわけじゃなくて、ふとした疑問なんです。
0330デフォルトの名無しさん2017/02/27(月) 10:34:47.28ID:7A4CRrMK
B社の株価の変化が反映されるのはWorksheet_Calculateが終了してからになるのでは
0331デフォルトの名無しさん2017/02/27(月) 10:39:17.85ID:Rm2//oz0
>>330
RSSというものの仕組みがわかっていないのですが、外部のプログラムがセルの内容を変化させる???
のだとしたら、外部プログラムはWorksheet_Calculateの終了をわざわざ待つのかな?
それともWorksheet_Calculateが実行中はセルの内容は書き換わらないというエクセルの仕様などあるのでしょうか?
0332デフォルトの名無しさん2017/02/27(月) 11:28:18.84ID:FuQm8dQR
そういえば昔DDEなんてものがあったなあ。
確かにRSSの仕組みは知らないや。
0333デフォルトの名無しさん2017/02/27(月) 11:40:15.11ID:DGmPM/4e
>>279
プロなら、xUnit Testing Frameworkを使うだろうね。
ここにいろいろあるから参考までに。
http://d.hatena.ne.jp/miau/20110301/1298935505

ちなみに、俺がそれを必要としたときにはしっくりくるツールがなかったので自作した。
0334デフォルトの名無しさん2017/02/27(月) 11:49:15.97ID:DGmPM/4e
>>319
> この2点だけ
xUnit Testing Frameworkとして要求されるのは
・各テストを独立して実行する仕組みがある
 →あるテストの結果が次のテストに影響してはならない
  ただし、Excelに関してはシートの変更を自動で元に戻せないなどの問題があるが
・テストが失敗しても止まらない
 →実行時エラーで止まってたらテストにならない
・テストメソッドのの定義を検出して、自動実行する
 →リフレクションなどを使ったりして実現する。言語の制約でそれができないものもあるが
0335デフォルトの名無しさん2017/02/27(月) 12:08:01.18ID:FuQm8dQR
動的なものは好まない
0336デフォルトの名無しさん2017/02/27(月) 18:53:37.41ID:bS39cZCs
フレームワークがないと何もできないお子様が増えたよね
技術の進歩と見るか人間の退化と見るか
0337デフォルトの名無しさん2017/02/27(月) 19:28:07.30ID:FuQm8dQR
プロは別としてユニットテストをやっている人間がとれだけいるかねえ
0338デフォルトの名無しさん2017/02/27(月) 23:43:47.40ID:Rm2//oz0
>>327です。誰かわかりませんか?
0339デフォルトの名無しさん2017/02/27(月) 23:54:17.29ID:JEmDULg8
やってみればいいんじん
Worksheet_Calculate()イベントの中で 再計算が起こるようにセル値を変える
無限ループにならないよう対策は必要だけどなwww
0340デフォルトの名無しさん2017/02/27(月) 23:57:42.60ID:/fbOgPk7
>>338
計算中は、少なくともマウスやキーボードは操作できなくなる
OnChangeの連鎖は無限ループになってアプリが無反応になる
タイマーイベントなどを仕掛けた時はどうなるか知らんけど、やっぱり無反応になるんじゃないかな

これぐらい、自分で確かめてみたらいいんじゃない?
誰かの回答を待つより早いぞ
0341デフォルトの名無しさん2017/02/28(火) 00:52:27.18ID:39alJvfi
>>338
シングルスレットモデルだからDoEventsを使って
意図的に自分のコード以外からのセルの値をアップデートを許可しない限り
VBAのコード実行中に他のやつがセルを更新することはできないでしょ
0342デフォルトの名無しさん2017/02/28(火) 00:58:02.12ID:39alJvfi
こんな感じのループを入れたWorksheet_Calculateを作って自分で試してみるといいよ

startTime = Timer
Do While Timer < (startTime + seconds)
DoEvents
Loop
0343デフォルトの名無しさん2017/02/28(火) 07:34:06.01ID:7mNVCjui
>>338です。>>339-342レスありがとうございました。
そうですよね、自分でやってみます。
外部アプリケーションからの書き込みは自分では無理ですが、
Worksheet_Calculate内での書き換えはトライできそうですね。

>>340-341
確かに言われてみればマクロ実行中は操作受け付けてくれませんよね・・・
0344デフォルトの名無しさん2017/02/28(火) 10:46:46.66ID:UkiPXm0F
>>337
いないだろうねぇ

てか、プロでもやってる人少ないだろうね
多分このスレにもプロは何人かいると思うが、他人に提供するプロダクトレベルのVBAのコードを
書いた人は少ないんじゃないだろうか
0345デフォルトの名無しさん2017/02/28(火) 12:20:09.93ID:VxO1C4Zn
それプロちゃいますやんw
いよいよもって意味不明の自称プロw
0346デフォルトの名無しさん2017/02/28(火) 12:35:40.04ID:ItXJr3YY
名刺にプロと書いてあればプロ
0347デフォルトの名無しさん2017/02/28(火) 12:50:07.36ID:UkiPXm0F
>>345
> それプロちゃいますやんw
プロのプログラマが社内向けツール(非プロダクトレベル)とかをVBAで書いたりするだろ?
行数レベルでいうと、3000行未満くらい
どっちかというと、大半がそういうプロなんだと思うが
0348デフォルトの名無しさん2017/02/28(火) 14:11:31.27ID:w0lg3amf
そんなん誰が保守するんだろう
0349デフォルトの名無しさん2017/02/28(火) 14:20:45.76ID:UkiPXm0F
>>348
テスト無しでも保守するのがプロ

てか、君の会社の社内ツールにはユニットテストが完備されてるの?
そうならすごいが、時間の無駄という見方もあるな
0350デフォルトの名無しさん2017/02/28(火) 14:48:41.98ID:UkiPXm0F
最近の動向を追ってなかったのでちょろっと検索してみたけど、spec好きにはこれがいいかもね
https://github.com/VBA-tools/VBA-TDD

githubでも思ったよりvba関連のプロジェクト多いな
面白そうなもの
https://github.com/rubberduck203/VBEX

まあお堅い所だと、誰が書いたかもわからんコード使うなとか言われそうだが
0351デフォルトの名無しさん2017/02/28(火) 15:19:19.93ID:ItXJr3YY
>>350
このVBEXっての知らなかったな。面白そうだし参考になるかも。
0352デフォルトの名無しさん2017/02/28(火) 18:59:41.30ID:2I1G4LU3
社内ツールでも今時VBAは無いな
手軽で便利なツール他に沢山あるし手書きとか冗談だろ
出先とかで本当にどうしようもない場合にはVBAが重宝するけどそれだけ
今まさにそんな状況だから助かってる
0353デフォルトの名無しさん2017/02/28(火) 19:11:41.43ID:ItXJr3YY
>>352
「それだけ」?
0354デフォルトの名無しさん2017/02/28(火) 19:12:45.52ID:ItXJr3YY
テストツールの話か
なんでもない
0355デフォルトの名無しさん2017/02/28(火) 19:19:13.41ID:ELKFJ24A
>>352
なら ここに用ないだろ 消えて
つか VBAってツール用じゃないぜ(ExcelとかOfficeソフトの マクロ用)だぞ

たまたまツールにも 使えるってだけで 何勘違いして語ってるのよ
0356デフォルトの名無しさん2017/02/28(火) 19:29:40.97ID:5GEsQx3y
プロってそんなに素人にコーディング指導したいものなのか?
0357デフォルトの名無しさん2017/02/28(火) 19:30:33.59ID:ItXJr3YY
>>355
俺も一瞬そう勘違いしたが
0358デフォルトの名無しさん2017/02/28(火) 19:39:27.15ID:ELKFJ24A
>>357
ま色々出来てしまうから 勘違いも仕方ないんだけど

ツール用と使おうとして アレ出来ない これ出来ないって言われても 滑稽なだけ
なら なんで VBA使ってんの? って思う
0359デフォルトの名無しさん2017/02/28(火) 19:44:51.73ID:2I1G4LU3
>>355
今は用があるんだよ
文盲か?
0360デフォルトの名無しさん2017/02/28(火) 19:47:15.36ID:2I1G4LU3
>>355
あとな
ツール用と思ってないから>>352の発言だろ?
文盲か?
0361デフォルトの名無しさん2017/02/28(火) 19:50:23.99ID:VYorfgJV
自分用ツールとして使うにはとても便利だと思うよ
でもいつの間にか業務フローに組み込まれてるのは勘弁
0362デフォルトの名無しさん2017/02/28(火) 20:44:03.30ID:5GEsQx3y
ミサワ感wwww
0363デフォルトの名無しさん2017/02/28(火) 21:09:09.20ID:39alJvfi
マクロで作ったものをツールと呼ばない人がいるんだな
0364デフォルトの名無しさん2017/02/28(火) 22:49:08.74ID:Zy6Q+tfd
計算 英語
会社 英語
挿入 英語
安い 英語


変数名考える時、こうやってググる英語力のない俺。
0365デフォルトの名無しさん2017/02/28(火) 22:54:07.62ID:c8QBNQT9
>>364
挿入はpushとinsertとfu*kのどれを選ぶのか
0366デフォルトの名無しさん2017/02/28(火) 23:12:40.34ID:4juWt3rx
>>365
俺はもっぱらinsert
f*chは///
0367デフォルトの名無しさん2017/02/28(火) 23:21:10.10ID:39alJvfi
そういう文脈ではpenetrateを使います
http://www.urbandictionary.com/define.php?term=penetrate

ぺ、ペネトレーションテスト!?
はい覚えましたね
0368デフォルトの名無しさん2017/03/01(水) 00:23:09.29ID:oq22+n6s
売掛、買掛って英語でなんて言うんだっけ…
スペル長いなぁ…
urikake kaikake uriage siire
こんな変数名に結局してしまうダメマクラーです
0369デフォルトの名無しさん2017/03/01(水) 00:28:53.31ID:uGJVx5D1
Dim 売掛 As Integer でいいじゃない
0370デフォルトの名無しさん2017/03/01(水) 00:45:46.71ID:oq22+n6s
ええ…売り掛け、売掛け、売掛って日本語変換するのだるいよう
あとintegerじゃ桁が足りないよう
0371デフォルトの名無しさん2017/03/01(水) 00:46:24.62ID:RW4kYq6z
Currencyにしとけよ
0372デフォルトの名無しさん2017/03/01(水) 08:41:54.67ID:SJrJxNnQ
>>364
○○ 英語 でググるのは俺も普通にやるけどその4つぐらいはググらなくてもわかるわ w
0373デフォルトの名無しさん2017/03/01(水) 09:48:05.42ID:8L/LyjJG
辞書で調べてもこれでいいのか不安になる
直訳で意味が通じなくなってたらどうしよう、と
それでも単語が出ればまだいいけど、単文しか出てこない時はだいぶ悩む
0374デフォルトの名無しさん2017/03/01(水) 12:17:44.40ID:riQaWnbA
どっちにしろお前にしか意味は分からないのだから調べるだけ無田なんだよなぁ
0375デフォルトの名無しさん2017/03/01(水) 12:26:26.67ID:pq9DUdcy
>>369
たぶん変数名じゃなくて関数名かクラス名か引数名でしょう
0376デフォルトの名無しさん2017/03/01(水) 12:27:31.11ID:Mv+9VeBT
クラスで思ったのだけど
クラス内のサブプロシージャの呼び出しは

a.class1 引数でイコールつけないけど

プロパティ(letやset)の場合はなぜイコールをつけるのだろう?

初めは何も知らなくてつい括弧とかつけて落としていたなぁ
0377デフォルトの名無しさん2017/03/01(水) 13:30:59.55ID:qicsiMdC
>>376
アクセサ風味なんだから引数より代入した方がそれっぽいじゃん
0378デフォルトの名無しさん2017/03/01(水) 13:54:08.09ID:pq9DUdcy
ただの構文糖だと思ってるけど
0379デフォルトの名無しさん2017/03/01(水) 13:56:18.10ID:NYMcPNs0
>>376
range("A1").value = "hoge"
debug.print range("A1").value
に違和感がある?
ないのなら、Class1にValueという名前のプロパティを作り
dim obj as new class1
obj.value = "hoge"
debug.print obj.value
にも違和感はないと思うんだが。
0380デフォルトの名無しさん2017/03/01(水) 19:49:27.73ID:SJrJxNnQ
>>376
まあプロパティって意味のとりにくい用語だよね
英語の意味としては財産とか所有物って意味でそこからインスタンスに所属する値って意味に使われてるみたい
要するにクラス中の変数なので普通の変数と同様に Let/Set が要ると言う実装にしたんだろうね
0381デフォルトの名無しさん2017/03/01(水) 23:00:09.13ID:2W8U8v2T
Let/Setすると、渡す.為だけの余計な変数が増えるのがイヤ。
0382デフォルトの名無しさん2017/03/02(木) 00:40:32.70ID:m+opN9fI
>>381
0383デフォルトの名無しさん2017/03/02(木) 12:52:56.78ID:Awc1p1pO
すみません 教えていただきたいのですが
もしA1セルの値がaまたはbの時にA2セルにxを表示、
cの時にA2セルに空欄を表示、
dの時にはA2セルに〇を表示させる時にはどのようにifぶんを作ったら宜しいでしょうか?
0384デフォルトの名無しさん2017/03/02(木) 12:58:28.70ID:oYGdpVKY
>>383
キーボードを使って
文法に則ればできるよ。
ifから始まります。
0385デフォルトの名無しさん2017/03/02(木) 13:02:35.84ID:6uXGYfUV
いじめっ子きてんね
0386デフォルトの名無しさん2017/03/02(木) 13:16:20.59ID:cLIuGgew
sub sample()
Dim s As Range
Dim t As Range
Set s = Range("A1")
Set t = Range("A2")

If s.value="a" Or s.value="b" then
t.value="×"
elseif s.value="c" then
t.value=""
elseif s.value="d" then
t.value="○"
end if
end Sub
0387デフォルトの名無しさん2017/03/02(木) 13:23:33.39ID:BpvNXhHY
>>386
この程度のif文自分で作れないのはヤバイと思って取り組んでほしいね
0388デフォルトの名無しさん2017/03/02(木) 13:39:42.77ID:TWfcI5S9
vlookup使えばいいのに
0389デフォルトの名無しさん2017/03/02(木) 13:44:05.81ID:Awc1p1pO
>>386
すみません ありがとうございました
0390デフォルトの名無しさん2017/03/02(木) 14:37:31.76ID:oipLUCYD
釣りではなく本当にそういう層もいる→新規参入者がまだいる

ってことか?
0391デフォルトの名無しさん2017/03/02(木) 14:53:52.35ID:N1b4IOL+
そりゃ子供は毎年生まれてんだから新規もいるやろ
0392デフォルトの名無しさん2017/03/02(木) 15:12:42.33ID:oipLUCYD
>>391
COBOL同様に絶滅危惧種としてとらえていた
0393デフォルトの名無しさん2017/03/02(木) 15:16:28.01ID:iFkNWUjs
>>383
IFをネストさせればいいんだよ
=IF(OR(A1="a",A1="b"),"x",(IF(A1="d","o","")))

※a,b,d以外はcに限らず空白
0394デフォルトの名無しさん2017/03/02(木) 16:04:27.65ID:N1b4IOL+
>>392
Excelってそこまで廃れてるか?
代わりに何が使われてるの?
0395デフォルトの名無しさん2017/03/02(木) 16:32:43.48ID:oipLUCYD
>>394
いやVBAがだよ
0396デフォルトの名無しさん2017/03/02(木) 16:46:22.36ID:N1b4IOL+
>>383の質問にはVBAとか書いてないけどな
0397デフォルトの名無しさん2017/03/02(木) 17:05:17.53ID:oipLUCYD
>>396
If文と書いてあるじゃんか
0398デフォルトの名無しさん2017/03/02(木) 17:11:03.46ID:TxVakJtw
>>395
ちょっと語っていい?

VBAってなんの為に あるのかわかってる?
VBA(VB for Application)よ
Officeアプリケーションのマクロ言語として VB言語(VB6)が採用された経緯上
Applicationは Officeアプリケーションを指すわけで
"Officeアプリケーションの為のVB言語"
Officeアプリケーションと切り離せないのね MS Ofiiceが現役なら VBAも現役

もし
Officeアプリケーションと切り離して 開発言語と考えるなら
元となった VB6が"絶滅危惧種"なのでその考えは ある意味 正しいとも言えるが
Officeアプリケーションと切り離せない以上 その考え方 そのものが無意味
0399デフォルトの名無しさん2017/03/02(木) 18:03:41.25ID:N1b4IOL+
>>397
マクロのIIF関数のことかもしれんだろ
0400デフォルトの名無しさん2017/03/02(木) 18:06:14.85ID:i3N4WbMp
VBEで開かれてるモジュールとかフォームを閉じるショートカットってないんですかね
0401デフォルトの名無しさん2017/03/02(木) 18:45:38.15ID:yayrL0fl
ずっと昔からMSのほぼすべてのアプリ共通でMDIを閉じるショートカットはCtrl+F4
0402デフォルトの名無しさん2017/03/02(木) 18:48:06.75ID:35cEEGqE
>>399
関数と文の違いもわからなくなったらちょっと頭冷やした方がいい
0403デフォルトの名無しさん2017/03/02(木) 18:53:13.64ID:oipLUCYD
>>398
現役であり続けるとしてもユーザーと共に高齢化していくものってあるでしょ
0404デフォルトの名無しさん2017/03/02(木) 19:01:21.59ID:TWfcI5S9
>>403
エクセルがゴミに見えるようなスプレッドシートソフトが世に出まわる事態とならない限り新規ユーザは増える
0405デフォルトの名無しさん2017/03/02(木) 19:02:48.39ID:TxVakJtw
>>403
高齢化しても MSが OfficeのVBAを存続させる限り ずーーーーと現役
MSがVBAを捨てて 新な マクロ言語を採用して それが浸透した時
はじめて"絶滅危惧種"と言えるでしょ
0406デフォルトの名無しさん2017/03/02(木) 19:13:07.57ID:tOCPWbBv
エクセル動かす程度なら別にVBAにこだわらなくてもいいじゃん
0407デフォルトの名無しさん2017/03/02(木) 19:16:07.67ID:O3pFZTv5
.netと互換性がないから切り替えのタイミング難しいよな
モード切り替えとかで対応できんもんかね
0408デフォルトの名無しさん2017/03/02(木) 19:28:00.20ID:oipLUCYD
>>405
もともとは新規参入者がいるなんて意外だなぁという話だった。
0409デフォルトの名無しさん2017/03/02(木) 19:31:52.59ID:oipLUCYD
つまり既存のユーザーが使い続けるのは問題ないけど、そこからの引き継ぎとかで
今から若い人にVBAを覚えてもらうってのはなんか悪いなあ、という気持ち。
0410デフォルトの名無しさん2017/03/02(木) 19:52:49.55ID:i3N4WbMp
>>401
ありがとう Ctrl+Wが共通だと思ってたわ
0411デフォルトの名無しさん2017/03/02(木) 20:13:09.39ID:TxVakJtw
>>408-409
なるほど 君の主張は
VBAが"絶滅危惧種"
ではなく
VBAを"絶滅危惧種"にしたい
なのね

俺と主張が違う訳だ・・・がんばってね(ハート)としか言えないな
一方的ですまんが これで終わりにするよw
0412デフォルトの名無しさん2017/03/02(木) 20:22:18.41ID:5DyrcvCx
本屋に行けばExcelVBAの本が沢山でてんのに、これで絶滅危惧種とかって
0413デフォルトの名無しさん2017/03/02(木) 20:31:33.46ID:rp+EHrUt
絶滅すべきだとは思うけど
実際に絶滅するかは全く別の話やな
0414デフォルトの名無しさん2017/03/02(木) 21:11:08.84ID:tOCPWbBv
癌やCOBOLと同じ
根絶やしにすべきなんだけどあちこち根を張っててもう除去したくてもできない
共倒れするまで付き合って行くしかない
0415デフォルトの名無しさん2017/03/02(木) 21:11:20.16ID:iFkNWUjs
基本そこらの本屋にあるExcelVBAの本はMOS試験受けるような人たちと同じ層をターゲットにしてるでしょ
VBAは普通にやればできるからiPhone/Androidの開発本の類よりはマシだろうけど
0416デフォルトの名無しさん2017/03/02(木) 21:13:00.43ID:iFkNWUjs
個人用に少しOfficeの機能を拡張したいときに使うのがVBA
Bashとかと一緒で本格的にやるときはちゃんとしたツールを選んだほうが賢い
0417デフォルトの名無しさん2017/03/02(木) 21:28:51.64ID:ILmNVxJO
>>414
おばちゃまはね
0418デフォルトの名無しさん2017/03/02(木) 22:25:06.01ID:0SZLHX9K
PythonやjavascriptをVBAの代わりに使えるようにならんかな
勿論MS公式で
0419デフォルトの名無しさん2017/03/02(木) 22:49:54.05ID:iFkNWUjs
MS公式のJavaScript-APIってのでOfficeのAdd-inが作れる
Pythonは公式じゃないけどExcelを操作するライブラリもあるしVSTOでIronPython使える
どれもVBAの完全代替ではないけどやろうと思えばやれる環境は整ってる

1つ言語をサポートするのにも相当なコストがかかるから
VBAのかわりにPythonが標準でサポートされるようなことはまず無いだろうね
0420デフォルトの名無しさん2017/03/02(木) 22:55:38.59ID:oYGdpVKY
>>389
俺には礼がないのかよ
0421デフォルトの名無しさん2017/03/02(木) 23:06:52.55ID:o++cz0AB
Cが少しずつVBに近づいていって、
VBが少しずつCに近づいていって、
気づいたら、同じじゃん!
ってなったらいいなあと思いました。
0422デフォルトの名無しさん2017/03/02(木) 23:13:36.33ID:ILmNVxJO
>>421
.netでほぼ統合されたよ
0423デフォルトの名無しさん2017/03/02(木) 23:25:40.56ID:lUDhMt+0
文法上どうやっても相容れない部分はあるからしかたない
かじった感じC♯は扱いやすそうだったけどね
0424デフォルトの名無しさん2017/03/03(金) 00:19:59.13ID:Yp5yaGjW
VBAだっつってんのに、うちの会社の人たちは、
みんなマクロマクロマクロマクロマクロマクロマクロマクロ言うんですよ。

Rows(1).DeleteだとVBA、
Rows(1).Select→Selection.Deleteだとマクロってことでいい?
0425デフォルトの名無しさん2017/03/03(金) 00:25:20.77ID:GTe30Tvn
どっちもVBAで書いたマクロ
0426デフォルトの名無しさん2017/03/03(金) 00:26:35.38ID:CcOIZBjg
vbaは言語、マクロは機能の名前

だっけ?
0427デフォルトの名無しさん2017/03/03(金) 00:45:36.07ID:GTe30Tvn
マクロは文脈によって少しずつ意味が違う
一般的なプログラム言語でいうマクロ
キーボード操作を記録再生するキーボードマクロ
それを拡張してアプリを自動化するためのマクロ

MSDNの記事を読む限りはVBAで作ってるものはAdd-inだろうがなんだろうがマクロと読んでる
マクロを有効にするっていう文脈で有効にしないと動かないのがOfficeのマクロ
0428デフォルトの名無しさん2017/03/03(金) 04:33:35.83ID:NhWEsePB
>>424
つか、何でマクロって言われるのがやなの?個人的には>>425,426であって嫌悪の対象にはならんのじゃが。
0429デフォルトの名無しさん2017/03/03(金) 08:05:09.24ID:chSe/5JU
>>428
非プログラマからしたらツールがどんな言語でかかれてるかなんてどうでもいいからな
officeの自動化→マクロってだけだ
まあ気持ちもわからんでもないけどね
マクロって言うとマクロの記録だけで作ったあれを思い出させるんじゃないか
0430デフォルトの名無しさん2017/03/03(金) 08:14:42.67ID:L9yGk0QS
>>429
ああ。「マクロの記録」で作ってると思われてる、って意味なら哀れだな。
0431デフォルトの名無しさん2017/03/03(金) 12:23:59.99ID:ehAto94L
プログラマーもツールの言語が何かなんて気にしないけど
0432デフォルトの名無しさん2017/03/03(金) 12:27:26.70ID:enWtQeEf
そこは気にしろよ
0433デフォルトの名無しさん2017/03/03(金) 12:34:06.26ID:ehAto94L
別に俺がメンテする訳じゃないし
てかお前らそんなのいちいち気にしてんの?
0434デフォルトの名無しさん2017/03/03(金) 12:46:11.61ID:tU0QzTHp
そんなつもりはないんだけどなんとなく気になっちゃう
0435デフォルトの名無しさん2017/03/03(金) 13:13:49.82ID:enWtQeEf
非プログラマは(使うだけの立場だから)言語は気にしないという話の流れなんだから、
プログラマは自分が書く立場を前提にしなきゃ話が通じない。
0436デフォルトの名無しさん2017/03/03(金) 13:28:10.50ID:tq5Z/bcV
目的を満たせたら何でもいいと思う
0437デフォルトの名無しさん2017/03/03(金) 13:46:50.64ID:chSe/5JU
ユーザーって言えばよかったか?
まあ大体わかるだろ
0438デフォルトの名無しさん2017/03/03(金) 19:08:02.84ID:CaPEWOUZ
作成依頼
組み合わせとなりますが、おもいつかない、。。

たとえば、integer配列1,2,3を渡した際、
添字の上限とし組み合わせを出力したい。

上記引数を例とした場合の結果期待は以下
000 001 002 003
010 011 012 013
020 021 022 023
100 101 102 103
110 111 112 113
120 121 122 123

どなたかたすけておくれ。
0439デフォルトの名無しさん2017/03/03(金) 19:09:47.91ID:CaPEWOUZ
>>438
なお、引数としては1,3,10のようなパターンはあります
0440デフォルトの名無しさん2017/03/03(金) 19:21:21.10ID:6kLe4aCy
もちろん引数の配列の要素数は可変なんだよな?
0441デフォルトの名無しさん2017/03/03(金) 19:32:18.04ID:CaPEWOUZ
>>440
可変です。最大は5を予定しています。
0442デフォルトの名無しさん2017/03/03(金) 19:34:19.05ID:6kLe4aCy
よし後は頼む
0443デフォルトの名無しさん2017/03/03(金) 19:49:15.78ID:CaPEWOUZ
>>442
固定に変更します。おねがいします
0444デフォルトの名無しさん2017/03/03(金) 19:59:38.21ID:hxiWJWmX
>>438
ルールがわからん
111 があるのに 222 がない理由は?
0445デフォルトの名無しさん2017/03/03(金) 20:01:21.51ID:6kLe4aCy
>>443
オイオイいつから俺がお前より有能だと錯覚していた?
言っとくが俺にできるのはせいぜい要素数2つまでだぜw
0446デフォルトの名無しさん2017/03/03(金) 20:03:18.63ID:enWtQeEf
>>438
「添字の上限とし組み合わせを出力したい」
ここがわからん
0447デフォルトの名無しさん2017/03/03(金) 20:04:44.21ID:CaPEWOUZ
>>444
失礼しました。
222はあります。
1,2,3を渡したばあいの期待出力の最後は
234になります。
0448デフォルトの名無しさん2017/03/03(金) 20:24:44.72ID:hxiWJWmX
>>447
ごめん、意味わからんから俺は抜けるわ
0449デフォルトの名無しさん2017/03/03(金) 20:31:27.93ID:CaPEWOUZ
>>448
ごめんなさい、222は無しでした、
もう一回かきなおしますわ
0450デフォルトの名無しさん2017/03/03(金) 20:44:35.22ID:y06gdcdw
適当に再帰してループ回して終わり
0451デフォルトの名無しさん2017/03/03(金) 20:57:54.82ID:GTe30Tvn
0は渡してないのに000はあるの?
0452デフォルトの名無しさん2017/03/03(金) 20:58:41.09ID:GTe30Tvn
>>447
ふぁ?
0453デフォルトの名無しさん2017/03/03(金) 20:59:57.67ID:VQIDQ9VP
>>439
10って何よ
桁数が多い時はどうすんの
0454デフォルトの名無しさん2017/03/03(金) 21:01:51.65ID:1KjTKMUS
みんな、こんな文章によく付き合ってられるな。
0455デフォルトの名無しさん2017/03/03(金) 21:02:11.95ID:VQIDQ9VP
>>447
わけわからん
1、2、3の時は333が最大じゃないのか?
4はどこから出てきた

もう一度慎重に、1、2、3の時の出力を間違いなく全部書いてくれ
0456デフォルトの名無しさん2017/03/03(金) 21:04:16.97ID:6kLe4aCy
こんな時こそプロの出番じゃね?
0457デフォルトの名無しさん2017/03/03(金) 21:04:56.95ID:VQIDQ9VP
俺の想像
各桁は独立してて、それぞれの最大値が指定されてる
0458デフォルトの名無しさん2017/03/03(金) 21:11:57.27ID:GTe30Tvn
VBAじゃなくてExcelでコンカチして自分で作ったらいいよ
=CONCATENATE(A1,B1,C1)
0459デフォルトの名無しさん2017/03/03(金) 21:16:38.12ID:EijqyPIy
競プロとかか?
0460デフォルトの名無しさん2017/03/03(金) 21:23:59.69ID:VQIDQ9VP
>>438
これでいいんだろ

Sub macro1()
  A = Array(1, 2, 3)  ' ここで配列を初期化する
  
  Columns("A:A").NumberFormatLocal = "@"
  r = 1
  For c0 = 0 To A(0)
    For c1 = 0 To A(1)
      For c2 = 0 To A(2)
        Cells(r, 1) = c0 & c1 & c2
        r = r + 1
  Next c2, c1, c0
End Sub
0461デフォルトの名無しさん2017/03/03(金) 21:24:30.68ID:RzEn5cA/
>>438
1,2,3を渡してなんで0が出力にあるのか?
0462デフォルトの名無しさん2017/03/03(金) 21:25:30.79ID:RzEn5cA/
再帰が良いんじゃね
0463デフォルトの名無しさん2017/03/03(金) 21:42:42.10ID:6kLe4aCy
クラスとかインターフェース?とか使わないのかよ
0464デフォルトの名無しさん2017/03/03(金) 21:56:35.22ID:IkLX7Y6s
>>463
使うよ
急にどうした?
0465デフォルトの名無しさん2017/03/03(金) 21:59:08.48ID:a4L2lQlc
>>460
すばらしい!たすかりました。
これで妻の出産立ち会いにまにあいそうだ
0466デフォルトの名無しさん2017/03/03(金) 22:00:51.72ID:6kLe4aCy
>>464
プロの人に聞いてるからお前は悔しがる必要ないよw
0467デフォルトの名無しさん2017/03/03(金) 22:13:32.33ID:IkLX7Y6s
>>466
そうなんだね
うまくいくといいねw
0468デフォルトの名無しさん2017/03/03(金) 22:24:44.83ID:GTe30Tvn
Power PivotのCROSSJOIN
0469デフォルトの名無しさん2017/03/03(金) 22:29:08.90ID:EijqyPIy
単に、

r = 0
(i, j, k の For)
B(r) = Join(Array(i, j, k), "")
r = r + 1
Next

でいいってことか
0470デフォルトの名無しさん2017/03/03(金) 22:31:49.14ID:EijqyPIy
でも可変長だと厳しいな
0471デフォルトの名無しさん2017/03/03(金) 22:31:52.11ID:5jvwG3vs
>>469
個数可変に対応できないんじゃね
0472デフォルトの名無しさん2017/03/03(金) 22:32:06.27ID:y06gdcdw
要素数不定の場合に対応してない
やり直し
0473デフォルトの名無しさん2017/03/03(金) 22:37:53.95ID:a4L2lQlc
>>470
要素数固定の要件に変更したので
充分なりたちそうです
ご指摘ごもっともです。
0474デフォルトの名無しさん2017/03/03(金) 22:41:05.57ID:a4L2lQlc
>>472
たしかにそうなんですよね。
0475デフォルトの名無しさん2017/03/03(金) 22:42:39.77ID:EijqyPIy
さすがに可変長だとモジュールにコードを書かなきゃならないな
0476デフォルトの名無しさん2017/03/03(金) 22:56:22.16ID:VQIDQ9VP
最大5つならモジュールは必須じゃない
0477デフォルトの名無しさん2017/03/03(金) 23:00:32.56ID:EijqyPIy
でもくやしいから無制限にしたいじゃんね
0478デフォルトの名無しさん2017/03/03(金) 23:02:58.54ID:EijqyPIy
>>476
俺が言っている「モジュールにコードを書かない」っていうのは
イミディエイトウィンドウだけで片付ける、って意味だけど、そうだよね?
0479デフォルトの名無しさん2017/03/03(金) 23:11:42.15ID:VQIDQ9VP
>>478
もちろんわかってるよ
再帰を使わずにマルチステートメントだけで書く
でもよく考えたら1行の文字数制限に引っかかるかも
0480デフォルトの名無しさん2017/03/03(金) 23:20:35.66ID:EijqyPIy
>>438で指定された長方形の形がわからん
配列の最後の数が3だと0,1,2,3の4通りだから4列にする、という仕様か?
0481デフォルトの名無しさん2017/03/03(金) 23:25:09.15ID:a4L2lQlc
>>480
ご指摘ありがとう
460のコードで解決していますが、
単に見やすく区切っただけです。

そう考えると460はエスパーだな
0482デフォルトの名無しさん2017/03/03(金) 23:33:56.14ID:hmuWFGY/
可変長でも二重ループでこと足りるだろ
再帰とかダッサ
0483デフォルトの名無しさん2017/03/03(金) 23:37:06.12ID:6kLe4aCy
そんなのいいからクラス使って書いてくれよ
大好きなんだろ?オブジェクト指向
0484デフォルトの名無しさん2017/03/03(金) 23:39:49.44ID:EijqyPIy
>>482
マジで?
できるかな・・・
0485デフォルトの名無しさん2017/03/03(金) 23:42:22.56ID:S2n0JCmG
>>483
コンテキストを読めない最高のバカ
0486デフォルトの名無しさん2017/03/03(金) 23:48:19.00ID:8zWeqOUQ
>>482
コード出してからほざいたら?
0487デフォルトの名無しさん2017/03/03(金) 23:51:21.01ID:EijqyPIy
二重ループでできるかどうかはさておき
再帰はカッコいいだろう
0488デフォルトの名無しさん2017/03/03(金) 23:57:36.93ID:hmuWFGY/
>>484
基数変換を各桁で基数が異なるものとして拡張するだけ
秒のデータから時分秒を抽出するときと同じ感覚だな
これはループ1回で書ける
後は0から可能な最大値までインクリメントして↑を実行するだけ
0489デフォルトの名無しさん2017/03/04(土) 00:20:57.93ID:00KaTwkG
ieの制御に関して質問です。
あるwebページに複数のリンクがあります。その複数リンク先のページのソースをそれぞれ取得したいのですが、リンク先ページを開かなくともソースを取得できる方法はありますか。
0490デフォルトの名無しさん2017/03/04(土) 00:24:27.12ID:53W8X94X
HTTP GETリクエスト
0491デフォルトの名無しさん2017/03/04(土) 00:30:08.61ID:KnUkpjtX
>>445
w
0492デフォルトの名無しさん2017/03/04(土) 00:37:26.38ID:gtIbLVZp
>>462
再帰だと添字の上限が1,2,3を渡しても3,3,3になってしまうようなコーディングしかおもいつかなかったんです。。。
0493デフォルトの名無しさん2017/03/04(土) 00:38:15.23ID:gtIbLVZp
>>457
そうです!
0494デフォルトの名無しさん2017/03/04(土) 00:41:18.75ID:EGaqvD7z
>>488
なるほど
(a, b, c, d) が渡されたら
a+1, b+1, c+1, d+1 が基数になるわけね
0495デフォルトの名無しさん2017/03/04(土) 00:53:27.23ID:n0aV3kNq
>>489
俺の知ってる方法は↓
1) URLDownloadToFile APIでソースをファイルに落としてからVBAで読み込む
2) MSXML2.XMLHTTPオブジェクトでソースをを取得する
0496デフォルトの名無しさん2017/03/04(土) 00:54:19.06ID:00KaTwkG
>>495
ありがとうございます!
0497デフォルトの名無しさん2017/03/04(土) 01:03:16.80ID:Zd61TdHs
再帰を使わずに配列長が可変なのを作ってみた
ちょっと遅いけど、こんなもんでいいんじゃないかな
あと、実行前にA列の書式を文字列にしといてな

Option Base 1
Sub macro1()
  a = Array(1, 2, 3)  ' 配列を設定
  U = UBound(a)
  For i = 1 To U
    Z = Z & "9"
    F = F & "0"
  Next
  For i = 0 To Z
    W = Format(i, F)
    c = 0
    For j = 1 To U
      If Mid(W, j, 1) * 1 > a(j) Then Exit For
      c = c + 1
    Next
    If c = U Then r = r + 1: Cells(r, 1) = W
  Next
End Sub
0498デフォルトの名無しさん2017/03/04(土) 01:11:29.62ID:Zd61TdHs
String関数の存在を忘れてた
年を取るとこういうのがすぐ出てこなくなって困るわ

Option Base 1
Sub macro1()
  a = Array(1, 2, 3)
  U = UBound(a)
  Z = String(U, "9")
  F = String(U, "0")
  For i = 0 To Z
    W = Format(i, F)
    c = 0
    For j = 1 To U
      If Mid(W, j, 1) * 1 > a(j) Then Exit For
      c = c + 1
    Next
    If c = U Then r = r + 1: Cells(r, 1) = W
  Next
End Sub
0499デフォルトの名無しさん2017/03/04(土) 01:15:03.90ID:Zd61TdHs
よく見直したら、わざわざ変数に代入する必要なかったな
大したことないコードを何度も張ってすまん

Option Base 1
Sub macro1()
  a = Array(1, 2, 3)
  U = UBound(a)
  F = String(U, "0")
  For i = 0 To String(U, "9")
    W = Format(i, F)
    c = 0
    For j = 1 To U
      If Mid(W, j, 1) * 1 > a(j) Then Exit For
      c = c + 1
    Next
    If c = U Then r = r + 1: Cells(r, 1) = W
  Next
End Sub
0500デフォルトの名無しさん2017/03/04(土) 04:37:57.22ID:JIqsuMSk
Option Explicit

Dim cnt

Public Sub permutation()
Dim tmpAry
cnt = 0
tmpAry = Array(1, 4, 3, 5)
Call recursive(tmpAry, 1, "")
End Sub

Public Sub recursive(ary, level, output)
Dim i

If level > UBound(ary) + 1 Then
cnt = cnt + 1
Debug.Print cnt, output
Else
For i = 0 To UBound(ary)
Call recursive(ary, level + 1, output & ary(i))
Next i
End If
End Sub
0501デフォルトの名無しさん2017/03/04(土) 07:52:32.24ID:7yviaXI5
>>488
Modと割り算を繰り返し行う忌避したくなるプログラムにならないか懸念
0502デフォルトの名無しさん2017/03/04(土) 11:29:38.18ID:BjLHIgDA
>>500
おお、再帰パターンすね
0503デフォルトの名無しさん2017/03/04(土) 12:39:08.86ID:dl8TEp12
再帰って鏡に鏡を映しているようでコワイ・・。
0504デフォルトの名無しさん2017/03/04(土) 12:49:31.79ID:YssZJcob
夜中に再帰してるとたまに予想より一回だけ多かったり
挙動がおかしい呼び出しが混じってたりするよな?
存在するはずのない呼び出し…
再帰に遊び半分で手を出すと恐ろしい目にあうぞ
0505デフォルトの名無しさん2017/03/04(土) 12:59:10.31ID:WGhXcN9C
>>504
無限に呼び出しされるし、ひとつだけ違う挙動してたりな
0506デフォルトの名無しさん2017/03/04(土) 13:18:26.39ID:aE/wnzST
それはコードが悪いだろ
0507デフォルトの名無しさん2017/03/04(土) 14:34:08.41ID:htZXnpcL
エクセルって高負荷な処理させると不安定になりやすいしな
0508デフォルトの名無しさん2017/03/04(土) 15:13:51.09ID:aE/wnzST
大抵の場合はExcelの問題じゃなくて設計の問題だろ。
どういう処理をしようとしてるのかを聞けば、論理的には可能だけどそれやったら危険だろって話がゴマンとある。
0509デフォルトの名無しさん2017/03/04(土) 16:33:57.45ID:7yviaXI5
ゴマン
0510デフォルトの名無しさん2017/03/04(土) 18:08:27.67ID:4MV514cj
高負荷な処理って言うけどセルとか介さなければそこまで変わんないんじゃないの?
0511デフォルトの名無しさん2017/03/04(土) 18:24:15.36ID:KiuHqK+P
大半のVBAerはそういうの気にしないでセルいじり倒すし
0512デフォルトの名無しさん2017/03/04(土) 18:32:22.89ID:EGaqvD7z
関係ないけど新たにブックを開くとイミディエイトウィンドウ上の変数が初期化されてしまうのやめてほしい。
さっきの変数の値なんだったかな、と思ってDebug.Printするときれいさっぱりなくなっているのが悲しい。
0513デフォルトの名無しさん2017/03/04(土) 19:06:48.03ID:oM2Bzul7
>>512
いいこと教えてやろう

イミディエイトウィンドウではDebugは付けなくていいんだよ
あとPrintの短縮形は?

つまり、変数aの内容を表示したい時は
?a
だけでいい
0514デフォルトの名無しさん2017/03/04(土) 19:31:02.87ID:4MV514cj
>>511
まあな
ここでもクリップボード使い多いし
0515デフォルトの名無しさん2017/03/04(土) 19:48:09.54ID:4HLwAPth
大抵の人間にしてみたら、仕事の目的が達成されるならそれが高負荷とかどうとか関係ない
0516デフォルトの名無しさん2017/03/04(土) 19:53:15.26ID:EGaqvD7z
>>513
0517デフォルトの名無しさん2017/03/04(土) 22:23:51.48ID:2aaVhMso
なんかお前らを見てるとエクセルってのは貧者のemacsなんだなってつくづくだぜ
0518デフォルトの名無しさん2017/03/04(土) 22:25:52.83ID:0X5pfc4w
失礼します
Excelマクロで、あるセルを選択したらそれを決まった場所(絶対参照)に代入して、その結果得られた式がはじめに選択したセルの左にくるので
その値を保存するというプログラムを書こうとしているのですが、1度絶対参照をしてしまうとはじめの選択した位置に戻ることはできないのでしょうか…
初期選択セルから定位置のセルを経由して再び元のセルに戻るプログラムがわかりません…
0519デフォルトの名無しさん2017/03/04(土) 23:00:18.49ID:0X5pfc4w
解決しました
0520デフォルトの名無しさん2017/03/04(土) 23:00:45.28ID:Zd61TdHs
>>518
説明が下手すぎて何が聞きたいのかさっぱりわからん

けど、あんたのやりたいことは簡単にできる、これは確信が持てる
0521デフォルトの名無しさん2017/03/05(日) 00:14:50.83ID:xJ+x/kOi
お年寄りって読解力が低いんですね
0522デフォルトの名無しさん2017/03/05(日) 00:25:20.60ID:T6sYeFJI
全く論理的じゃない文章の意味を読み取るのはそれはそれで一種の能力だろう。
でもそれを読解力とは言わないよね。
0523デフォルトの名無しさん2017/03/05(日) 00:29:18.52ID:SMp0F4mM
お前の気持ちなんか知らんわ同意を求めるなよ
論理性のかけらもない心情の吐露だな
0524デフォルトの名無しさん2017/03/05(日) 01:31:29.14ID:f1XixyjT
>>522が正論だろ
>>518の文章は酷すぎ
0525デフォルトの名無しさん2017/03/05(日) 02:13:37.62ID:/2H2oq+k
少しのミスもないような論理的な文章しか読めないなら2chやめろよ…
0526デフォルトの名無しさん2017/03/05(日) 03:05:09.73ID:v/i32huX
0527デフォルトの名無しさん2017/03/05(日) 03:18:17.60ID:d0KLgtk9
>>525
また2ちゃんに戻ってこれますようにw
0528デフォルトの名無しさん2017/03/05(日) 07:55:16.92ID:T6sYeFJI
この文章は酷すぎる→少しのミスも許されないんですか?!

老人の繰り言を聴く会かよ
0529デフォルトの名無しさん2017/03/05(日) 11:31:42.67ID:DQnD+5PQ
人に教えを乞うなら読みやすいレスにしないとまともに返事来ないのは当たり前やん
流れの早いスレじゃねえんだから推敲ぐらいしろ人間のクズが
0530デフォルトの名無しさん2017/03/05(日) 15:28:57.22ID:iWxTBjQU
>518みたいなひどい日本語を読み解く楽しみというのも無いわけではない。
回答が義務付けられてるわけじゃないんだから、
そういう事が苦にならない人だけ答えりゃいいんだよ。
0531デフォルトの名無しさん2017/03/05(日) 17:20:50.93ID:hrn2oTcj
質問があります。
ブックAからブックBを開き、ブックAのマクロでブックBの"Sheet1"のA1セルの値を変更します。
このマクロには続きがあり、ブックBのA1セル変更後には他の処理が書かれています(ブックAの事後処理と呼ぶことにします)。

ブックBの"Sheet1"にはWorksheet_Changeがあり、この処理が開始されます。
ブックBのWorksheet_Changeが完了するまで"ブックAの事後処理"は開始されません。

私が希望する動作は、ブックAがブックBのセルを書き換えたら、すぐさまブックAの事後処理を開始してほしいのですが、
実際の動作は、ブックAがブックBのセルを書き換えたら、ブックBのWorksheet_Changeが完了するまでブックAの事後処理を待っている、という状況です。

試しに、ブックBを別プロセスで起動して、ブックAからブックBのセルを書き換えてみても状況は変わらずです。
やはり、ブックBのWorksheet_Changeの完了を待ってしまっています。

私が望む動作にするにはどうしたらよいでしょうか?
0532デフォルトの名無しさん2017/03/05(日) 17:33:15.05ID:u/xcfN5N
イベントの順序に依存するような設計にしちゃダメ
VBAerはほぼ全員が素人だから仕方ないけどプロはイベントの順序に依存する処理を書いたら解雇される
つまりこの場合の正解はそんな順序に依存する設計がそもそも間違いだったのではないかというポイントまで戻って考え直すことだね
決してやってはいけない選択はどうしてもワガママを通してイベントの順序に依存させたいと躍起になってハックコードを書くこと
これはもう最悪中の最悪だ
0533デフォルトの名無しさん2017/03/05(日) 17:34:47.89ID:4pcX39bh
>>518>>531は同じひとかな
0534デフォルトの名無しさん2017/03/05(日) 17:39:29.55ID:FAXQq1mx
>>531
別プロセスで起動したブックBへの値設定ってどうやったの?
0535デフォルトの名無しさん2017/03/05(日) 17:44:34.39ID:hrn2oTcj
>>532
んん・・・。確かに素人です。
すいませんが、イベントの順序に依存するのの何が悪いのか理解できません。
Aの処理の後にBを処理して、その後にcを処理して・・・って普通のことじゃないんですか???

何か参考になるサイトありますか?
あるいはこの検索ワードでググれとかありましたら教えてください。

>>533 違う人です。
0536デフォルトの名無しさん2017/03/05(日) 17:49:34.01ID:hrn2oTcj
>>534

本スレの上の方にあったものを参考にしました。

Dim xlApp As Application
Set xlApp = CreateObject("Excel.Application")
xlApp.Visible = True
Set wb = xlApp.Workbooks.Open("C:\test.xlsm")
と事前に別プロセスで開き、そのブックをwbとしておき、

wb.Worksheets("Sheet1").Cells(1, 1) = 1
で値を設定しています。
0537デフォルトの名無しさん2017/03/05(日) 18:00:53.08ID:u/xcfN5N
>>535
もうすでに君の手元で問題が起きてるだろ

イベントってのは
この処理の後になんか出来るけど具体的に何やるかは知らんし知りたくもない
だからオブザーバーの方で勝手にやりたいことを登録しといてよ
俺はもう細かい面倒見ないからこっちに迷惑だけはかけんなよ
っていう要求がある時に使うもの

やりたいことが最初からわかってるならイベントなんか要らない
Sub main()
Call A()
Call B()
Call C()
End sub
これで十分だろ

何をやるかわからないからイベントが必要なんだよ
何をやるかわからないのにその順序に依存したらあっという間に破綻するのは目に見えてるだろ
だって何をやるかわからないんだぜ
0538デフォルトの名無しさん2017/03/05(日) 18:11:28.81ID:SMp0F4mM
>>537
相変わらず長々と見当違いな事をw
素人だからって誰もが皆お前の頓珍漢なオレオレ理論につきあってあげる訳じゃないよw
0539デフォルトの名無しさん2017/03/05(日) 18:15:58.60ID:u/xcfN5N
>>538
茶化すぐらいしか能のない素人は黙りなよ
意見があるなら論理的に
それがプログラム板での最低限のルールだろ
0540デフォルトの名無しさん2017/03/05(日) 18:17:05.13ID:f1XixyjT
こういう嫌味なVBA山の大将は
変なコード書かなくても解雇される
0541デフォルトの名無しさん2017/03/05(日) 18:22:03.85ID:hrn2oTcj
>>537
私にはちょっと難しいです。

例えば、ブックBのWorksheet_ChangeでA1セルの値が1の場合は処理X、A1セルの値が1以外の場合は処理Yを行う、という場合、
ブックBのWorksheet_Changeの中で処理Xか処理Yを選択するのではなく、
ブックAの方で処理Xか処理Yを選択させるほうが良いということですか?
0542デフォルトの名無しさん2017/03/05(日) 18:33:12.46ID:u/xcfN5N
>>541
BのWorksheet_Changeに登録されているイベントの処理内容に依存した処理をAに書くなと言っている
じゃあどう書くべきなんだってのは対面している問題次第だ

自分が本当にやりたいことがなんなのか考えるんだ
それはイベントへの割り込みではないはずだ
イベントへの割り込みは考えられる手段の1つでしかないはずだ
ただ単にイベントに割り込みたいのではなく他に目的があるはずだそうだろ
0543デフォルトの名無しさん2017/03/05(日) 18:39:57.74ID:SMp0F4mM
>>542
いやお前が質問の意図を考えろよw
なんでも覚えたばかりのコーディング論を適用してみたい気持ちは分からんでもないがw
プロってそんなんじゃ通用しないよねw
0544デフォルトの名無しさん2017/03/05(日) 18:42:11.00ID:u/xcfN5N
>>543
>>539
かわいそうだけど次からはスルーするね
0545デフォルトの名無しさん2017/03/05(日) 18:47:03.89ID:SMp0F4mM
>>544
俺はお前が見当違いなレスをする度に馬鹿にして笑ってあげるよw
優しいからね俺w
0546デフォルトの名無しさん2017/03/05(日) 18:48:18.37ID:FAXQq1mx
>>532
AはBに依存しないように見えたけど?

>>531どうなの?
0547デフォルトの名無しさん2017/03/05(日) 18:49:39.88ID:Nxw6KM66
まずはブックBのworkseet_changeイベントで呼び出してる処理をブックAのほうでどうにかできないのか?ってところだよね
ブックBの方を変更できれば話は早いが
0548デフォルトの名無しさん2017/03/05(日) 18:58:23.78ID:hrn2oTcj
>>542
やはり私にはかなり難しいです。まだ消化できていません。もらったレスと自分のやりたいことをじっくり考えてみます。
丁寧にありがとうございます。

>>537
>イベントってのは
>この処理の後になんか出来るけど具体的に何やるかは知らんし知りたくもない
>だからオブザーバーの方で勝手にやりたいことを登録しといてよ
>俺はもう細かい面倒見ないからこっちに迷惑だけはかけんなよ
>っていう要求がある時に使うもの

例えば、ブックAの処理を軽くする目的で今ブックAで行っている一部の処理をブックBに丸投げしたいとします。
その場合、ブックAはブックBの処理が終わるとか関係なく、続く処理を行いたい。
こういった場合はどのようにしてブックBの処理を行えばいいのでしょうか?
0549デフォルトの名無しさん2017/03/05(日) 19:04:34.47ID:hrn2oTcj
>>547
はい。ブックAの方でどうにかできそうです。

>>546
AはBに依存しません。BはAによって書き換えられた内容によってその後の処理が変わります。


今ブックBで処理していることをブックAにさせることで問題は解決できそうですが、
>>548にも書きましたが、
呼び出した処理が完了したかどうかに関わらず次の処理を行いたいという場合に何かいい方法があるのかな、ということが気になりだしました。
ありましたら教えてください。
0550デフォルトの名無しさん2017/03/05(日) 19:32:52.40ID:HclWmK3V
例えばwscript.shell.runで、ブックBにVBAでやらせてる処理をvbscriptに置き換えてやらせるのはどうかな
処理の終了とか戻り値は考えないといけないけど、ブックAの方はそのまま処理が進むよ
0551デフォルトの名無しさん2017/03/05(日) 19:33:03.35ID:u/xcfN5N
>>548
イベント関係ねえじゃん
Bのセルに値を書き込むだけのサブプロセスを実行
適当にスクリプトを生成するのが簡単だろう
VBAで並行処理はめんどくさいぞ
0552デフォルトの名無しさん2017/03/05(日) 19:54:52.11ID:SMp0F4mM
頭の悪い>>551がやっと少し質問を理解したようで何よりだな(ニッコリ
0553デフォルトの名無しさん2017/03/05(日) 19:55:09.39ID:hrn2oTcj
>>550>>551
今の私には理解できませんが、両者は同じ内容のことを書き込まれているのでしょうか?
参考にさせてもらい今後に活かしたいと思います。ありがとうございます。

今自分で試行錯誤しているのですが、なんかいい感じです。

ブックAで別プロセスブックBを開き、
→wb.Worksheets("Sheet1").Cells(1, 1) = 10でブックBのセルの値を書き換え、
→xlApp.OnTime Now + TimeValue("00:00:00"), "開かれる側OnTime用" でブックAからブックBのマクロの実行予約(予約といいつつ即実行)
→実行予約後すぐにブックAマクロの続く処理が行われる(実行予約したブックBのマクロが完了しなくても)。

これってどうですかね?今までブックAで行っていた一部の処理を、ブックBの"開かれる側OnTime用"というプロシージャに買いておく(このプロシージャはブックAにより予約実行される)。
これで、ブックAはブックBに処理を丸投げできるし、ブックBの処理を待たずに引き続く処理が行えるような雰囲気ですが、何か問題ありそうですかね?
0554デフォルトの名無しさん2017/03/05(日) 19:57:59.53ID:vDv0kIMM
>>594
BはAから書き換えられたら直ちに再計算する必要があるのか?
Aの処理が終わってから、又はAの任意のタイミングでBの処理を実施するのではダメなのか?
VBAで並行処理なんて書くのは自殺行為だぞ。

俺がイベント処理を書くときは、必ず真っ先に
Application.EnableEvents = False
をやって、他のイベントは起こらないようにしてEnd Sub直前に
Application.EnableEvents = True
するようにしている。

その上で、Aのイベントの途中でBの処理も実行したい場合は、実行してほしいタイミングで(Application.Run())を使ってBのマクロを呼び出せば良い。
その為に、今Bのイベントに記載してあるマクロを標準モジュールに移して、Aのイベントからの呼び出しとBのイベントからの呼び出しを受けられるようにする必要がある。

少なくともこうすれば、コード画面上でも追跡できるようになるし、大半の課題は突破できるはず。
0555デフォルトの名無しさん2017/03/05(日) 20:07:30.89ID:7fOisySK
>>531
ブックBのイベントをdisableにして
ブックBのA1セルを更新
ブックAの事後処理をしてから
ブックAからブックBのワークシートチェンジを呼んで
ブックBのイベントをenableにする

もしかするとenableにしたらワークシートチェンジが呼ばれるかもしれない
その場合はブックAからワークシートチェンジを呼ぶのを止める
0556デフォルトの名無しさん2017/03/05(日) 20:10:29.16ID:hrn2oTcj
>>554
>BはAから書き換えられたら直ちに再計算する必要があるのか?
いいえ、ありません。Aの任意のタイミングで構いません。

並行処理ってそんな大変なんですね。ド素人が気軽に質問してしまいましたw

Application.Runも検討しましたが、今のところ>>553にも書いた別プロセスで開いたブック内のマクロをOnTimeすることで上手くいっているような感じですがいかがでしょう?
0557デフォルトの名無しさん2017/03/05(日) 20:10:38.16ID:u/xcfN5N
そういう込み入ったハックは後で収集がつかなくなるからヤメろ
VBAで並行処理したいなら素直にサブプロセス走らせろ
スレッド使いたいなら言語変えろ
0558デフォルトの名無しさん2017/03/05(日) 20:14:17.44ID:Nxw6KM66
OnTimeでどうこうするのはスゲーおすすめできないわ
0559デフォルトの名無しさん2017/03/05(日) 20:20:00.52ID:vDv0kIMM
>>556
OnTimeはマジでやめとけ!
Aの処理の途中でいきなり他のマクロが動き出すとか、時限爆弾仕掛けとるようなもんやろ
おとなしく安全なタイミングでApplication.Runしなさい。
0560デフォルトの名無しさん2017/03/05(日) 20:20:57.80ID:hrn2oTcj
>>555
これから出かけるので試せませんが、それで処理の順番は思い通りにできそうだと思います。
ブックBのイベントをEnableしてすぐにブックAのマクロに戻ってくるかどうかはわかりませんが。

>>557
込み入ったハックって>>553のことですよね。
確かにどツボにはまりそうです。既にW

>VBAで並行処理したいなら素直にサブプロセス走らせろ
>スレッド使いたいなら言語変えろ

何度もすいませんが、素直にサブプロセスを走らせるとは具体的にどのようにすればよいのでしょうか?>>551のことですか?
0561デフォルトの名無しさん2017/03/05(日) 20:23:46.34ID:hrn2oTcj
>>558-559
OnTime、よくわからないのですがなんかヤバそうですねW
別プロセスのブックBのOnTimeがAに影響するのでしょうか?


すいません出掛けてきます。
0562デフォルトの名無しさん2017/03/05(日) 21:00:47.78ID:vDv0kIMM
>>561
あぁ別プロセスか・・・並行処理の案としては素晴らしいと思うけどちょっと注意

恐らく今はこんな感じだと予想するが
'ブックA
sub Sub Worksheet_Change(ByVal Target As Range)
'〜省略〜
wb.Worksheets("Sheet1").Cells(1, 1) = 1
End Sub

'ブックB
Private Sub Worksheet_Change(ByVal Target As Range)
Application.OnTime Now() + TimeValue("00:00:00.1"), "TimerProc"
End Sub
Sub TimerProc()
'処理
End Sub
・ブックAで2回セルの書き換えが発生するとブックBの処理が2回実施されることになる
・ブックB単体で作業した時にChangeイベントでのデバッグが不可能になる。
といった問題が発生するので・・・次レスへ
0563デフォルトの名無しさん2017/03/05(日) 21:01:24.11ID:vDv0kIMM
>>562
続き
こうした方が良いと思います。

'ブックA
Sub Worksheet_Change(ByVal Target As Range)
'〜省略〜
wb.Parent.EnableEvents = False
wb.Worksheets("Sheet1").Cells(1, 1) = 1
wb.Application.Run "TimerStart"
wb.Parent.EnableEvents = True
End Sub

'ブックB
Sub TimerStart()
Application.OnTime Now() + TimeValue("00:00:00"), "TimerProc"
End Sub
Sub TimerProc()
'処理
End Sub
'(ユーザーからのイベントも必要であれば残す)
Private Sub Worksheet_Change(ByVal Target As Range)
TimerProc
End Sub
それではいてらしあー
0564デフォルトの名無しさん2017/03/05(日) 21:42:07.59ID:XXksFiTo
他人をバカにするだけの単芝さんはNG
0565デフォルトの名無しさん2017/03/05(日) 22:09:44.03ID:d0KLgtk9
>>552
ID:SMp0F4mM
は相手の批判がすなわち
自己承認でないことを知って欲しい。
マウンティングとしても物足りないw
0566デフォルトの名無しさん2017/03/05(日) 23:41:18.55ID:ZmSjTpIQ
>>502
>>500
実装してみたけど
引数の1,4.3.5の最大値5にきづられて5555ってのがでてくるみたいです。
0567デフォルトの名無しさん2017/03/05(日) 23:54:47.43ID:hTcTeYbC
たしかに、>>500は出力がかなりおかしいな
どう直せばいいのか俺にはわからんけど
0568デフォルトの名無しさん2017/03/06(月) 00:23:04.22ID:XmSdBKHb
句読点(、。,.)があるとセル内改行。
ただし20文字以内では改行しない
35文字以上だと「を」でも改行する

こういうのできますでしょうか
0569デフォルトの名無しさん2017/03/06(月) 00:33:07.18ID:tkAhRfWW
できますよ
0570デフォルトの名無しさん2017/03/06(月) 00:46:02.32ID:y6DQSA76
>>568
Replace(msg, "、" ,vbLf )と
len関数で条件分岐するだけじゃね?
0571デフォルトの名無しさん2017/03/06(月) 00:52:00.64ID:JpbHMjCr
インスターで句読点の場所探して、
スター昆布で句読点を改行コードに変換。
0572デフォルトの名無しさん2017/03/06(月) 00:52:53.46ID:y6DQSA76
>>570
21字以上で(、。,.)が同時にでてくるパターンもあるから
前レス却下w
0573デフォルトの名無しさん2017/03/06(月) 00:52:54.69ID:JpbHMjCr
↑ごめんReplaceの間違い。
0574デフォルトの名無しさん2017/03/06(月) 00:58:09.41ID:tkAhRfWW
>>572
自分でできるようなヒントを示してあげればいいんだから十分でしょ
まあ句読点を改行コードに変換したいわけではないと思うけど
0575デフォルトの名無しさん2017/03/06(月) 01:01:42.84ID:fdK1iXqS
>>568
出来ますよ
0576デフォルトの名無しさん2017/03/06(月) 01:36:28.31ID:nZy/zwfC
Sub macro1(s As String)
  t = "" '切り取った文字列
  w = 0 ' をの位置を覚えておく
  Do While Len(s) > 20
    c = Left(s, 1) '先頭の1文字を切り取る
    s = Mid(s, 2, Len(s))
    t = t & c
    If c = "を" Then w = Len(t)
    If c = "、" Or c = "。" Then
      If Len(t) > 35 Then
        If w = 0 Then
          Debug.Print t
        Else 'をで改行
          Debug.Print Left(t, w)
          Debug.Print Mid(t, w + 1, Len(t))
        End If
        t = ""
        w = 0
      Else
        Debug.Print t
        t = ""
        w = 0
      End If
    Else
    End If
  Loop
  Debug.Print s
End Sub
0577デフォルトの名無しさん2017/03/06(月) 01:36:45.37ID:nZy/zwfC
呼び出しテスト

Sub main()
  s = "「天は人の上に人を造らず人の下に人を造らず」と言えり。されば天より人を生" & _
    "ずるには、万人は万人みな同じ位にして、生まれながら貴賤上下の差別なく、万" & _
    "物の霊たる身と心との働きをもって天地の間にあるよろずの物を資り、もって衣" & _
    "食住の用を達し、自由自在、互いに人の妨げをなさずしておのおの安楽にこの世" & _
    "を渡らしめ給うの趣意なり。"
  macro1 (s)
End Sub
0578デフォルトの名無しさん2017/03/06(月) 01:37:19.08ID:nZy/zwfC
ごめん、なんか判定がおかしい
ちゃんと動かないわ
0579デフォルトの名無しさん2017/03/06(月) 01:40:53.86ID:nZy/zwfC
20文字以下かどうか判定するの忘れてるわ
なんか面倒になってきたんであとは誰かよろしく
0580デフォルトの名無しさん2017/03/06(月) 01:43:28.80ID:tkAhRfWW
おつかれ
でも読むのも疲れるしバグがどこにあるのかも見つけにくいよね

※今日の教訓※
適宜関数を分割して意図の伝わるコードにしましょう
IFのネストは用法・用量を守ってつかいましょう
0581デフォルトの名無しさん2017/03/06(月) 02:31:43.00ID:XmSdBKHb
たくさんレスがついてるー ありがとうございます
でも解決されてないー 
0582デフォルトの名無しさん2017/03/06(月) 07:46:19.03ID:MH85UCzw
ステートマシーン使えよ
0583デフォルトの名無しさん2017/03/06(月) 08:18:59.17ID:lfKjhBoG
これ句読点を改行コードに変換するんじゃなくて、句読点の後ろに改行コードを挿入する感じじゃねえの?
20文字と35文字の制限がなければ単純にsplitで行けるんだがね
for i = 1 to len(buf)
cntLen = cntLen + 1
temp = temp & mid(buf,i,1)
if cntLen >= 20 then
'句読点で改行
cntLen = 0
elseif cntLen => 35 then
'句読点とをで改行
cntLen = 0
end if
next i
指定の文字列見つけたら配列にtemp & vblfを代入
で、最後にjoin
スマホから書くのしんどいわ
0584デフォルトの名無しさん2017/03/06(月) 08:22:21.21ID:HrLL0Bzw
そんなもん使うほどのことじゃないでしょ
L = 0
For I = 1 To Len(S)
C = Mid(S, I, 1)
If ((C = "、" Or C = "。") And 20 < L) Or (C = "を" And 35 < L) Then
Debug.Print C & vbCrLf
L = 0
Else
Debug.Print C
L = L + 1
End If
Next
0585デフォルトの名無しさん2017/03/06(月) 10:16:56.49ID:Mw50S8+o
エクセルファイルのその時その時の状態をHTMLで書き出すマクロを作りたいのですが、
普通にSaveAsでそれをやると、開いているファイルがxlsm形式からhtml形式に変わってしまいます。

SaveCopyAsではファイル形式を選べず、強引に使うと中身がxlsm形式のまま拡張子だけhtmlに変わったファイルが作成されます。

SaveAsを二回使ってまたxlsm形式に戻すというのは既にやってみて、とりあえず巧く行きました。
しかし、マクロ実行の度に結構待たされることになりますし、いかにもドン臭いです。

何かよい方法はありますか?
0586デフォルトの名無しさん2017/03/06(月) 10:59:01.02ID:rSmA2qlL
作ってみた

Sub test()

Dim msg As String, arrChar
msg = "「天は人の上に人を造らず人の下に人を造らず」と言えり。されば天より人を生"

If 35 <= Len(msg) Then
 arrChar = Array("、", "。", ",", ".", "を")
ElseIf 20 <= Len(msg) Then
 arrChar = Array("、", "。", ",", ".")
Else
 Exit Sub
End If

Call 改行挿入(msg, arrChar)
MsgBox msg

End Sub
(続く)
0587デフォルトの名無しさん2017/03/06(月) 10:59:40.08ID:rSmA2qlL
(続き)

Private Sub 改行挿入(buf As String, arr)

Dim i As Long, j As Long
i = 1

Do While i < Len(buf) - 1 '1文字目から順にチェック(該当文字かどうか)

 For j = 0 To UBound(arr)

  If Mid(buf, i, 1) = arr(j) Then 'i文字目が該当文字ならば、そこにセル内改行を入れる
   buf = Left(buf, i) & vbLf & Mid(buf, i + 1)
   i = i + 1 '改行記号1文字が増えたので
  End If

 Next j

 i = i + 1

Loop

End Sub
0588デフォルトの名無しさん2017/03/06(月) 11:27:01.07ID:nZy/zwfC
35文字目までに句読点が出てこなくて「を」が複数あった場合、どこで切るかの条件が曖昧だな
極端なケースで2文字目と33文字目に「を」があった場合どっちで切るのか
あるいは両方とも切るか、切った後の長さでさらに場合分けするのか
05895852017/03/06(月) 11:48:49.62ID:Mw50S8+o
発行、publishメソッドで解決しました
0590デフォルトの名無しさん2017/03/06(月) 12:08:57.78ID:LM2QjYuF
文字列中から特定文字をカウントするのを二通りの方法でやってみた
・InStrのループ
・Len-Len(Replace)

下の方が速いだろうと踏んでたのに、逆に上の方が3倍程度速かったので驚いているなう
0591デフォルトの名無しさん2017/03/06(月) 12:35:05.15ID:lfKjhBoG
>>588
35文字目以降の最初の「を」じゃないの?
0592デフォルトの名無しさん2017/03/06(月) 12:47:52.35ID:HrLL0Bzw
>>588
> 極端なケースで2文字目と33文字目に「を」があった場合どっちで切るのか
どっちも切らない以外の解釈はないだろ
0593デフォルトの名無しさん2017/03/06(月) 13:42:35.96ID:nZy/zwfC
35文字を過ぎたら改行の条件が増えるんじゃなくて、
次の句読点までだと長すぎる行ができるから
その手前の「を」で切ってできるだけ35文字以下にするって解釈したんだけど
0594デフォルトの名無しさん2017/03/06(月) 14:08:18.32ID:LM2QjYuF
>>588
どっちも切らないんじゃない?
35字以上になってないんだから
0595デフォルトの名無しさん2017/03/06(月) 14:48:28.52ID:nZy/zwfC
以下、質問者不在の不毛な議論が200レス続く流れ
0596デフォルトの名無しさん2017/03/06(月) 16:34:17.60ID:yZ8uZiZj
>>593
だとしたらちょいと面倒か?
まあ、逆ループして文字数出して切り取ればいいだけなんだが
もしくはinstrって逆からのやつあったよね、たしか
ただ、ループ変数をいじらなきゃいけなくて気持ち悪い感じにはなるけど
0597デフォルトの名無しさん2017/03/06(月) 19:05:00.06ID:AmE/TnLR
>>596
お前の「気持ち悪い」は気持ち悪いものではないから気にすんなw
0598デフォルトの名無しさん2017/03/06(月) 19:08:14.67ID:yZ8uZiZj
>>597
そういうもん?
まあ別に必要がありゃやるよ
やらずにすむならやらない方法選ぶけどね
0599デフォルトの名無しさん2017/03/06(月) 19:28:55.39ID:AYI7ZDZ8
最近は宿題代行が流行ってるのか?
0600デフォルトの名無しさん2017/03/06(月) 20:25:58.06ID:7ST8giCc
単芝滅ぶべし
0601デフォルトの名無しさん2017/03/06(月) 21:54:53.02ID:fdK1iXqS
単芝は滅びぬ
0602デフォルトの名無しさん2017/03/07(火) 02:00:35.84ID:buHXdcTx
>>584
短くて良さげだったけど
これだと句読点を含んでるのに20文字以上の行が出来る可能性あるよね
20文字以上になってはじめて出てきた句読点で改行ならこれでいいんだろうけど
0603デフォルトの名無しさん2017/03/07(火) 05:09:30.00ID:Qa1FiFH0
>>602
そりゃそう言う仕様だし
>>593 もそうだけど20文字とか35文字以上の行があっちゃダメじゃなくてむしろ >>568 は20文字以下では改行しちゃダメって言ってるんだよ
0604デフォルトの名無しさん2017/03/07(火) 07:06:09.05ID:xbn3uKP2
>>603
Yes
0605デフォルトの名無しさん2017/03/07(火) 09:31:36.01ID:ULjmtl6H
整理すると、

1行が20文字以上、35文字以下になるように改行する
ます20文字以上の位置で最初に出てくる句読点で改行
句読点だけでは35文字をオーバーする場合は遡って手前の「を」で改行
それでもだめな場合は書いてないから放置(次の句読点か「を」まで改行できない)

こういうことじゃないの?
0606デフォルトの名無しさん2017/03/07(火) 09:57:21.36ID:GwnG8V+U
>>605
20文字以上で句読点による改行
35文字以上で条件に「を」を追加だと思ってた
確かにあの日本語だとどちらともとれる
0607デフォルトの名無しさん2017/03/07(火) 11:41:01.61ID:8bSuGpO3
不毛な仕様妄想議論をよそ目に、>>568は「折り返して全体を表示する」を知って万事解決したのであった。

というかこれじゃいかんのか?と思う。
0608デフォルトの名無しさん2017/03/07(火) 11:49:44.80ID:ULjmtl6H
>>607
それは内容と目的によるなあ
禁則処理だけだと読みにくくなったりするし
0609デフォルトの名無しさん2017/03/07(火) 12:17:45.67ID:Zr2bcZDd
>>608
なんで質問したやつでもないお前が仕切ってんだよw
0610デフォルトの名無しさん2017/03/07(火) 12:23:03.44ID:klY2+EUE
質問者不在で勝手に進むのがこのスレの平常運転
0611デフォルトの名無しさん2017/03/07(火) 14:33:57.36ID:buHXdcTx
>>603
>そりゃそう言う仕様だし
君の仕様はそうだけど>>568の仕様は違うだろww

input
“0123456789。0123456789。”

expected
“0123456789。
0123456789。”
0612デフォルトの名無しさん2017/03/07(火) 14:38:30.96ID:buHXdcTx
>>605
>1行が20文字以上、35文字以下になるように改行する
>ます20文字以上の位置で最初に出てくる句読点で改行

違うってww目的を考えろよ

“0123456789。0123456789。”
↑の文字列だったとして↓こんな結果が欲しいやつおるか?
“0123456789。0123456789
。”
0613デフォルトの名無しさん2017/03/07(火) 14:40:03.36ID:buHXdcTx
あ間違えた句点の後で改行だったな
0614デフォルトの名無しさん2017/03/07(火) 14:50:18.51ID:GwVAHVhm
まず、落ち着け w
0615デフォルトの名無しさん2017/03/07(火) 15:42:22.29ID:ZBceu+yH
>>612
>>568は「ただし20文字以内では改行しない」って書いてるぞ。
0616デフォルトの名無しさん2017/03/07(火) 16:06:04.62ID:buHXdcTx
>>615
プログラムでどう処理するかっていう視点で考えてるからそうなる
“ただし”の意味を考えなよ
>>568は結果が満たすべき条件を仕様として書いてる

input
“句読点(、。,.)があるとセル内改行。 ただし、20文字以内では改行しない。 追加の条件として一行が35文字以上だと「を」でも改行する”

↓こうじゃなくて
“句読点(、。,.)があるとセル内改行。 ただし、
20文字以内では改行しない。 追加の条件として一行が35文字以上だと「
を」でも改行する”

↓こう
“句読点(、。,.)があるとセル内改行。
ただし、20文字以内では改行しない。
追加の条件として一行が35文字以上だと「を」でも改行する”
0617デフォルトの名無しさん2017/03/07(火) 17:31:31.46ID:03VVqkRb
> 句読点(、。,.)があるとセル内改行。
> ただし、20文字以内では改行しない。

って、普通は「19文字で改行してる」と表現すると思うが。
0618デフォルトの名無しさん2017/03/07(火) 17:31:32.61ID:ZBceu+yH
>>616
よくわからんが、その二つで結果が違ってくる例をあげてくれ。
「20文字以内では...」ってのは文字全体の長さじゃなくて各行の行頭からの長さだよな。
0619デフォルトの名無しさん2017/03/07(火) 17:34:43.27ID:Iz+KYNb7
想像しすぎw
質問者の回答を待てよ。来ないかもだけど・・・
0620デフォルトの名無しさん2017/03/07(火) 17:43:30.57ID:ZBceu+yH
>>619 それもそうだな。

とりあえず俺のexpectedをあげておく。↓

吾輩は猫である。名前はまだ無い。どこで生れたかとんと見当がつかぬ。
何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。
0621デフォルトの名無しさん2017/03/07(火) 17:46:57.56ID:buHXdcTx
>>618
仕様を書いた文字列を使っただけで改行位置以外は2つとも文字列の中身は一緒
前者の出力じゃなくの後者の出力が期待結果
0622デフォルトの名無しさん2017/03/07(火) 17:48:42.20ID:FkDa/RBC
「を」が入ってないからサンプルとして適切じゃない
0623デフォルトの名無しさん2017/03/07(火) 17:49:05.76ID:buHXdcTx
改行ルールが3つあって上から順番に適用
普通に日本語読んだらそうなる
>>568はユーザーが書いた仕様記述としてはすごくまともな部類
0624デフォルトの名無しさん2017/03/07(火) 17:59:40.06ID:03VVqkRb
>>623
>>620の例だと、これが正解だと?
> 吾輩は猫である。
> 名前はまだ無い。
> どこで生れたかとんと見当がつかぬ。
> 何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。
0625デフォルトの名無しさん2017/03/07(火) 18:00:57.47ID:Y8T/JenZ
マシな方ではあるけどコーディングするには不完全すぎるんだよな
日本語の「以内」は数学的には以下と未満の両方の意味で使うし、
その20文字に句読点を含むかどうかも不明だし、鰹だし、ほんだし
0626デフォルトの名無しさん2017/03/07(火) 18:01:46.61ID:Y8T/JenZ
>>624
20文字以内で改行してるから不正解
0627デフォルトの名無しさん2017/03/07(火) 18:04:28.23ID:03VVqkRb
>>626
なら、これも不正解だよな
> 句読点(、。,.)があるとセル内改行。
> ただし、20文字以内では改行しない。
0628デフォルトの名無しさん2017/03/07(火) 18:09:54.71ID:6jXnf7y+
>>626
お前は正解を知っているのか?
0629デフォルトの名無しさん2017/03/07(火) 18:15:03.98ID:03VVqkRb
まあ、正直この話何が正解でもかまわないんだが、>>623みたいな奴がのさばるのが許せん
0630デフォルトの名無しさん2017/03/07(火) 18:16:56.27ID:ZBceu+yH
>>623
「ただし」という接続詞をどう解釈してるんだ?
0631デフォルトの名無しさん2017/03/07(火) 18:19:04.42ID:buHXdcTx
>>627
これ

>吾輩は猫である。名前はまだ無い。
>どこで生れたかとんと見当がつかぬ。
>何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。
>

一つ目の句点では改行しない
あとルール通りにやると最後にも改行が入る
0632デフォルトの名無しさん2017/03/07(火) 18:20:07.63ID:buHXdcTx
>>630
君がどう解釈してるのかまず説明してよ
0633デフォルトの名無しさん2017/03/07(火) 18:22:35.06ID:03VVqkRb
>>631
> 何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。
36文字あるんですが
0634デフォルトの名無しさん2017/03/07(火) 18:26:47.78ID:03VVqkRb
> 句読点(、。,.)があるとセル内改行。 ただし、
> 20文字以内では
が間違っていて
> 句読点(、。,.)があるとセル内改行。
> ただし、20文字以内では
を正しいとするなら、

> 吾輩は猫である。名前はまだ無い。
は間違っていて
> 吾輩は猫である。
> 名前はまだ無い。
が正しいんじゃないですかね
0635デフォルトの名無しさん2017/03/07(火) 18:27:24.24ID:ZBceu+yH
>>633
どこにも「を」がないからな。
改行するにもどこで?ってことになる。
0636デフォルトの名無しさん2017/03/07(火) 18:30:10.34ID:03VVqkRb
>>635
どこにも「を」がないのに、最後で改行が必要というのは>>568のどの条件になるんですか
0637デフォルトの名無しさん2017/03/07(火) 18:30:51.76ID:ZBceu+yH
>>634
君の解釈では、句読点があっても改行しないパターンて具体的にどんなの?
0638デフォルトの名無しさん2017/03/07(火) 18:32:06.27ID:buHXdcTx
>>636
1番目のルール

>>634
どうして?
「吾輩は猫である。名前はまだ無い。」は16文字だよ
0639デフォルトの名無しさん2017/03/07(火) 18:32:31.65ID:03VVqkRb
>>637
え、俺に質問?アンカーあってる?

> 句読点があっても改行しないパターンて
改行した結果、一行が20文字以内になる場合
0640デフォルトの名無しさん2017/03/07(火) 18:33:26.10ID:03VVqkRb
>>638
「句読点(、。,.)があるとセル内改行。」
は19文字なんですが
0641デフォルトの名無しさん2017/03/07(火) 18:48:26.92ID:03VVqkRb
>>623
飽きたんで最終レスしとくが、>>568は普通に読んだら20文字以下では改行しないと読む
そういうレス多数だろ?

お前の普通だけが違うんだよ
0642デフォルトの名無しさん2017/03/07(火) 18:56:58.74ID:EOptopIz
あのよお、どうでも良いじゃねーか。
こんなの技術的な問題じゃね―だろ。
工夫の問題じゃね―か。

こういう問題では質問者自身で現時点の案を言わないと意味が無い。
0643デフォルトの名無しさん2017/03/07(火) 18:58:15.03ID:ZBceu+yH
ははあ、
「 ただし20文字以内では改行しない」
の「 20文字」の解釈が違うんだな。

・結果として切り出された部分文字列の長さのこと
・行頭から数えた改行位置のこと

普通は後者だよ
0644デフォルトの名無しさん2017/03/07(火) 18:58:38.98ID:8bSuGpO3
もうすぐ100レス行くからおまいら頑張れ。

ちなみにここまでのマクロは、もし同じセルに複数回マクロを実行してしまった場合、改行だらけになるのが気になる。
俺ならやらかす。
0645デフォルトの名無しさん2017/03/07(火) 19:43:22.25ID:bzYWuaSV
気になるというか完全なるバグじゃないですかそれw
0646デフォルトの名無しさん2017/03/07(火) 19:43:34.73ID:cPblCgxW
いい加減、質問者出てきて収拾付けろ。ボケが
0647デフォルトの名無しさん2017/03/07(火) 19:44:38.19ID:ZBceu+yH
しかしこの議論の成り行きとは関係なく少し勉強になったぞ。

「ただし20文字以内では改行しない」という表現は厳密ではないので、人はこれを補おうとする。
その結果、

・ただし(長さが)20文字以内(の文字列)では改行しない

・ただし20文字以内(の位置)では改行しない

の二通りの解釈が生まれたというわけか。
最初に心に浮かんだ方に囚われてしまうな。
0648デフォルトの名無しさん2017/03/07(火) 19:50:57.96ID:GwVAHVhm
>>644
まあセルの内容だと改行が続く場合はひとつにまとめるとか、文章全体の前後の改行は削除するとかあった方がいいかもね
0649デフォルトの名無しさん2017/03/07(火) 20:09:15.20ID:GwVAHVhm
>>647
> 「ただし20文字以内では改行しない」
って書いてあるんだから(最終行を除いて)20文字以下の行があっちゃダメでしょ
どっちの方が望ましいかはまた別の話
0650デフォルトの名無しさん2017/03/07(火) 20:46:55.24ID:buHXdcTx
>>643
なるほどね

行頭から処理していくっていう手続き的な仕様として捉えるのか
結果として満たすべき宣言的な仕様として捉えるかの違いだね
どっちにも取れる可能性があるっていうのはわかったよ
0651デフォルトの名無しさん2017/03/07(火) 20:50:55.02ID:buHXdcTx
>>649
だね
0652デフォルトの名無しさん2017/03/07(火) 20:59:03.98ID:ZBceu+yH
>>649

・テキスト内にもともと改行がある
・20文字以外の行を句読点で切る際、複数の句読点があった場合にどれを選ぶかは仕様にない

の二通りの可能性
0653デフォルトの名無しさん2017/03/07(火) 21:02:58.49ID:ZBceu+yH
>>652
× 20文字以外の行
○ 20文字を超える行
0654デフォルトの名無しさん2017/03/07(火) 21:15:31.03ID:GwVAHVhm
>>652
> ・テキスト内にもともと改行がある
さすがになにも書いてないなら元々の改行は触らないのは常識でしょ

> ・20文字以外の行を句読点で切る際、複数の句読点があった場合にどれを選ぶかは仕様にない
以外?
以上のこと?
20文字以内云々って言ってるので20文字を越えていたら最短で改行すべきだろ
0655デフォルトの名無しさん2017/03/07(火) 21:27:27.18ID:buHXdcTx
>>654
>最短で改行すべきだろ

“吾輩は猫である。名前はまだ無い。どこで生れたかとんと見当がつかぬ。”(33文字)
をどこで改行するのがいいのか?

俺は一定のセル幅で可読性を高めるために改行したいという要望として捉えたから
1行の文字数が予測可能な文字数におおよそ収まるようにしたいんだろうなと思って上で書いたような理解になったわけよ
予測可能な文字数ってのが20文字とか35文字とかね
勉強になったわ
0656デフォルトの名無しさん2017/03/07(火) 21:42:36.01ID:xbn3uKP2
なんつーか、
WHERE

HAVING
の違い?
0657デフォルトの名無しさん2017/03/07(火) 21:49:30.97ID:+RCB0KzL
何を延々とバカなやりとりしてんの?
クライアントに問い合わせるか何パターンか作っておいて設定で切り替えるのが正解でしょ
どの仕様が正しいかなんて素人臭い雑談は見苦しいからいい加減やめてよ
0658デフォルトの名無しさん2017/03/07(火) 21:51:32.85ID:qhKxoT+R
EXCEL2013からSDIになったせいで、
sheet.copy
で新規ブックがアクティブになると
screenupdating=FALSEが無効化されて困ってます。
シートをファイル化する理由はそのシートのマクロもコピーしたいからですが、かなりの数の回すため、画面チラツキが激しすぎて死にそうなのです。

DoEventsやウインドウ最小化とか、無責任なことがマイクロソフトのページに書いてありますが案の定、なんの効果もありません。

助けてください!お兄様たち
0659デフォルトの名無しさん2017/03/07(火) 21:56:57.25ID:DSkj3bkk
質問です
ユーザーフォームにボタン1とボタン2を配置していて
ボタン1を一回押してないと、ボタン2を押しても反応しないようにするには
どうすればいいでしょうか?
0660デフォルトの名無しさん2017/03/07(火) 22:06:44.49ID:5OwyJdfm
>>659
初めはボタン2をプロパティでdisableにしておいて
ボタン1をクリックしたらenableにする
0661デフォルトの名無しさん2017/03/07(火) 22:20:57.95ID:lul5D9lf
>>659
処理を分離しているのに実行の順番が前提になっている処理は好ましくない。

ボタン2の処理は「実行はするが失敗として帰る」処理か、
「実行後にボタン1の処理を行ってもボタン1の処理に影響しない」処理が好ましい。
0662デフォルトの名無しさん2017/03/07(火) 22:23:36.27ID:buHXdcTx
>>657
いつもの自称プロさんかな
何パターンか作るなんてそれこそ素人だよ
0663デフォルトの名無しさん2017/03/07(火) 22:34:05.66ID:5OwyJdfm
>>661
エラーになるボタンをクリックできるのはユーザインタフェース的に良くないんじゃね?

例えばテキスト入力できるようになってて入力したらエラーでクリアされてしまうとか
0664デフォルトの名無しさん2017/03/07(火) 22:36:28.28ID:xbn3uKP2
「2ちゃんのスレで、質問に対してみんなで答える」
だけの行為がいつのまにか
「クライアントの出した仕様を業務として実装する」話にすり替わってるんだから、
自称プロ様は違うなw
0665デフォルトの名無しさん2017/03/07(火) 22:37:14.87ID:Kt+wucdj
ボタン1押したらボタン2有効化するのが無難だけど
クラスに値保持させてごにょごにょしたりもできるんじゃない?
0666デフォルトの名無しさん2017/03/07(火) 22:40:22.92ID:FQlmFR/g
俺ならボタン2は隠す
1をクリックしたらVisibleの方がユーザーが惑わない
0667デフォルトの名無しさん2017/03/07(火) 22:47:48.58ID:Kt+wucdj
>>663
押せなくする、以外ならTrueでなければ処理しないって言う風にするだろうからエラーにはならないんじゃね?
0668デフォルトの名無しさん2017/03/07(火) 22:51:28.74ID:5OwyJdfm
>>667
実行はするが失敗にする
と書いてある

ユーザに失敗した事をフィードバックしないと
ボタンクリックしても何が起きたかわからない
0669デフォルトの名無しさん2017/03/07(火) 22:53:35.05ID:5OwyJdfm
>>666
ボタンが現れる方が戸惑うのではないか?
人によるからアンケートとかとらないとなんとも言えないけど
0670デフォルトの名無しさん2017/03/07(火) 23:05:23.96ID:Qa1FiFH0
>>655
> 俺は一定のセル幅で可読性を高めるために改行したいという要望として捉えたから
ぼくがかんがえたさいきょうのしよう
はどうでもいい
0671デフォルトの名無しさん2017/03/07(火) 23:18:46.78ID:Kt+wucdj
>>668
失敗=エラーなのか
実行できないことを知らせるだけならいくらでもやりようあるんじゃね?
0672デフォルトの名無しさん2017/03/07(火) 23:19:30.54ID:lul5D9lf
>>668
エラーとしてフィードバックする時に「ボタン1を先に押してね」と誘導すればいい。

ボタン2が表示されているという処理外の挙動を根拠に「ボタン1は押されたはず」という先入観で処理を組むのはよろしくない。
ボタン2の処理に必要な情報が揃っている事をボタン2の処理内でチェックさせるのがベストかなぁ。
0673デフォルトの名無しさん2017/03/07(火) 23:24:03.58ID:5OwyJdfm
>>672
ボタン2をdisableにする方法でも
ボタン1がクリックされたかはチェックできる
0674デフォルトの名無しさん2017/03/07(火) 23:25:03.91ID:5OwyJdfm
>>671
わざわざクリックしたのにボタン1をクリックしろというユーザにとってムダな操作をさせるのは
ユーザエクスペリエンス的に良くないんじゃね
0675デフォルトの名無しさん2017/03/07(火) 23:32:58.28ID:lul5D9lf
>>673
ボタン1を押した後でボタン1の処理を手作業で全て無かったかの様に加工してもボタン2は押せるから、
ボタン2の表示状態だけで判断するのは非常に危険。

ボタンの表示/非表示はユーザーを誘導する為だけに切り替えた方が良く、処理に直接影響するのは好ましくない。
0676デフォルトの名無しさん2017/03/07(火) 23:36:16.33ID:LIbWykij
チェックはすれば良いしdisableにすれば良いね
0677デフォルトの名無しさん2017/03/07(火) 23:43:15.57ID:5OwyJdfm
>>675
だからチェックすれば良いんじゃね?
disableにするのとチェックするのは両立できる
0678デフォルトの名無しさん2017/03/07(火) 23:51:05.41ID:xbn3uKP2
「処理を分離しているのに実行の順番が前提になっている処理は好ましくない。」
っていう主張は一般的にはどうなんだろうね。

狙え、撃て!
撃て!狙え
0679デフォルトの名無しさん2017/03/07(火) 23:56:59.02ID:lul5D9lf
>>677
なんかもうヤケになってないか。自分で言っている事分かってないだろ。

>>678
発射した後に誘導するミサイルとかありますしおすし。

小銃の話でも、制圧射撃みたいに狙わずに行う射撃もある。
「狙わないと撃てない」という発想だと戦術が割と限定される。
0680デフォルトの名無しさん2017/03/08(水) 00:06:49.04ID:swHBt9ge
MyGamenModel
- flag
+ (get) CanDoSomething2()
return flag
+ DoSomething1()
set flag true
+ DoSomething2()
if not CanDoSomething2 raise error
else ...
+ (event) CanDoSomething2Changed()

こういうクラスを書いて後は適当にバインド処理を書いておしまい
0681デフォルトの名無しさん2017/03/08(水) 00:09:38.66ID:UPHdaWjZ
>>674
そりゃ要件によるだろ
0682デフォルトの名無しさん2017/03/08(水) 00:31:34.57ID:dPVIbm85
痛いのお...
0683デフォルトの名無しさん2017/03/08(水) 05:35:35.98ID:G0oe8ylD
>>679
そっちこそ

ボタン2の処理を実行出来なくなる状態になったらdisableすればいい

今回の件はその状態がボタン1をクリックしてないということだけだ
0684デフォルトの名無しさん2017/03/08(水) 05:37:14.13ID:G0oe8ylD
>>679
目的が違う例を挙げてどうする
課題が違えばアルゴリズムが変わるのは当然

何にでも対応できるプログラムなんてないよ
0685デフォルトの名無しさん2017/03/08(水) 05:39:34.68ID:G0oe8ylD
>>681
それをいったら
なんでも要件次第だな
順序に依存するのが良いとか悪いとかも要件次第
0686デフォルトの名無しさん2017/03/08(水) 05:53:21.02ID:SfsR/ULt
>>659
Button1をToggleButtonにするのはダメなのか?

If ToggleButon1.Value = True Then
 ボタン2をイネーブルにする or ボタン2.Visible = True
0687デフォルトの名無しさん2017/03/08(水) 06:01:48.40ID:G0oe8ylD
>>679
発射した後に誘導するにしても
少なくとも射程距離内になければ目的を達成できない

射程距離内に入るにはターゲットが決まっていて
射程距離内に入るという処理が必要

処理の順序があるのは当然のこと

発射しました→失敗しました
では弾薬が無駄になる
繰り返せば弾薬が切れて目的を達成できなくなる
0688デフォルトの名無しさん2017/03/08(水) 06:05:32.78ID:G0oe8ylD
処理を実行するのに前提条件が複数ある場合は
その前提条件が全て満たされた時にユーザに対して
その事を知らせる→enableにする

複数の条件のどれかが満たされなくなったらdisableにする
0689デフォルトの名無しさん2017/03/08(水) 06:24:29.95ID:mVK9qmox
やり方は様々なんだから統一しなくていいんだよ
目的さえ達成できればいいんだよ
0690デフォルトの名無しさん2017/03/08(水) 06:29:16.74ID:AVco/m+g
>>688
お前の中ではなんかすごい自己イメージが出来上がってるんだろうけど
はたから見るとVBA触った事ないって丸わかりでまぬけにしか見えんで
0691デフォルトの名無しさん2017/03/08(水) 06:30:50.52ID:G0oe8ylD
>>689
実現方法は複数あるだろうけど
ユーザからみたら使い勝手が良い悪いはあるだろう

ユーザの評価も分布があるだろうから一つには定まらないけど
多数が良いと評価するものと比較的少数にしか評価されないものはある
0692デフォルトの名無しさん2017/03/08(水) 06:31:23.37ID:G0oe8ylD
>>690
お前の評価なんか知ったことではない
0693デフォルトの名無しさん2017/03/08(水) 06:38:32.00ID:AVco/m+g
そういや春休みか
0694デフォルトの名無しさん2017/03/08(水) 06:42:37.58ID:swHBt9ge
>>688
それでいいよ
業務アプリに耐えうる構造
1ボタンを押したら2ボタンを活性に〜なんて素人臭いバグ誘発コードはプロが書いちゃダメだよね

>>690
ど素人丸出しなのはお前だよ
シートばっかりいじってないでUIデザインパターンぐらい勉強したらどうだ?
0695デフォルトの名無しさん2017/03/08(水) 06:56:18.61ID:G0oe8ylD
>>694
ユーザがそれを希望したらどうするの?
その仕事は受けないの
0696デフォルトの名無しさん2017/03/08(水) 07:09:36.78ID:mVK9qmox
>>695
希望されたときに考えればいい
0697デフォルトの名無しさん2017/03/08(水) 07:48:20.06ID:uLOAniEg
またプロうんぬんか。
場所をわきまえろよ
0698デフォルトの名無しさん2017/03/08(水) 07:52:18.60ID:swHBt9ge
>>695
まずは要件の確認と交渉だな
業務でやるなら普通はこういう会話が発生する

客「ボタン1を押したらボタン2を押せるようにしてください。ボタン1のイベントでボタン2を活性にすればできると思います
自「なぜ、その機能が必要なのですか
客「ボタン1の処理の結果として、ボタン2の処理の前提条件が揃うものと想定しています
自「その前提条件が成立しているかどうかを直接問い合わせて、それをボタン2の活性に反映したほうが安全で保守もしやすいですよ
客「なるほど。ではそうしてください
自「活性の切り替えではなく表示の切り替えもできますが
客「活性の切り替えでいいです

取りつく島もないなら仕方がないが
そういう怠惰な客は細かい実装まで気にしない事が多いな
その場合は曖昧な要件の中で取れる最善を尽くせばいい
裁量権全くない多重下請けの下っ端ならまあうん心を強く持っていこう
0699デフォルトの名無しさん2017/03/08(水) 08:04:32.43ID:+hgaWvwS
気持ち悪い
どっかよそでやってくれ
0700デフォルトの名無しさん2017/03/08(水) 08:09:06.66ID:D4P4iCUI
プログラムするのには資格とかないから
プロなんて自称にすぎない
他人に認められてるかどうか

自分でプロとか言い出すのは認められたいのに認められてないからだな
0701デフォルトの名無しさん2017/03/08(水) 08:11:46.31ID:O/leY4qo
>>685
ユーザーの使い勝手とコードの安全性は別の話だろ
0702デフォルトの名無しさん2017/03/08(水) 10:23:52.35ID:Xk2u3PeN
色々と妄想が唸って楽しいな。

ググればすぐわかることだし、>>659への最適な回答は、ググる用のキーワードを答えることだろう。
vba フォーム コマンドボタン 無効
辺りでどうぞ。
0703デフォルトの名無しさん2017/03/08(水) 11:56:55.21ID:+hgaWvwS
Excel VBAユーザーの99.9%以上が自らの事務仕事に使っているサラリーマンであり、このスレにおいても
99%以上を占めている。

に1000円
0704デフォルトの名無しさん2017/03/08(水) 12:11:31.69ID:FPm0HtVT
すなわち、質問者も事務用だろうから、プロ()の発言は不適切ってことだな
俺も1000円レイズ
0705デフォルトの名無しさん2017/03/08(水) 12:18:09.92ID:LcYDafnb
俺が胴元をやるので、みんな掛け金を持って来るように
0706デフォルトの名無しさん2017/03/08(水) 12:42:34.49ID:4tJLN9pP
また技術の話じゃなくて工夫の話かよ。
俺は知恵が無い質問には答えない。

何故ボタンを押しても反応しないようにしたいのか背景を言わないから独りよがりの糞仕様となる。
一方、自分の業務の不必要な背景を言う奴もいる。
実際のシート名とか実際に使用する顧客番号とかを使って質問して、回答者に作らせたい意図がミエミエなのも萎える。
0707デフォルトの名無しさん2017/03/08(水) 12:43:45.37ID:MpcJ8pvA
>>698
客(隣に座ってるパートのオバチャン)だろお前の場合はw
0708デフォルトの名無しさん2017/03/08(水) 12:58:01.05ID:eawgrtGt
>>698
駄目な客の見本だな
提示すべきは、真の要求(要求仕様)であって、実現方法ではない
0709デフォルトの名無しさん2017/03/08(水) 13:08:19.33ID:O/leY4qo
質問者も消えたし
まあ、あの程度か出来んのだから質問の仕方もわからんだろう
問題はコミュニケーションとる気がないこと
0710デフォルトの名無しさん2017/03/08(水) 13:10:22.80ID:+hgaWvwS
>>708
理想はそうかもしれんが、実現の道筋が見えなくて、とりあえずの方法を提示するしかないことも多い。

「この方程式の解がほしい」と「この計算をしてほしい」の違いというべきか。
0711デフォルトの名無しさん2017/03/08(水) 13:31:16.56ID:eawgrtGt
>>710
> 理想はそうかもしれんが、実現の道筋が見えなくて、とりあえずの方法を提示するしかないことも多い。
このスレに限らず、いろんなスレでそんな質問が氾濫してる

ある問題を解決したい

なにか解決方法を考え出す(←間違ってたり、無駄だったり、全然別のよりよい方法があったり)

その解決方法をプログラミングするにあたって、エラーが発生したり質問が出たりする

で、それを質問するが、そもそもの「俺の解決法」の時点でダメダメ
0712デフォルトの名無しさん2017/03/08(水) 13:43:51.91ID:+hgaWvwS
>>711
0713デフォルトの名無しさん2017/03/08(水) 13:49:02.06ID:eawgrtGt
>>712
何が「?」なのか?なんだけど、この本の内容みたいなことね
興味があったら読んでみて

『ライト、ついてますか―問題発見の人間学―』
http://www.kyoritsu-pub.co.jp/bookdetail/9784320023680
0714デフォルトの名無しさん2017/03/08(水) 14:04:50.36ID:+hgaWvwS
>>713
どうしてそう話題と無関係なことを言い出すのか?
0715デフォルトの名無しさん2017/03/08(水) 14:20:02.78ID:eawgrtGt
>>714
俺は>>568>>659もこのパターンの質問だと思うが、無関係と思うならそれでいいよ
0716デフォルトの名無しさん2017/03/08(水) 14:31:21.61ID:Qhd5xbM+
713の本の内容を要約すると、質問の仕方が悪いと最適な回答に到達できない、という話

まあ、行き違いはどこの業界にもあるもんだよ
http://arison.jp/wordpress/wp-content/project_comedy_l.gif
0717デフォルトの名無しさん2017/03/08(水) 15:01:22.66ID:Uljnsbub
>>715
これ完全同意
0718デフォルトの名無しさん2017/03/08(水) 15:13:50.97ID:Qb30CADF
>>714
誉められたいの
認められたいの
そこ場合こうするの

>>713
承認します
0719デフォルトの名無しさん2017/03/08(水) 17:21:28.67ID:3Gnt/ka5
質問です。(既に諦め気分ですが、、)
.OnAction に引数を渡すのにSingleQuoteでくくれば
良いことは分かったのですが、RangeObjectを渡す方法
が分かりません。そもそも無理な話?
0720デフォルトの名無しさん2017/03/08(水) 17:44:40.78ID:FPm0HtVT
>>719
range.addressで文字列に変換して送るしかないかもなー
確実に動作させるならブック、シート名も必要なので、range.parent.name
range.parent.parent.name
で頑張るしか‥
0721デフォルトの名無しさん2017/03/08(水) 17:52:43.61ID:3Gnt/ka5
>>720
やっぱり、、ですよね?
Sub Proc側でテキストで受けるしか、、、
0722デフォルトの名無しさん2017/03/08(水) 18:07:23.48ID:8HRrOhiJ
質問者不在のまま延々と議論してて「真の要求(要求仕様)」もへったくれも
あるか。質問者もなんで議論に参加して「私の意図はこうこう、こういうことで」
って発言しないんだよ。

外野だけがあーだこーだ言っても始まらんっつーの

http://www.dotup.org/uploda/www.dotup.org1179366.jpg
0723デフォルトの名無しさん2017/03/08(水) 18:24:58.87ID:eawgrtGt
>>722
まあ、その図の「顧客が説明した要件」というのが、実は真の要件じゃないことが
ままあるってのが俺の主張なんだけどね
0724デフォルトの名無しさん2017/03/08(水) 18:39:38.50ID:MpcJ8pvA
>>723
いやwその絵がそう言ってんだけどw
何が「実は」だよwww
0725デフォルトの名無しさん2017/03/08(水) 19:24:58.38ID:VZtOnmtc
>>719
OnActionにこだわる理由は?
Clickイベントなど代替案は不可なのか?
0726デフォルトの名無しさん2017/03/08(水) 19:37:13.62ID:xxKvaJWh
※これは面白いよ〜
この動画一つで皆がわからなかった真相が明らかに!!!

http://blogs.yahoo.co.jp/anti_mm_eq010/17942365.html
0727デフォルトの名無しさん2017/03/08(水) 19:41:14.06ID:LcYDafnb
↑アフィ
0728デフォルトの名無しさん2017/03/08(水) 19:47:30.23ID:ISgA6Zgl
VBAでmap、foldなどの高階関数は使用可能?
0729デフォルトの名無しさん2017/03/08(水) 19:51:26.43ID:NdsLBs1K
OnActionとかRunとかOnTimeとか引数渡すときは最初は困惑するよね
0730デフォルトの名無しさん2017/03/08(水) 21:20:35.53ID:Uljnsbub
>>728
VBEX
でも高階関数使いたいなら他の言語使ったほうがいい
0731デフォルトの名無しさん2017/03/08(水) 21:44:55.24ID:ISgA6Zgl
>>730
こんなんあるんだね、ありがとう。

家でなく会社で使いたいんよ。
会社だとそういう部署じゃないから、コンパイラ入れるだけでも申請がいる。ある時間以上かけて作られたプログラムは買い取らないといけないとか何とかで、
それがめんどくさいからかプログラムを書くこと自体が好ましくない雰囲気がある。
マクロならグレーゾーンになってるのでやってよしというわけ。おかしな話だわ。
0732デフォルトの名無しさん2017/03/08(水) 21:47:25.79ID:dPVIbm85
>>730
「高階関数」というからラムダ式に関係しているらしきものを見てみた
https://github.com/rubberduck203/VBEX/blob/master/test/TestLambda.bas

Dim f As Lambda
Set f = Lambda.FromProper("(x) => x * x")
BatteryApplicable.Battery f, 2, 4

なんだこれは?文字列で式を渡すのか?
0733デフォルトの名無しさん2017/03/08(水) 21:49:24.62ID:dPVIbm85
>>731
会社が買い取ったプログラムを資産計上するとかそういうの?
0734デフォルトの名無しさん2017/03/08(水) 22:30:55.92ID:AxVYdWMe
>>733
買い取るって言うのはよくわからんけど本来社内製作のソフトも資産計上する必要あるから
最近うちでもうるさくなってきたわ
0735デフォルトの名無しさん2017/03/08(水) 22:40:16.73ID:dPVIbm85
>>734
なるほど。
それが面倒だったら、「大部分はOSSからのコピペですから」、とか言っておけばいいのか。
0736デフォルトの名無しさん2017/03/08(水) 22:41:27.12ID:ISgA6Zgl
>>733
>>734
そう、まさにそれ。
資産計上しないと脱税になりかねないらしい。

>>732
あー、やっぱりそっち系が正解だったのか?
自分も途中までは作ってたんだよ。
文字列渡してparseして関数名と引数を得て、Application.Runするという。
逆ポーランドだけならうまく回ったけど、
中置関数やif_then_elseを取り込もうとした辺りでめんどくさくなって止めた。

dllだかを使ってやられてる方が既にいたけど、
上の事情で何も手を加えてないエクセルしか使えないという条件でやろうとしたら、
Application.Runしかないかなと思った。
VBAで、あのVBEのエディタの書いてあるのを弄れれば何でも出来そうだけど、無理だよね?
0737デフォルトの名無しさん2017/03/08(水) 22:53:03.41ID:G0oe8ylD
>>734
給料払ってるから原価とか販管費とかになりそうな気もするけど
0738デフォルトの名無しさん2017/03/08(水) 23:14:24.99ID:dPVIbm85
文字列のparseは...
自分は絶対にしないな
0739デフォルトの名無しさん2017/03/08(水) 23:23:43.30ID:VZtOnmtc
ラムダと比べるとイマイチだが式オブジェクトを合成していく方式で疑似ラムダっぽいことができる
昔はC++にラムダがなくて仕方なく疑似ラムダを使っていた
実装もパースよりは手軽だ
0740デフォルトの名無しさん2017/03/08(水) 23:30:48.67ID:dPVIbm85
>>739
式典か
0741デフォルトの名無しさん2017/03/08(水) 23:49:08.95ID:Uljnsbub
>>736
>資産計上しないと脱税になりかねないらしい。

個人が自分の作業効率上げるためのスクリプトレベルでそんなん言い出したらきりがないよ
税務署のうんこルールを全部真に受ける必要ない
0742デフォルトの名無しさん2017/03/09(木) 00:01:04.17ID:x6aOWZGA
高階関数使いたい場合の選択肢

1. Python + xlwings
少し制限はあるけどPythonからExcel扱えるし
VBAからPythonのコードを呼んでセルを編集したりもできる
配布じゃなく個人用途なら便利

2. Ruby+Roo (or spreadsheet)
Rooは読み取りアクセス専用(Spreadsheetは書き込みアクセスもできるが機能が限定的)
Excelデータを加工して別のCSVを吐き出すような処理に最適
同じようなライブラリはどの言語でもそこそこある

3. VSTO
別のユーザーへの配布が必要なら現実的にはこれしかない
0743デフォルトの名無しさん2017/03/09(木) 00:15:26.16ID:lh6pHjRm
powershellでおk
0744デフォルトの名無しさん2017/03/09(木) 00:36:18.07ID:44uIt3yk
>>731
うちなんか、プリンタドライバ入れるだけで申請だぜ。
イェイ
0745デフォルトの名無しさん2017/03/09(木) 00:38:34.50ID:44uIt3yk
あ、もっと凄いのあった。

プログラムの不具合直してくれ→申請

いやいや、不具合なんだからタダで直せよwww
0746デフォルトの名無しさん2017/03/09(木) 00:46:21.02ID:nnBlrAfa
>>744
それは当然
システム管理者が状況を子細に把握してないとトラブルに素早く対処できないから復旧が遅れて業務に支障が出る
0747デフォルトの名無しさん2017/03/09(木) 01:03:52.42ID:44uIt3yk
申請しても対応が遅いから、既に業務に支障出てるんだけどなww
0748デフォルトの名無しさん2017/03/09(木) 01:30:19.36ID:x6aOWZGA
>うちなんか、プリンタドライバ入れるだけで申請だぜ。
これは無駄だね
トラブっても自分で対応するなら勝手にやればいい話
プリント業務がクリティカルなら別だけど

>いやいや、不具合なんだからタダで直せよwww
これは不具合と呼んでる物の中身による
0749デフォルトの名無しさん2017/03/09(木) 03:11:12.90ID:LIvrhHW5
>>725
各種DBにSQLを投げるツールを作っていて、指定行のSQLに
いろいろ条件を変えてコマンドを投げるのにポップアップメニュー
を使いたいなあ、と思い、、、各列の設定値を読み込むのに
右クリック列からのOffset位置(実際は表頭タイトルで判定)
を使うのにRangeObjectだと都合が良かったので、、先に
そのような形でSubProcを作っておりましたので、Selection
ChangeからBeforeRightClickのPopUpに切り替えた際に
躓きました。(右クリック位置が表側ではなかったので、、)

最終的に右クリックからのイベントの時は範囲引数をOptional
にして省略した形で投げて、表側位置を決め打ちで取得する
という方法で逃げました。
ただVBAの機能制限としてOnAction引数に関する正しい認識
を理解しておきたいなぁと思い質問した次第です。
0750デフォルトの名無しさん2017/03/09(木) 03:59:51.12ID:x6aOWZGA
引数の型が文字列だから文字列しか渡せないよね
RangeのAddressを渡して渡されたほうで文字列をパースすることはできるんじゃない
面倒くさいけど
0751デフォルトの名無しさん2017/03/09(木) 04:30:43.10ID:jhj5IKei
面倒くさいか?
.Address(, , , True)で渡して Evaluate()で戻すだけだぞ
0752デフォルトの名無しさん2017/03/09(木) 05:03:20.86ID:o12uNzG/
>>751
本題から逸れるが、名前付き引数使おうか。
0753デフォルトの名無しさん2017/03/09(木) 05:21:59.59ID:jhj5IKei
>>752
そだね 分かりにくいもんな 気を付けるよ
0754デフォルトの名無しさん2017/03/09(木) 06:54:04.52ID:K/l9Si6s
>>747
お前の業務がその程度って思われてるってことだろ
0755デフォルトの名無しさん2017/03/09(木) 06:55:39.11ID:Cagv9mDq
文字列から<>に囲まれた部分を削除するのに出来るだけ速い処理はどうするのがよいでしょうか。

今は文字数をカウントして
for i = 1 to Len(文字列)
if mid(文字列,i,1)="<" then flag = true
if mid(文字列,i,1)=">" then flag = false

if flag = true then 新文字列=新文字列 & mid(文字列,i,1)
next

と1文字ずつ処理するしか書けず時間がかかりすぎます
<>に囲まれた文字数が何文字であれ、一気にリプレイスで削除するなどは出来ませんか?
0756デフォルトの名無しさん2017/03/09(木) 07:08:54.45ID:eRv4aOzH
高階関数、いろいろやり方ありそうだね。情報ありがとう、試してみるよ。

家で書いてるプログラムと会社でのとの峻別ってどうしてる?
家ではVBA以外で書いてるのだが、仮に会社のPCにそのコンパイラ入れられたとして、
家で書いたのを会社のものと思われたりするのは困る。
なので、言語分けてるのは止むなしとも思ってる。
0757デフォルトの名無しさん2017/03/09(木) 07:24:55.63ID:F37fUyQp
>>756
家の自分と会社の自分を峻別すればいい。
つまり家で書いたコードはOSSとして公開。ちゃんとライセンスもつける。
会社では一ユーザーとしての立場で。もちろん業務と直接関わるコードは混ぜないようにする。
0758デフォルトの名無しさん2017/03/09(木) 07:26:10.89ID:K/l9Si6s
>>755
> 文字列から<>に囲まれた部分を削除するのに出来るだけ速い処理はどうするのがよいでしょうか。
そのプログラムだと<>に囲まれてない部分を取り出してるみたいだが?(しかも<が含まれるし)

> <>に囲まれた文字数が何文字であれ、一気にリプレイスで削除するなどは出来ませんか?
VBA だけでやるなら
・InStr で < を探してそこまで出力
・ > を探してそこまで読み飛ばし
を繰り返せばそれなりに速くなると思う
一気にやりたいなら
VBA 正規表現
でググれ
0759デフォルトの名無しさん2017/03/09(木) 07:44:56.02ID:Cagv9mDq
>>758
if flag = false then
と書き間違えた
0760デフォルトの名無しさん2017/03/09(木) 08:11:09.85ID:rbE9k3dA
>>755
試してないけど一文字ずつ配列に入れて条件で飛ばして最後にjoinとか
文字列の結合で一番早いのはmidステートメント使ったやり方だと思う、自分が調べた中では
0761デフォルトの名無しさん2017/03/09(木) 08:29:14.83ID:K/l9Si6s
>>759
それだと今度は > が含まれるがいいの?
細かいこと言うと flag なんて言う意味のとりにくい名前がよくない
今の方法でやるなら
Dim 括弧の中にいる As Boolean
括弧の中にいる = False
For i = 1 to Len(文字列)
Dim 文字 As String
文字 = Mid(文字列, i, 1)
Select Case 文字
Case "<": 括弧の中にいる = True
Case ">": 括弧の中にいる = False
Case Else
If Not 括弧の中にいる Then 新文字列 = 新文字列 & 文字
End Select
Next
0762デフォルトの名無しさん2017/03/09(木) 08:51:04.72ID:nnBlrAfa
403エラーが出てソースが貼れない
2chのバグか?NGワード確認スレにすら書き込めないんだが
0763デフォルトの名無しさん2017/03/09(木) 08:54:17.13ID:nnBlrAfa
>>755
カッコも消すのか残すのかわからないけど、とりあえず消す方
"aa<bb>cc" → "aacc"

1文字ずつ見るよりは速いと思う
ただし < と > の対応が崩れてるとちゃんと動かない

Sub test1()

次に、中だけ消してカッコは残す方
"aa<bb>cc" → "aa<>cc"

Sub test2()

なぜか書き込めないので、本体はここに置いた
http://climbi.com/b/9613/0
0764デフォルトの名無しさん2017/03/09(木) 11:56:52.59ID:F37fUyQp
For文にはStep 1を必ず書くスタイル。
0765デフォルトの名無しさん2017/03/09(木) 12:28:35.44ID:+6THsUCX
代入文にはLetを必ず書くスタイル
0766デフォルトの名無しさん2017/03/09(木) 13:09:20.11ID:3GDDHFuK
>>724
あの画像何回か見たことあるけど、そういう意味だったのかー
気づかなかったわ
さすがプロ様
0767デフォルトの名無しさん2017/03/09(木) 13:11:04.95ID:dWDPbvt8
>>755
遅いのは描写更新の頻度が多すぎるからな気がする。

screenupdating=false
文字列置換処理
screenupdating=true

とか

arr=range(″A1:D100″).value
文字列置換処理
range(″A1:D100″).value=arr

とかやっているだろうか?
0768デフォルトの名無しさん2017/03/09(木) 13:29:51.01ID:3GDDHFuK
>>755
遅い原因だけど、文字列連結回数が多いからだと思う
その高速化方法:https://www.moug.net/tech/exvba/0140045.html
0769デフォルトの名無しさん2017/03/09(木) 13:31:14.22ID:3GDDHFuK
>>760とかぶった・・・
0770デフォルトの名無しさん2017/03/09(木) 16:40:47.97ID:AWOaBPqq
hijfg<vjigxy<fujvg>giuur>>なはは

とかだと期待する結果はどうなのか
0771デフォルトの名無しさん2017/03/09(木) 17:44:48.97ID:12AmJuBI
Sub Macro5()
sample = "aaa<br>bbb<br>ccc<br>ddd<breee<brfff>ggg>"
Worksheets.Add
Range("A1") = sample
Cells.Replace What:="<*>", Replacement:="", LookAt:=xlPart, SearchOrder _
:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
Debug.Print Range("A1").Value

Application.DisplayAlerts = False
ActiveSheet.Delete
Application.DisplayAlerts = True
End Sub

計ってないけどこれが一番はやいんじゃないかな
>>770の対処はないけど
0772デフォルトの名無しさん2017/03/09(木) 19:25:28.35ID:kw2HRjPy
あー、かっこの入れ子があったときね
それを考えるとクソほどめんどくさいな
0773デフォルトの名無しさん2017/03/09(木) 19:25:29.11ID:afDckXZp
>>770
そういう例外まで含めると普通に開発環境を開発するような規模になってくるから、
とりあえず「想定された入力」に対して「想定された出力」が返る事を主眼に置いた方がいいんじゃないかな

だからまず「想定された入力」のパターンを全部公開してもらいたい
0774デフォルトの名無しさん2017/03/09(木) 19:29:03.44ID:NMunja2P
<>に囲まれた部分を削除向け統合開発環境
なんだそれwしょぼwwww
0775デフォルトの名無しさん2017/03/09(木) 19:29:07.38ID:F37fUyQp
>>756
詳しく見たことないけど ariawase は素のExcelだけで使えたかも
くぐれば見つかる
0776デフォルトの名無しさん2017/03/09(木) 19:38:42.24ID:kw2HRjPy
入れ子の処理するなら再起処理だろうか
あんまりやりたくないけど
0777デフォルトの名無しさん2017/03/09(木) 19:54:00.59ID:afDckXZp
>>774
括弧が不完全だった場合どうするのとか、括弧が複数回続いている場合の処理はどうするのとか
特定の文字が入っていたら別の処理をさせたいとか、目標にする文字を"<"">"から変えたいとか
文字列コマンド型で万能を目指すと酷いことになるからとりあえずxmlで妥協してくださいおねがいします(トラウマ
0778デフォルトの名無しさん2017/03/09(木) 20:01:46.02ID:F37fUyQp
CSVですらそれなりにめんどくさい
0779デフォルトの名無しさん2017/03/09(木) 20:03:06.73ID:LA1Z4pgP
>>776
ネストをカウントしとけばいいだけでしょ
0780デフォルトの名無しさん2017/03/09(木) 20:09:14.67ID:AWOaBPqq
まなはさ<はささたあ

これはどうなるのが期待する結果だろうか
<以降は削除するのかしないのか
0781デフォルトの名無しさん2017/03/09(木) 20:10:18.34ID:J4siqdXV
再帰下降構文解析はアマチュアでも簡単に書けるので試してみるといい
入れ子になったパターンを手書きコードで解決するときの定石ね
0782デフォルトの名無しさん2017/03/09(木) 20:12:11.55ID:NMunja2P
でましたwwwプロ()wwwwwwwwww

参考ググりんぐタイム:38分58秒
0783デフォルトの名無しさん2017/03/09(木) 20:19:36.16ID:kw2HRjPy
>>779
めんどくさそうだなあって
>>780
それはないでしょ
一文字ずつやるにしても>の有無がフラグになるし、まとめてやるにしても囲まれてないと処理しないじゃん
0784デフォルトの名無しさん2017/03/09(木) 20:47:06.20ID:2fqMXIUX
また質問者不在で勝手に議論するパティーン
0785デフォルトの名無しさん2017/03/09(木) 20:47:09.64ID:i/mBbb1z
Find(シート1のA列から文字列を検索
If (シート1で出てきたセルの2つ右をセレクトし、Activeセルの値を取得
Find (取得した値を、シート2のA列で検索
IF (値が一致したら、セルの値を置換

このような入れ子にしたいのですが
二つ目のFindで Set a =...Find の文を入れた時点でエラーが出ます
「オブジェクト変数または With ブロック変数が設定されていません。」と出ますが
Set a の変数aは宣言しているし、変数名も間違っていないし 上で動いた構文と全く同じように書いたので構文は間違っていないはず・・・

エラーとして出るのは
If FoundCell.Address = FirstCell.Address Then の文で
二つ目のFindの文を入れなければ普通に動きます

Findの入れ子ってもしかして出来ない??Setが悪さをしてる???IFの入れ子がおかしい??
仕事で必要になり必死に調べてプログラムしたのですが
つい先日勉強し始めたばかりの初心者で、どうしてもわかりません

家からメールにログインできず、元のデータ持ってこれませんでした・・・
どうか知恵を貸してください
お願いします
0786デフォルトの名無しさん2017/03/09(木) 20:59:34.74ID:Tf6YnCrM
>>785
それって本当に入れ子なの?
とりあえず2番目のIfで何の真偽を対象にしているのかわからない
> If (シート1で出てきたセルの2つ右をセレクトし、Activeセルの値を取得
0787デフォルトの名無しさん2017/03/09(木) 21:18:20.68ID:i/mBbb1z
>>786 かなり省略されてますが、入れ子になってます
ネットのプログラムを色々ひっぱったのですが、元はこのプログラムです

Dim FoundCell As Range, FirstCell As Range, Target As Range
Set FoundCell = Cells.Find(What:="田中")
If FoundCell Is Nothing Then
MsgBox "見つかりません"
Exit Sub
Else
Set FirstCell = FoundCell
Set Target = FoundCell
End If

Do
Set FoundCell = Cells.FindNext(FoundCell)
If FoundCell.Address = FirstCell.Address Then
Exit Do
Else
Set Target = Union(Target, FoundCell) ←これは元のプログラムはっつけただけなので、特に必要はないです
@ここで見つかったセルの横をセレクトし、二つ目のFind使用
(ここでは複数選択じゃないので、上と同じIFを書くつもりでしたが必要ないのかも)
End If
Loop
Target.Select
MsgBox Target.Count & "件見つかりました"
End Sub

大体こんな感じのプログラムです。
投稿したら字下げ消えるんですね、見づらいと思います。ごめんなさい。
0788デフォルトの名無しさん2017/03/09(木) 21:19:19.62ID:Tf6YnCrM
>>785
もしかして最初の4行全体がひとつの式になっているのかな?
式の中の = は代入文ではなくて等式とみなされる。というか文を式の中に入れられない。
(つまり = ではなくて == )
だから Set a = b が式中にあるとエラーになるよ。
0789デフォルトの名無しさん2017/03/09(木) 21:22:34.33ID:WNhcxEY1
>>787
ソースをここに貼りたい時はタブや半角スペースを全角スペースに置換してから投稿しましょう
このようにインデントが消えませんし、そのままVBEにコピペできます
あるいは、ソース共有サイトを利用します

Sub
  For
    IF
    End IF
  Next
End Sub
0790デフォルトの名無しさん2017/03/09(木) 21:28:06.83ID:Tf6YnCrM
>>787
なるほど。
で、それをどう改変したらエラーが出る?
0791デフォルトの名無しさん2017/03/09(木) 21:28:53.55ID:no8PqT66
そのエラー出るときはほぼほぼどっかでオブジェクトの代入のし忘れをしてるか取得失敗してるかだけどな
0792デフォルトの名無しさん2017/03/09(木) 21:30:21.14ID:no8PqT66
ステップ実行してみ
もしくはオブジェクト代入ごとにtypenameをプリント
0793デフォルトの名無しさん2017/03/09(木) 21:31:23.74ID:Tf6YnCrM
>>787

>>788のコメントは忘れてね。
上の方で再帰処理が話題になってたから「入れ子」と聞いて勘違いした。
0794デフォルトの名無しさん2017/03/09(木) 21:43:37.25ID:x6aOWZGA
正規表現でがつっとやれよ
Excelでプログラミングしてるレベルなのに
そんな低いレイヤーの処理をいちいち意識しないところになぜ追い込むの?
0795デフォルトの名無しさん2017/03/09(木) 21:54:39.35ID:q6fawGlW
>>783
<が出てきても
>か最後か判るまでは処理が決まらない
って事
0796デフォルトの名無しさん2017/03/09(木) 22:11:02.48ID:j4+ozjFj
>>787
Set FoundCell = Cells.FindNext(FoundCell)
ここでNothingの場合に次のFoundCell.Addressでエラーになってんじゃない?
0797デフォルトの名無しさん2017/03/09(木) 22:14:07.03ID:i/mBbb1z
ありがとうございます!
完全に詰まってしまったのでアドバイス助かります

思い出しながらエラーが出たところまで編集しました(簡素にですが
これじゃわからん状態なら、明日元のデータを持ってきます
全体の構文的には間違っていないんでしょうか...
http://climbi.com/b/9622/0

二つ目のFindを別のサブプロシージャに入れてCallで呼び出しても、全く同じエラーになります
単体で動かすと普通に動きました
0798デフォルトの名無しさん2017/03/09(木) 22:14:46.42ID:no8PqT66
>>795
ごめん、日本語読めてなかったわ
たぶんスルーだと思うけどな
0799デフォルトの名無しさん2017/03/09(木) 22:26:46.20ID:i/mBbb1z
>>796 このプログラムだと、毎回Nothingになるのですか?
詳しくないので逸れた意見をしていたら申し訳ないのですが

検索結果が見つからなかった場合は最初に”見つかりません”でおわり
検索して一番最後の検索値セルまで行っても、FindNextでは1番上に戻る(とネットで見ました

ですが、たしかエラーが出たとき右下のウォッチに「Nothing」とあったような・・・
確認してみます
0800デフォルトの名無しさん2017/03/09(木) 22:32:49.96ID:afDckXZp
>>797
これなら

Sub test()
Debug.Print Application.WorksheetFunction.CountIf(Cells, "田中")
End Sub

で済みそうだけど具体的な目的はなんだろ
0801デフォルトの名無しさん2017/03/09(木) 22:56:43.28ID:no8PqT66
>>799
nothingってことはオブジェクトがないんですよ
0802デフォルトの名無しさん2017/03/09(木) 22:58:27.20ID:x6aOWZGA
Set FoundCell = Cells.FindNext(FoundCell)

Set FoundCell = Cells.FindNext
0803デフォルトの名無しさん2017/03/09(木) 22:59:59.43ID:x6aOWZGA
すまん関係なかった
0804デフォルトの名無しさん2017/03/09(木) 23:25:12.46ID:44uIt3yk
予約語を変える方法ってありますか?
0805デフォルトの名無しさん2017/03/09(木) 23:29:21.08ID:j4+ozjFj
>>799
FindNextがNothingにならないコードならエラーにならないですね。もしそうなら申し訳ないです。

>>797でエラーになるなら、sheet2がないかRに変なものを入れてるか。(Rって変数だよね?)
実はsheet2の大文字小文字間違えてるとか、Rに配列を入れてるとか。
Whatに配列を入れてエラーになるかはわかんないけど。
0806デフォルトの名無しさん2017/03/09(木) 23:46:08.11ID:nnBlrAfa
>>804
正攻法はない

邪道な方法なら、プリプロセッサを使う、コンパイラのバイナリを書き換える
0807デフォルトの名無しさん2017/03/10(金) 05:51:23.52ID:PT1UnLZa
>>804
1. MS に入社して VBA のソースを書き換える
2. MS で偉くなって VBA の仕様を変える
3. MS を買収して VBA の仕様を変えさせる

2.〜3. ができるなら是非 C#A も実現してくれ、期待してるぞ
0808デフォルトの名無しさん2017/03/10(金) 07:02:35.32ID:5FLdi5F+
Make VBA great again !
0809デフォルトの名無しさん2017/03/10(金) 12:34:23.38ID:gaF8I+yh
>>755です
皆さん色々ありがとうございます
解決しました、これがちょっぱやでした

Dim 文字 As String
Dim 配列() As String
文字 = Replace(文字, "<", ">おちんちんビローン")
配列 = Split(文字, ">")
配列 = Filter(配列, "おちんちんビローン", False)
文字 = Join(配列, "")

入れ子は無しです
0810デフォルトの名無しさん2017/03/10(金) 13:01:22.45ID:jnuCNi2b
>>809
おちんちんビローンは良くない

おまんまんビローンの方がいい
0811デフォルトの名無しさん2017/03/10(金) 13:08:12.64ID:FQ1vk7uE
>>810
おまんまんがびろーんなのは良くないだろ
とろーんにしとけ
0812デフォルトの名無しさん2017/03/10(金) 13:53:08.01ID:uMDINb1s
最近、このスレのレベル低いね
アクティブユーザは10人かそこらだと思われるが、全員レベル低い
0813デフォルトの名無しさん2017/03/10(金) 14:43:28.56ID:g78q5K7j
最近の若い者は
0814デフォルトの名無しさん2017/03/10(金) 16:26:11.61ID:Io2upKA9
>>812
あなたはどっち?
0815デフォルトの名無しさん2017/03/10(金) 16:45:51.30ID:uMDINb1s
亀レスだが。

>>37
> コード品質をメトリクスとして計測するツールは他の言語環境だとあるけどVBAってそもそもそういうのあんの?

Project Analyzer
http://www.aivosto.com/project/project.html
VB時代に使ってたが、今でも開発が続いてるとは。
> Newest update: Analyze Office 2016 VBA with Project Analyzer & VBA Plug.

SourceMonitor Version (使ったことない)
http://www.campwoodsw.com/sourcemonitor.html
0816デフォルトの名無しさん2017/03/10(金) 17:19:32.40ID:Ea2160pE
長年VBA使ってきたけど、Filter関数なんて初めて知ったお。
でもSplitくらいでしか配列作らないから出番は少なそうだお
0817デフォルトの名無しさん2017/03/10(金) 17:30:51.42ID:hAWWnXrs
関数型プログラミングのfilter + ラムダ式が使えたら、、と思う瞬間が多い。
0818デフォルトの名無しさん2017/03/10(金) 17:31:55.52ID:Ea2160pE
質問です。
Excelの右クリックのコマンドで、ポップアップとボタンの両立は出来ないのでしょうか。

例えば、右クリックの「コピー」コマンドの子メニューとして
「値のみコピー」「値と書式をコピー」「図としてコピー」を作りたい。

もし最近のExcelの「形式を選択して貼り付け」みたいな配置がのメニューが自作できるならそれでも十分です!

以上、よろしくお願いいたします。
0819デフォルトの名無しさん2017/03/10(金) 18:09:05.49ID:g78q5K7j
>>817
自作→公開→富豪
0820デフォルトの名無しさん2017/03/10(金) 18:18:28.86ID:uMDINb1s
>>817
Excel-DNA + F#は?

Excel-DNAはCOM経由でアクセスするようなオーバーヘッドが少ないみたい。
http://bleis-tift.hatenablog.com/entry/20110713/1310490680

使ったことないので、お勧めなのかどうなのか不明ですが。
0821デフォルトの名無しさん2017/03/10(金) 18:22:25.85ID:y8xCqliG
>>818
>ポップアップとボタンの両立
どういう意味かちょっとわからない

>例えば、右クリックの「コピー」コマンドの子メニューとして
これは普通にできるでしょ
0822デフォルトの名無しさん2017/03/10(金) 18:25:24.37ID:hAWWnXrs
>>820
情報ありがとう。やってみるよ、COMMとかF#よく分からんがww
>>819
富豪かww考えてみるよww
0823デフォルトの名無しさん2017/03/10(金) 18:35:01.97ID:uMDINb1s
>>822
> COMMとかF#よく分からんがww
ということなら、.NET Frameworkに目的にあうクラスがあるかどうか探してみるのがいいかも。

使い方は、
http://officetanaka.net/excel/vba/tips/tips98.htm

全ての.NET Frameworkのクラスが使えるかどうかは不明(しつこい?)
0824デフォルトの名無しさん2017/03/10(金) 18:45:13.72ID:hAWWnXrs
>>823
いや、しつこくないよ。情報はもらえるだけもらいたい。
VBAではループ、条件分岐、配列くらいしか使ってない。
いつかはオブジェクト指向とか、.NET?とかにも挑戦してみたかったから、良い機会なので折を見てやってみるよ。
上のはHaskellのを想定して書いたけど、出来そうなんかな。
0825デフォルトの名無しさん2017/03/10(金) 19:21:38.26ID:Ea2160pE
>>821
C#とかの場合ポップアップメニューに対してもクリックイベントが取得できるので
1.「コピー」をクリック・・・標準のコピー動作をさせる
2.「コピー」にカーソルを合わせる・・・子メニューを表示させる
ということが両立可能です。

実際には親メニューをクリックしたら直前に使用した子メニューの動作をするという実装を考えています。
フリーソフト等ではよく見かける動きなので、エクセルVBAでも出来ないかと思って相談した次第です。
0826デフォルトの名無しさん2017/03/10(金) 19:54:42.90ID:K4FBudfx
「売上集計」「単価表」という二つのブック?があって、
売上集計のブックに単価表をコピーしたいのですが、
どういうコードを書けばよいのでしょか?
0827デフォルトの名無しさん2017/03/10(金) 19:59:35.50ID:K4FBudfx
質問訂正

売上集計というシートを開いていて、もう一つの画面で単価表というシートを開いているのですが、
この単価表のシートを売上集計のシートの横にコピーしたいです。

こういう場合はどうすれば良いのでしょうか?
0828デフォルトの名無しさん2017/03/10(金) 20:06:22.49ID:g78q5K7j
>>827
ctrlキーを押しながらシートをドラッグ&ドロップ
0829デフォルトの名無しさん2017/03/10(金) 20:12:19.01ID:K4FBudfx
>>826です
すいません、自己解決しました。

Worksheets("単価表").Copy _
After:=Workbooks("売上集計").Sheets(1)

これでいいんですね・・
0830デフォルトの名無しさん2017/03/10(金) 20:38:17.35ID:G+8/WNC/
>>816
私も初めて知りましたが、
配列を特定の条件で詰めたい時に使えていいなと思いました
for next で全要素判定しなくて良いので
0831デフォルトの名無しさん2017/03/10(金) 21:35:28.13ID:PT1UnLZa
>>816
俺も知らなかったわ
ちょっとググったら VB6 の時代からあるんだな
VBA 奥深すぎ
0832デフォルトの名無しさん2017/03/10(金) 21:36:22.40ID:y8xCqliG
>>825
なるほど
コンテキスメニューのMouseMoveが取れればできるだろうけどVBAだけでできるのかな?
Windows APIのフックとかで実現してるのかもね
0833デフォルトの名無しさん2017/03/10(金) 21:40:16.34ID:5FLdi5F+
>>816
俺も知らなかったので確認してみたが、引数はStringじゃなくてもいけた
0834デフォルトの名無しさん2017/03/10(金) 21:43:03.76ID:+sIlP1j5
>>829
コピー先はシート名じゃないのか
0835デフォルトの名無しさん2017/03/10(金) 22:37:06.66ID:Ea2160pE
filter関数知らないの俺以外にもたくさんいてワロタ
0836デフォルトの名無しさん2017/03/10(金) 22:42:28.95ID:5FLdi5F+
あー
数値でもいけるけど、
5だけ落とそうとしても 5 が含まれている数値が全部道連れになっちまうだよ
0837デフォルトの名無しさん2017/03/10(金) 22:47:36.30ID:PT1UnLZa
>>836
第4引数見ると比較方法が文字またはバイナリだから文字にして比較してるんだろうね
0838デフォルトの名無しさん2017/03/11(土) 17:29:51.87ID:bRgJ2+32
ここで聞いて答えが返ってくるかわからないですが、
氏名を姓と名に分割するよい方法はないでしょうか
姓と名は何かで区切られているわけではなくて1セルに入力されています
外部のWebAPIとか叩いてもいいので、なんとかして分割したいのです
100%の精度は求めていません
0839デフォルトの名無しさん2017/03/11(土) 17:43:11.93ID:d5jme4tX
>>838
ざっくりやるならこの手のページから苗字の一覧持ってきてマッチさせるとかかな
マッチ順序は長い奴からやらないと

原田
とかあると、全部 原 にマッチするから要注意ね
0840デフォルトの名無しさん2017/03/11(土) 17:44:11.39ID:d5jme4tX
URL 貼り忘れた
https://myoji-yurai.net/prefectureRanking.htm
0841デフォルトの名無しさん2017/03/11(土) 17:46:18.92ID:UsQ6q5bp
>>838
姓と名が分かれているリスト、サンプルを用意する。出来るだけというかかなりの量で。
頻度を採取しておく。加藤さん何回、太郎さん何回みたいな感じで。
一つの氏名について、どこで切るかのループを行う。
サンプルとマッチングさせて、適当にポイントを定義してそこで切る。
0842デフォルトの名無しさん2017/03/11(土) 17:46:59.81ID:UsQ6q5bp
おおう、既に書かれてたか。
0843デフォルトの名無しさん2017/03/11(土) 17:48:54.75ID:oeyf3Eyo
予めデータの並び順を三文字→二文字→一文字にしてから処理させれば精度は上がりそうだね
俺もそのうち使わせてもらおう
0844デフォルトの名無しさん2017/03/11(土) 17:51:03.11ID:UsQ6q5bp
名字でマッチングは、シンプルでいいね。
0845デフォルトの名無しさん2017/03/11(土) 17:59:02.33ID:1aDDqZQh
>>838
前から二文字は名字にしろ
0846デフォルトの名無しさん2017/03/11(土) 19:28:00.31ID:le+3qY0l
>>838
ここでAI
苗字をディープラーニングで学習する
0847デフォルトの名無しさん2017/03/11(土) 19:33:08.85ID:gM1auKGo
質問です

ファイルを保存する時に、今日の日付にしたいです。
例:今日の集計_20170311

で、その後に「集計分_3月分」というフォルダに格納したいのですが、
ここはどうコードを書けばよいでしょうか?ちなみに日付が4月だと「集計分_4月分」に格納する様にしたいです。
他の月も同じです。

ちなみに最初の日付を付けてファイルを保存するコードは一応完成してます。
ActiveWorkbook.SaveAs filename:=C:\Users\IchiroSuzuki\Desktop\新しいフォルダー\今日の集計"&_Format(Date,"yyyymmdd")&".xls"

(↑上の格納場所は仮で作りました)
0848デフォルトの名無しさん2017/03/11(土) 19:34:35.10ID:T88e3v0B
そもそも区切りたい理由は何だよ。
理由によっては区切らなくて済むかもしれないじゃんか。
0849デフォルトの名無しさん2017/03/11(土) 19:38:56.56ID:gM1auKGo
業務的な理由。
ファイル名がかさばるのが嫌だから。
0850デフォルトの名無しさん2017/03/11(土) 19:41:15.37ID:1GY6kavj
>>847
スプリットしてmid関数で月を抜き出してファイルシステムオブジェクトでゴニョゴニョしたら出来るよ
0851デフォルトの名無しさん2017/03/11(土) 19:41:32.72ID:T88e3v0B
>>847
Month(日付)で月を抜き出すだけだと思うけど。

・・・・。

うちの会社も未だにそんな事やってるけど、
何で月別とか年別でファイルを分けたがるんだろ。
全部まとめてデータベースに放り込めよって思う。
0852デフォルトの名無しさん2017/03/11(土) 19:43:45.17ID:gM1auKGo
>>850-851
そこが分からんので、コードを教えて欲しい。頼む・・。
ファイル名を作成するとこまでは何とか出来たんだけど。
俺初心者だからそこまで分からんのよ。
0853デフォルトの名無しさん2017/03/11(土) 19:44:14.77ID:T88e3v0B
>>849
848は、その前の名前と名字の話。
一瞬、851を書き込む前にエスパーレスされたのかと思ったわ。
0854デフォルトの名無しさん2017/03/11(土) 19:47:56.02ID:T88e3v0B
>>852
普通にこうじゃなくて?

集計分_3月分
  ↓
"集計分_" & Month(Day) & "月分"

一旦デスクトップ上のフォルダに保存してから、
移動するという意味?
0855デフォルトの名無しさん2017/03/11(土) 19:48:27.03ID:2CNlDFrG
>>851
データベースを扱うのにSQLなりを使えないといけない
ファイルはほぼ全員が判る
ファイルを一つのフォルダに多数入れすぎるとアクセスが遅くなる
0856デフォルトの名無しさん2017/03/11(土) 19:50:03.25ID:T88e3v0B
× "集計分_" & Month(Day) & "月分"
○ "集計分_" & Month(Date) & "月分"
0857デフォルトの名無しさん2017/03/11(土) 19:50:06.67ID:2CNlDFrG
>>852
http://www.moug.net/tech/exvba/0060035.html
ググり方くらいは判るだろ
0858デフォルトの名無しさん2017/03/11(土) 19:58:35.74ID:gM1auKGo
>>854
おお、それでいいのかな?
デスクトップ上に「集計分」というフォルダがあって、
そこに各月(集計分_○月分)のフォルダがあるってイメージ。
これでどうかな?
0859デフォルトの名無しさん2017/03/11(土) 20:06:56.79ID:T88e3v0B
じゃあこう。

Desktopより前は省略

"\集計分\集計分_" & Month(Date) & "月分\今日の集計_" & Format(Date, "yyyymmdd") & ".xls"
0860デフォルトの名無しさん2017/03/11(土) 20:15:57.40ID:gM1auKGo
>>859
そこ保存する時って,ifとかDir使わなくていいのかな。
そこも分かる?
0861デフォルトの名無しさん2017/03/11(土) 20:16:52.49ID:gM1auKGo
Dir "\集計分\集計分_" & Month(Date) & "月分\今日の集計_" & Format(Date, "yyyymmdd") & ".xls"

で行けるかな?
0862デフォルトの名無しさん2017/03/11(土) 20:21:27.92ID:1GY6kavj
コード作ったけど書き込みできない
なんでや
0863デフォルトの名無しさん2017/03/11(土) 20:25:54.90ID:d37UNVyC
>>848
使いたいWebサービスが姓と名の入力を必須としているI/Fだからです
0864デフォルトの名無しさん2017/03/11(土) 20:27:33.57ID:d37UNVyC
>>840
ありがとう
自力でやるしかないか…
0865デフォルトの名無しさん2017/03/11(土) 20:32:31.34ID:1GY6kavj
>>847
http://climbi.com/b/9637/0
コードが貼れないので上の方々を参考に
とりあえずフォルダにファイルを移動するだけね
フォルダの有無等々のエラー処理は知りません
0866デフォルトの名無しさん2017/03/11(土) 20:33:38.32ID:1GY6kavj
すまn
dim files as new collectioni
は不要ですわ
0867デフォルトの名無しさん2017/03/11(土) 20:48:49.60ID:sUFiWX+J
>>863
それで分割が間違ってたらどうなるの?
0868デフォルトの名無しさん2017/03/11(土) 20:50:41.24ID:gM1auKGo
>>865
す、すげー

f.Move fld.Path & '\'
って、\の後はフォルダー名でいいの?
0869デフォルトの名無しさん2017/03/11(土) 20:52:56.22ID:gM1auKGo
>>865もう少し短く出来ない?初心者の俺にはちと長いコードw

Dir (フォルダがあったら)→格納

、みたいな
0870デフォルトの名無しさん2017/03/11(土) 20:58:31.65ID:1GY6kavj
>>868
ちがう
目的のパス¥って書かないとフォルダの中を見ない
>>869
意味わからないならちゃんと調べて
機能を使ってるだけでたいして難しいことはしてないよ
0871デフォルトの名無しさん2017/03/11(土) 21:24:42.07ID:1aDDqZQh
>>855
dbから抽出して都度ファイルかしろよ
0872デフォルトの名無しさん2017/03/11(土) 22:44:46.63ID:5At9MNna
>>871
自分がいつまでも同じ業務を続けられるか判らないだろ
0873デフォルトの名無しさん2017/03/11(土) 23:02:10.48ID:sUFiWX+J
毎日日別の集計ファイルを保存する業務を人間に引き継ぐなよ
0874デフォルトの名無しさん2017/03/11(土) 23:11:12.54ID:T88e3v0B
>>861
申し訳ない。
先にフォルダを作らなきゃいけないんだった。

MkDir "C:\Users\〜(省略)〜 \集計分\集計分_" & Month(Date) & "月分"
0875デフォルトの名無しさん2017/03/11(土) 23:13:21.97ID:1aDDqZQh
>>872
属人化学w
0876デフォルトの名無しさん2017/03/11(土) 23:34:33.59ID:1GY6kavj
>>874
なに、その月のフォルダがなかったら自動で作れっての?
0877デフォルトの名無しさん2017/03/11(土) 23:37:21.47ID:1GY6kavj
あ、なんでもない
0878デフォルトの名無しさん2017/03/12(日) 00:57:08.28ID:qVU1mc2K
>>867
そのデータで作成された帳票類に違和感が出る
0879デフォルトの名無しさん2017/03/12(日) 01:09:13.61ID:T4N3k6YJ
>>878
そっか
データ量が多くて真剣に分割したいならちゃんとしたクレンジング屋に頼むといい
件数によるけどスポットでも数十万でやってくれると思うよ
事情はあるんだろうが入力時に分割しとけばいいのにね
0880デフォルトの名無しさん2017/03/12(日) 08:19:32.85ID:qVU1mc2K
>>879
デイリーのリアルタイム性のある業務で、入力データも外部のWebサービスからダウンロードするものだからどうにもならないんですよね
GoogleとかMSとか大手が姓名分割のWebAPIを作って無償で公開してくれないな…
なんか脱線してきた、みんなありがとう
0881デフォルトの名無しさん2017/03/12(日) 08:25:54.85ID:Q8YU2KJz
デイリーでリアルタイム性があって入力データが外部Webで人名で加工しなきゃならなくて・・・
なんか犯罪臭がする
0882デフォルトの名無しさん2017/03/12(日) 09:01:17.76ID:8PQIIyGz
おまわりさんこっちです
0883デフォルトの名無しさん2017/03/12(日) 09:23:51.39ID:991oSHP/
>>869
fsoにfolderexistsっていうフォルダの存在を確認するメソッドがあるから、
それ使えば良いよ。
今、excel mobile の環境なので、コードは勘弁して。
0884デフォルトの名無しさん2017/03/12(日) 09:27:10.39ID:bIRTne1U
>>883
あ、ループせんでもそれでよかったか
まあこれを機会にfor eachも覚えたらいいよ
初心者ならなおさらforとifは理解しないと
0885デフォルトの名無しさん2017/03/12(日) 09:57:15.31ID:8PQIIyGz
ExcelとPowershellの組み合わせ良いね
バッチ処理ならVBAはもう要らない
0886デフォルトの名無しさん2017/03/12(日) 10:12:22.72ID:hoQq7gk2
>>736
>VBAで、あのVBEのエディタの書いてあるのを弄れれば何でも出来そうだけど、無理だよね?

弄れるでしょ。
セキュリティ的に問題出てくるけど。
Application.VBE.以下いろいろ弄れる。
(但し、オプションで設定変更必要)
弄って且つ動かしたり、動かしてる最中に弄るのは難しいかな。
セキュリティ的な問題やオプションの設定変更を回避しつつ弄るのはVB.netやC#でCOMアドイン作ればできる。

>>880
前に出てた苗字リストで長い苗字順で検索かけて処理する方法で十分でないの?
0887デフォルトの名無しさん2017/03/12(日) 10:23:12.31ID:hfd+YsXW
苗字リストいいね
SQL Server Express に入れて遊んでみた

SELECT *
 FROM [sampleDB01].[dbo].[surname_rank]
 WHERE surname LIKE '%林%'
 ORDER BY rank

rank surname kana pupulation
9 小林 コバヤシ 1036000
18 林 ハヤシ 550000
270 若林 ワカバヤシ 82300
426 林田 ハヤシダ 47700
524 平林 ヒラバヤシ 38000
744 中林 ナカバヤシ 26300
818 栗林 クリバヤシ 23500
847 大林 オオバヤシ 22600
913 東海林 トウカイリン 20400
以下略
0888デフォルトの名無しさん2017/03/12(日) 10:27:33.54ID:4+0uKqTL
>>887
一位と二位が気になります
0889デフォルトの名無しさん2017/03/12(日) 10:45:30.88ID:hfd+YsXW
>>888
"rank"は全体の中でのランクだからね
SELECT *, LEN(surname) AS NameLen, 1000 * population/ SUM(population) OVeR() AS permil
FROM [sampleDB01].[dbo].[surname_rank]
ORDER BY rank ASC

rank surname kana population NameLen permil
1 佐藤 サトウ 1894000 2 17
2 鈴木 スズキ 1809000 2 16
3 高橋 タカハシ 1425000 2 12
4 田中 タナカ 1346000 2 12
5 伊藤 イトウ 1084000 2 9
6 渡辺 ワタナベ 1073000 2 9
7 山本 ヤマモト 1060000 2 9
・ ・ ・
4497 武下 タケシタ 2500 2 0
4498 後藤田 ゴトウダ 2500 3 0
4499 中松 ナカマツ 2500 2 0
4500 蓼沼 タデヌマ 2500 2 0
0890デフォルトの名無しさん2017/03/12(日) 11:34:02.60ID:qVU1mc2K
>>881
受注データをメーカーのEDIに投げるだけだよ
なんでそんなに気になるんだ…
0891デフォルトの名無しさん2017/03/12(日) 12:07:48.59ID:T4N3k6YJ
受注データをメーカーのEDIに投げるのにExcel VBAで姓名分割って…
小規模なら人間が介在するだろうしイメージできないわ
0892デフォルトの名無しさん2017/03/12(日) 17:05:06.51ID:ryuuGP4c
>>891
Excel形式でデータをダウンロード、CSVにエクスポートしてEDIに投げる、ここは人間がやるよ
でも毎日何百件の姓名分割まで人間が目視でやるのはつらいんだよ
ソースがExcel形式だったからExcelだけで完結できればオペレータが楽かな?と思ってね
別にExcelVBAだけに固執してるわけじゃないよ、色々模索してるとこ
0893デフォルトの名無しさん2017/03/12(日) 18:22:04.37ID:hfd+YsXW
>>892
過去に苦労して分割したデータは残っているんでしょ?
分割前→分割後が。

それは有効活用できるよね?
0894デフォルトの名無しさん2017/03/12(日) 18:28:58.89ID:8PQIIyGz
>>892
そういうバッチ的な処理はPowershellなど他の言語を使ったほうがいいよ
VBAは他にVBAよりマシな方法がなさそうな場合にのみ使うべき
レガシーな処理系に依存するとシステムが急速に劣化してビジネスにも悪影響が出る
0895デフォルトの名無しさん2017/03/12(日) 18:45:25.89ID:yxXc/NUJ
苗字なんか1万種もないんだからVBA使わないでMATCHとINDEXで分離できるよ
0896デフォルトの名無しさん2017/03/12(日) 18:47:29.34ID:yxXc/NUJ
補足 配列数式つかって
0897デフォルトの名無しさん2017/03/12(日) 18:51:29.08ID:JBCvlAvk
>>892
現状は手作業で分割してるの?分割しないと投げらんない仕様なの?
0898デフォルトの名無しさん2017/03/12(日) 19:03:44.40ID:6iMHIBm5
もういいんじゃね
>>838 にも色々事情があるんだろうしそれはたぶんスレ違いだろうし
0899デフォルトの名無しさん2017/03/12(日) 19:08:37.96ID:8PQIIyGz
もっと面白い話題ないのかよ
宿題といてください(意訳)の繰り返しはもう飽きた
0900デフォルトの名無しさん2017/03/12(日) 19:11:35.65ID:WG9HLLmd
その宿題僕には出来ないので面白くありません(意訳)
0901デフォルトの名無しさん2017/03/12(日) 19:57:02.25ID:PCuufyBR
昨日の>>847だけど、どうしても分からん!
教えてください・・orz
0902デフォルトの名無しさん2017/03/12(日) 20:00:57.80ID:8PQIIyGz
>>901
宿題は自分でやりなさい
0903デフォルトの名無しさん2017/03/12(日) 20:25:19.16ID:991oSHP/
>>901
>>859の回答で解決してないの?
あれで良いと思うんだけど。
0904デフォルトの名無しさん2017/03/12(日) 20:33:51.98ID:PCuufyBR
>>903
俺のやり方が悪いのかな・・
Dir使ってて、その>>859のコードをプラスしたんだけど。
0905デフォルトの名無しさん2017/03/12(日) 20:41:30.36ID:991oSHP/
>>904
dir は全く関係無い
元の>>847のコードの保存先指定部分を>>859のに置き換えるだけ。
要するに最初の保存の時点で所定のフォルダを指定している。
0906デフォルトの名無しさん2017/03/12(日) 20:43:06.37ID:PCuufyBR
ごめん、再度説明

デスクトップ上に「集計分」というフォルダがあって、
そこに既に各月(集計分_○月分)のフォルダがあるってイメージ。
そこに作成した集計分_20170312(今日の日付・コード作成済み)を格納したい。
俺はifとかDirを使って格納するんじゃないのかな〜って想像してたんだけど。
0907デフォルトの名無しさん2017/03/12(日) 20:43:49.14ID:PCuufyBR
>>905
ありがとう、ちょっとやってみる
0908デフォルトの名無しさん2017/03/12(日) 20:48:49.74ID:PCuufyBR
ひょっとして>>859はファイル名を付けて保存も含んでるの?
俺が>>847で作ったコードを改良してくれてるから、>>847のコードは特に必要ない?
0909デフォルトの名無しさん2017/03/12(日) 20:49:15.74ID:991oSHP/
何の為に dir とか if とかを使うの?
意味分からない。

saveasで保存先のフォルダもファイル名も指定出来るんだから
それでいいじゃん。
0910デフォルトの名無しさん2017/03/12(日) 20:52:12.07ID:PCuufyBR
>>909
Dirとかifで「3月分のフォルダがあったら〜格納」みたいに考えてた。
そうじゃなく、>>859のコードでファイル名もつけられるし、しかるべき場所に格納も出来るってことなの?
0911デフォルトの名無しさん2017/03/12(日) 20:57:37.67ID:991oSHP/
>>859で省略されてるところも全部書いたらこんな感じだな。
半角のダブルクォーテーションは俺の環境だと使えないんで全角に置き換えてます。

ActiveWorkbook.SaveAs filename:=WC:\Users\IchiroSuzuki\Desktop\集計分\集計分_W & Month(Date) & W月分\今日の集計W & Format(Date,WyyyymmddW) & W.xlsW
0912デフォルトの名無しさん2017/03/12(日) 21:03:00.05ID:991oSHP/
ちなみに、フォルダが存在していない場合はエラーになるけど、
それは

あらかじめフォルダを作っておくか、

エラーを無視するようにするか、

フォルダの存在を確認して
存在していない場合にフォルダを作成してから保存するか、

などいくつかの対応が考えられる。
0913デフォルトの名無しさん2017/03/12(日) 21:15:19.30ID:T4N3k6YJ
>>892
なんとなくイメージできたわ 詳しくありがとう
有償でも無償でも姓名辞書で姓と名で分割してるのがあるからそれ使うといい
姓の辞書の最長マッチと苗字と判断(確実を期すなら下の名前のほうもマッチさせてダメなら人間判定に回す)
辞書のデータ量が増えるとそれなりアルゴリズムが必要
0914デフォルトの名無しさん2017/03/12(日) 21:32:45.78ID:5b1jkY/Q
>>911
それ拡張子がxlsなら、パラメータにxlExcel8付けないと大変なことになるわよ〜!
0915デフォルトの名無しさん2017/03/12(日) 21:48:24.70ID:BMmtwfSE
>>847
PowerShell で書いた。
フォルダ内には、名前が today_20170311 のファイルが、1つだけ入っていると仮定する

# フォルダ内のすべてのファイルを取得する
$files = ls

# ファイル名の拡張子を除いた部分
$baseN = $files[0].BaseName

# 後ろから8文字
$day = $baseN.substring($baseN.length - 8, 8)

# DateTime オブジェクト
$dateT = [DateTime]::ParseExact($day,"yyyyMMdd", $null)

# 20170311の201703
$folderName = $dateT.ToString("yyyyMM")

# 移動先フルパス
$fullPath = "パス" + $folderName

# ファイルを移動
move $files[0].FullName $fullPath
0916デフォルトの名無しさん2017/03/12(日) 22:02:41.54ID:3emMpteW
>>910
>>865がまさにそのつもりで作ったんだがな
DirじゃなくてFileSystemObjectを使ってるのが違うくらい
ただ>>883が言うようにフォルダ検索してるfor eachは要らなくて、folderExistメソッドで有無を判断できるからそこはもう少し短縮化できる
てか、ファイル有無もFileExistで行けるからif分のネストだけで行けるなw
あくまでもとあるファイルを移動する、と言うことであればね
0917デフォルトの名無しさん2017/03/12(日) 22:09:43.94ID:LzZ9VM9C
>>910
それは、先の月のフォルダは作っちゃいけないの?
作ってもいいなら、事前に1年分作っておけばいいと思うんだけど。
そうすれば、あったらとか無かったらとか考えなくていい。

For a = 1 to 12
 MkDir "C:\Users\IchiroSuzuki\Desktop\集計分\集計分_" & a & "月分"
Next a
0918デフォルトの名無しさん2017/03/12(日) 22:40:06.90ID:cJrFgBqf
>>917
俺なら変数名はmにする
0919デフォルトの名無しさん2017/03/13(月) 10:16:22.87ID:h6W41j8f
これは好みだが
俺なら 1〜9月は 01〜09 にする
0920デフォルトの名無しさん2017/03/13(月) 10:41:01.32ID:oe9KtmsD
集計分フォルダのファイル名に集計分と入れる必要もない
0921デフォルトの名無しさん2017/03/13(月) 10:57:07.53ID:bNauL2tg
そして、年が入っていないと1年後絶対に後悔する。
正解はコレ
    Dim d As Date
    d = Now()
    
    Dim Path As String
    Dim fso As New FileSystemObject
    
    Path = Environ("userprofile") & "\desktop\集計分"
    If Not fso.FolderExists(Path) Then fso.CreateFolder Path
    
    Path = Path & "\" & Format(d, "yyyymm")
    If Not fso.FolderExists(Path) Then fso.CreateFolder Path
    
    ActiveWorkbook.SaveAs Path & "\今日の集計" & Format(Date, "yyyymmdd") & ".xlsm", xlOpenXMLWorkbookMacroEnabled
0922デフォルトの名無しさん2017/03/13(月) 11:04:39.97ID:bNauL2tg
みんなあえて答え避けてるんだろうけど、ガチ回答だったとしたらこのスレアホばっかだわ

あとこういう関数もあるから、条件次第ではこれもアリ
「存在しないパスのフォルダを一発で作成する」
http://officetanaka.net/other/extra/tips07.htm
0923デフォルトの名無しさん2017/03/13(月) 11:31:21.85ID:pd5G97r+
唯一無二の正解なんて無いよ
動けばいいんだよ
0924デフォルトの名無しさん2017/03/13(月) 11:37:02.59ID:w4xeXUAV
月は1桁、10〜12月はXYZで表現する業界
0925デフォルトの名無しさん2017/03/13(月) 11:58:25.83ID:Q8aLhRYX
はいはいブーメランブーメラン
0926デフォルトの名無しさん2017/03/13(月) 12:33:31.48ID:DSlNGFQE
>>922
工夫の問題だからそれは質問者が考えるべき話。
分からない部分については回答ついてるだろ。

Win32APIはわりと多用する方だが、その関数は使わない。
標準機能で出来るのに敢えて使うのは特別な理由がある時だな。
0927デフォルトの名無しさん2017/03/13(月) 13:07:15.06ID:Ru3QxnDk
>>922
ActiveWorkbookとか使っといて人をアホ呼ばわりすんなよ
0928デフォルトの名無しさん2017/03/13(月) 14:40:05.00ID:vqU4GynK
>>921
質問者がxlsを指定している事から
動作環境が古い可能性もあるので、
無条件にxlsmを使用するのは間違い。
保存するブックのファイルフォーマットを取得して、それに合わせるのが正解。
0929デフォルトの名無しさん2017/03/13(月) 15:26:11.41ID:ibPTmU9i
お前らのソリューションは
時間と質のバランス悪いな
0930デフォルトの名無しさん2017/03/13(月) 16:11:40.38ID:p1ml1meG
>>928
というか、保存するまでは出来たっていってるんだからそれを生かしてあげるべきよな
保存は別ですることに意味がある場合もあるわけだし
0931デフォルトの名無しさん2017/03/13(月) 16:29:20.95ID:bNauL2tg
お〜伸びてる伸びてる〜♪
>>928のご要望にお答えして対処してみた。

'必要に応じてパラメータに変えてね!
    Dim d As Date
    Dim WB As Workbook
    Dim Path As String
    Dim fso As New FileSystemObject
    
    d = Now()
    Set WB = ActiveWorkbook
    Path = Environ("userprofile") & "\desktop\集計分"
    
    '処理
    If Not fso.FolderExists(Path) Then fso.CreateFolder Path
    
    Path = Path & "\" & Format(d, "yyyymm")
    If Not fso.FolderExists(Path) Then fso.CreateFolder Path
    
    Path = Path & "\今日の集計" & Format(Date, "yyyymmdd")
    If WB.FileFormat = 56 Then
        If Application.Version < CInt(12) Then
            WB.SaveAs Path & ".xls"
        Else
            WB.SaveAs Path & ".xls", 56
        End If
    Else
        WB.SaveAs Path & "." & fso.GetExtensionName(WB.Name), WB.FileFormat
    End If
お兄ちゃん!これでいい?
0932デフォルトの名無しさん2017/03/13(月) 17:49:39.06ID:39nTuGxN
質問なんだけど、
now() と date が混在してるのはなぜ?
あと、ファイルフォーマット関連の部分は条件分岐入れないと拙いの?
0933デフォルトの名無しさん2017/03/13(月) 18:40:39.37ID:bNauL2tg
>>932
>>now() と date が混在してるのはなぜ?
修正し忘れたぁ〜ありがとうおにいちゃん!

>>あと、ファイルフォーマット関連の部分は条件分岐入れないと拙いの?
よくぞ聞いてくれました!!!
SaveAsメソッドはファイルフォーマット省略時の既定値がExcel〜2003ではxlsなんだけど、Excel2007〜はxlsxに変わっちゃったの!

つまり2007以降ではファイル名の拡張子をxlsにしても、内部形式はxlsxなので次に開いたときに「ファイル壊れてるよ?」って怒られちゃうの。ついでにマクロが消えちゃう!

更にExcel2003で,xlExcel8(,56)を指定すると実行時エラーで「そんなの無いよ?」って怒られちゃうの
ちなみにxlExcel8を入力すると2003ではコンパイルエラーになっちゃう!エクセルのばーかばーか!

ど〜してもxlsが良い!!!って要望ならExcel2003が存在する可能性が高いので3段階の切り分けが必要なワケ

おにいちゃん分かった〜?
0934デフォルトの名無しさん2017/03/13(月) 18:43:02.75ID:bNauL2tg
あ〜疲れた。
スルーされたからブチ切れで暴れてしまったが、>>932のお陰で眠れそうです。
ありがとうございました。
0935デフォルトの名無しさん2017/03/13(月) 18:44:41.47ID:FayKVqy2
JCプログラマかな?ちんこ勃った
0936デフォルトの名無しさん2017/03/13(月) 18:55:14.86ID:39nTuGxN
>>933
ゴメン、よくわかんない。
今手元にマクロ動作環境が無いので自力で検証出来ないんだけど、
新規作成したブックの初回保存時ならともかく、
Activeworkbook が対象の時点でそのファイルでは
ファイルフォーマットと拡張子の不整合は存在していないと思うんだけど、
そういう時でも不整合が起こり得るの?
0937デフォルトの名無しさん2017/03/13(月) 19:03:45.79ID:WfgCl99Q
>>933
ライブラリ作ってるならともかくツールなら決め打ちでいいだろ
まあちんけな知識を披露したかったんだろうけどオナニーにしかなってない
0938デフォルトの名無しさん2017/03/13(月) 19:23:34.26ID:FayKVqy2
スマンw
俺がJCだと看破してしまったばかりに要らぬ嫉妬をまねいてしまったなw
0939デフォルトの名無しさん2017/03/13(月) 19:27:41.74ID:bNauL2tg
>>937
最高に気持ちよかった。ぺろぺろ
>>936
確かにxls形式をSaveAsでxlsに保存する分には問題無いみたい。
危険なのはWorkbooks.AddやActiveWorkbook.SaveAsする場合かな。
そもそも出力形式くらい決めうちにし〜やって話やな。
入力フォーマットに合わせてSaveASで出力フォーマットを変える状況が考えられない。
0940デフォルトの名無しさん2017/03/13(月) 19:45:26.61ID:bNauL2tg
あ、検証したのはExcel2016なので、当時(極一部の企業で)大事件を起こした頃に使われていたExcel2007の挙動がどうかはわかりませんのであしからず。
0941デフォルトの名無しさん2017/03/13(月) 21:10:20.75ID:KRsK3ylh
初心者だって言ってるんだから、
格好悪くても、こういうシンプルなので良いんだよ。

On Error Goto Z
ファイル作成
Exit Sub

Z:
フォルダ作成
ファイル作成
0942デフォルトの名無しさん2017/03/13(月) 21:15:50.13ID:42UsHZt3
>>941
せっかくだから色んな手順踏んだほうがいい経験になるんじゃね?
Dir関数とかまあ、その辺もいいけどファイル扱うなら結局fso安定じゃん
0943デフォルトの名無しさん2017/03/13(月) 21:24:02.22ID:F+UNOx6N
こんばんは>>847です。
試行錯誤の末、出来ました!
動いた時ちょっと感動しましたw
ありがとうございます。
0944デフォルトの名無しさん2017/03/13(月) 21:32:38.50ID:42UsHZt3
>>943
結局どうやって実装したの?
0945デフォルトの名無しさん2017/03/13(月) 21:33:30.62ID:ibPTmU9i
>>943
いやなに
礼には及ばんよ、
いつか他人を助けてやってくれ。
0946デフォルトの名無しさん2017/03/14(火) 00:24:42.12ID:pXYRmO5x
あらためてVBAはクソだなぁと思いました
VBAを勉強するよりVBAでやりたいタスクをVBAを使わず解決する方法を勉強したほうが有益
0947デフォルトの名無しさん2017/03/14(火) 00:38:14.29ID:6pSq6rsv
お好きなように
0948デフォルトの名無しさん2017/03/14(火) 06:33:12.09ID:PpBlx+Gr
定期的にVBAから離れて他言語を使う事を勧めてくる輩がいるけど
実際にやると同じ機能の実装でもくっそ面倒な事になるんだよな
0949デフォルトの名無しさん2017/03/14(火) 06:47:06.91ID:4i8r16Ig
>>948
当たり前だけど COM 経由なら VBA とたいして変わらないよ
例えば >>915 の PowerShell の例とか見ればわかると思う
0950デフォルトの名無しさん2017/03/14(火) 07:48:18.42ID:pXYRmO5x
>>948
何をやるかだろ
さっきまでやってたような問題とかバッチ処理は他の言語のほうがやりやすい
右クリックメニューを拡張とかだとVBAが現実的
0951デフォルトの名無しさん2017/03/14(火) 09:40:58.58ID:UKVDZFlu
>>948
Excel上で他言語は不便だろうけど、そこを離れて他言語を使うことを勧めてるんじゃないかと想像
特にデータ蓄積関連でExcelに拘るのは損するだけだ
0952デフォルトの名無しさん2017/03/14(火) 10:10:18.88ID:okEkIV3l
こだわるって漢字難しいな
0953デフォルトの名無しさん2017/03/14(火) 10:40:59.54ID:FZyQm7Ji
やむを得ない事情がない限りはエクセルのオブジェクトをゴニョゴニョする用途以外で使うべきじゃないだろうね
0954デフォルトの名無しさん2017/03/14(火) 11:17:21.88ID:Pnt4yGVI
結局、入力と出力がエクセルの場合はVBAのほうが開発速度が早すぎて他の言語使うメリットが感じられないわ。
他の言語でExcel操作したことあるけど、VBAみたいに自由にトレース出来ないから、デバッグが面倒くさすぎたわ。
0955デフォルトの名無しさん2017/03/14(火) 11:27:29.02ID:UKVDZFlu
>>953
ん、VBAを?
0956デフォルトの名無しさん2017/03/14(火) 12:02:34.46ID:in0KUcE+
すでにあるブックのセルに色を塗るとか罫線を引くとか、外部からやるのは面倒すぎる
VBEならコードを2行書けばいいし、(3行目は自動的に補完される)
コンパイルは書くと同時だし、実行もF5をポンと押すだけ

別言語でも同じ手間で実現できる方法があればこっちが教えて欲しいぐらい
0957デフォルトの名無しさん2017/03/14(火) 12:10:37.91ID:uRpcru+d
>>954
最初の一発がほんと早いのよねー
0958デフォルトの名無しさん2017/03/14(火) 13:09:34.02ID:qHSOlZCd
>>956
ん?
1行で書けるけど?
(New-Object -ComObject 'Excel.Application' -Property @{Visible = $true}).Workbooks.Open('xxxx.xlsx').Worksheets.Item(1).Cells.Item(1,1).Interior.Color=256
0959デフォルトの名無しさん2017/03/14(火) 13:30:39.08ID:FZyQm7Ji
>>955
そうだよ
0960デフォルトの名無しさん2017/03/14(火) 13:43:16.47ID:PYKp6fvN
>>958
的外れなレスって楽しいよね
俺も毎日やってる
0961デフォルトの名無しさん2017/03/14(火) 14:02:50.85ID:Pnt4yGVI
>>958
こういうのって毎回インテリセンス使って入力してるの?
特に出だしの部分とか、まっさらの状態から書けって言われたら俺泣いちゃうわ
0962デフォルトの名無しさん2017/03/14(火) 14:09:42.16ID:sXaakNNH
VBAだってマルチステートメントで1行にできるもんっ!

>>961
Powershellだって、何度もやってれば暗記すると思うよ
俺はインテリアカラーの綴りが自信ないわ
手入力したことないメンバ名は正確に覚えてないのが結構ある
0963デフォルトの名無しさん2017/03/14(火) 14:18:32.07ID:/ZkZ9VAV
PowerShell_ise でも、[. -]などの後に、自動で候補が出る

オブジェクト. で、メソッド・プロパティ候補も出る
0964デフォルトの名無しさん2017/03/14(火) 16:12:38.20ID:vIMzEjCF
なにをやるか次第だよ
>>956みたいな一発ものはVBAがいいしVBAはそういう用途のためにある
言語機能が貧弱だから便利関数が用意されてないものを自前で実装しようとすると大変だし
管理面も弱いからバージョン管理するにもエクスポート・インポートで工夫するかアドインが必要
他の言語を理解せずにVBAがと同じように書こうとしてれば面倒なだけだろうね
0965デフォルトの名無しさん2017/03/14(火) 16:36:10.41ID:vIMzEjCF
Python+xlwingsだとこんな感じ
2行目は必須じゃない
IDE使えばF5を押すだけで実行可能だしvimやemacsみたいなエディタでもキーバインド割り当てればいいだけ

import xlwings as xw
from xlwings.constants import RgbColor
xw.Book('sample.xls').sheets('Sheet1').range('A1').color = RgbColor.rgbAqua
0966デフォルトの名無しさん2017/03/14(火) 16:48:45.13ID:V7Lg+nlP
趣味の領域だな
0967デフォルトの名無しさん2017/03/14(火) 17:14:59.28ID:6pSq6rsv
各自、所期の目的が達成できるんなら好き勝手に自分の得意なツールでやりゃいいだろ。
ここはVBAのスレだっての
0968デフォルトの名無しさん2017/03/14(火) 17:26:48.66ID:vIMzEjCF
>>967
>>956が教えて欲しいくらいって書いてるのに何キレてんの?
0969デフォルトの名無しさん2017/03/14(火) 17:34:17.81ID:V7Lg+nlP
>>968
普通の人は、まずpythonがインストールされてません。
0970デフォルトの名無しさん2017/03/14(火) 18:28:30.98ID:qHSOlZCd
>>960
なにネタに食いついてるんだよ w

>>961
これはすべて手打ち
ISE で補完ができると言ってもしょせん動的型付け言語なのでそれほどありがたみがないしね
なので慣れたエディタの方が楽
0971デフォルトの名無しさん2017/03/14(火) 18:30:59.45ID:qHSOlZCd
>>969
今時 PowerShell ぐらいは入ってるでしょ
0972デフォルトの名無しさん2017/03/14(火) 18:39:18.48ID:PpBlx+Gr
個人で使うなら自由にいろいろなもんインストール出来るから入ってる入ってないは問題にならないし、
VBA使わなきゃならないような企業はインストール出来ないから無い物として考えるべき。

VBA自体がリテラシーの低い会社での規制の抜け穴として利用されている場合が多いし。
0973デフォルトの名無しさん2017/03/14(火) 19:08:35.60ID:i+R2+qjf
VBAって人も言語も進歩しないから面白い話題がないんだよね
0974デフォルトの名無しさん2017/03/14(火) 19:29:17.97ID:xnvwc2Pv
工夫の世界だからなあ
0975デフォルトの名無しさん2017/03/14(火) 19:32:07.39ID:CJRugdQQ
>>973
お前進歩してないもんなw
0976デフォルトの名無しさん2017/03/14(火) 19:34:58.72ID:PpBlx+Gr
VBAは枯れた技術の結晶である事が長所だからな。
っていうか何十年も使われてきて、今更「こんな使い方あったよ!」ってのがあるはずもなく。
0977デフォルトの名無しさん2017/03/14(火) 19:45:13.65ID:7FwA8XeC
そうなると他の言語とかツールとかの連携とか無理やり話題を作るしかないじゃん?
宿題スレで満足なのか?
0978デフォルトの名無しさん2017/03/14(火) 19:52:14.45ID:PpBlx+Gr
ここ質問スレだから質問に答えるのが主目的だろ。

知識の蓄積が目的ならGithubかQiitaかでやりゃいいし、
質問が気にくわないなら無理矢理参加せずに静観すりゃいい。
0979デフォルトの名無しさん2017/03/14(火) 19:55:38.81ID:ucKh0CXl
excel限定じゃなくてwordとかoutlookが聞きたいなぁ
なんでもスレは人いなくて…9
0980デフォルトの名無しさん2017/03/14(火) 19:59:56.60ID:CJRugdQQ
>>979
コイツら「刺激が欲しい」みたいな事言ってるから聞けばよろこんで答えるんじゃない?

まあ実際は答えられないからアレコレ難癖つけて叩かれると思うけどw
0981デフォルトの名無しさん2017/03/14(火) 20:23:16.29ID:qHSOlZCd
>>976
ちょっと上で Filter 関数で盛り上がってたけどな w
0982デフォルトの名無しさん2017/03/14(火) 20:28:34.50ID:UKVDZFlu
ちょっと使いにくいよぉ
0983デフォルトの名無しさん2017/03/14(火) 20:46:30.20ID:vIMzEjCF
>>969
それはご愁傷さま
0984デフォルトの名無しさん2017/03/14(火) 20:46:58.09ID:213D/D06
アウトルックは魔境だわ
0985デフォルトの名無しさん2017/03/14(火) 21:16:20.06ID:XXvmx24a
>VBA自体がリテラシーの低い会社での規制の抜け穴として利用されている場合が多いし。

ああ、うちの会社だ。
しかも、LibreOffice導入によるExcel廃止を阻止して、
どうにか手に入れたVBA。
0986デフォルトの名無しさん2017/03/14(火) 22:01:35.12ID:FIaYW+rH
>>978
ギッハブはなんかの記事中で紹介しないとダメだけど最近のQiitaでは質の低下がひどい
0987デフォルトの名無しさん2017/03/15(水) 01:56:35.46ID:IsHCJowS
>>986
だからここで最新のプログラミング技術について議論しようってのか?
ここはエクセルマクロスレだぞ?
頭湧いてんのかお前w
0988デフォルトの名無しさん2017/03/15(水) 05:41:24.35ID:8JhP7Jbn
最新のプログラミング技術って今は何なんだろうな。

大抵のホットトピックスは、そのコンパイラ言語やらOSやらの範囲に限って初めて出来ましたとか、
昔に比べて簡単になりましたっていうだけの話題で、概念そのものがありませんでしたっていう話ではないし・・・。

モンテカルロ木探索のビジネス上の応用可能性についてとかかな?
0989デフォルトの名無しさん2017/03/15(水) 07:34:58.31ID:xbnVT4mx
>>988
ブロックチェーンじゃね
0990デフォルトの名無しさん2017/03/15(水) 08:17:26.45ID:tOWv6hZa
オブジェクト指向すらサポートされてない言語のスレでする話題じゃないと思います、はい
0991デフォルトの名無しさん2017/03/15(水) 08:46:33.87ID:AelFluvT
「天は自らタスクるものをタスク」と言うじゃないか。
自分でサポートすりゃいいんだよ。
0992デフォルトの名無しさん2017/03/15(水) 10:47:03.86ID:aAnOhLeg
Collectionに同一のClassのインスタンスを複数入れてて
それらのインスタンスをその中のある1つのプロパティを基準にソートしたいんですが
ExcelVBAにおいてそのための定番的方法とはどんなものですか?
0993デフォルトの名無しさん2017/03/15(水) 10:48:23.43ID:aAnOhLeg
[例]
Personクラスに
ageプロバティがあって
Collectionのpersonsをageの若い順にソートした状態でpersons(1)、persons(2)・・・として並べておきたい。
0994デフォルトの名無しさん2017/03/15(水) 11:06:26.97ID:x9/45mQV
>>971
pythonの話をしてるんですが
0995デフォルトの名無しさん2017/03/15(水) 11:08:37.82ID:x9/45mQV
>>992
定番的方法なんて存在しないので、自力でなんとかしてください
0996デフォルトの名無しさん2017/03/15(水) 11:26:05.75ID:AelFluvT
>>992
Collection限定?
0997デフォルトの名無しさん2017/03/15(水) 12:28:14.65ID:fPN0NuJ/
>>992
他の人に頼む
0998デフォルトの名無しさん2017/03/15(水) 12:38:26.52ID:SxG8JjnM
>>992
並び替えてから入れる
0999デフォルトの名無しさん2017/03/15(水) 12:38:56.44ID:SxG8JjnM
1000
1000デフォルトの名無しさん2017/03/15(水) 12:39:18.72ID:SxG8JjnM
1000
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
life time: 25日 12時間 56分 53秒
10021002Over 1000Thread
2ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


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

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

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

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