2ちゃんねる★スマホ版★■掲示板に戻る■全部1-最新50

Excel VBA 質問スレ Part47 [無断転載禁止]©2ch.net

1 :
2017/03/15(水) 15:04:34.34 ID:SB1qQF57E
ExcelのVBAに関する質問スレです
コード書き込みや作成依頼もOK

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

※関連スレ
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/
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
2 :
2017/03/15(水) 15:49:09.42 ID:kLT26yGF0
おつ
3 :
デフォルトの名無しさん (ワッチョイ bfb2-lHz+)
2017/03/15(水) 16:03:44.51 ID:qp+ADeck0
1おつ
4 :
2017/03/15(水) 17:47:18.74 ID:tXDGdK2ja
おつかれーしょん
5 :
2017/03/15(水) 19:07:50.21 ID:vLzxteC2M
それでは宿題をどうぞ
6 :
2017/03/15(水) 19:17:51.77 ID:AelFluvTd
今どき
Application.ScreenUpdating = False
なんてしないよね?
7 :
2017/03/15(水) 19:26:19.15 ID:qp+ADeck0
するよ?
ただExcel2013,2016対策でその一文で済まないことが出てきたけど・・・。
8 :
2017/03/15(水) 19:59:24.70 ID:9x7Uk/iK0
>>6
するでしょ
セルへの書き込みいちいち描写すんの?
9 :
2017/03/15(水) 20:25:29.85 ID:AelFluvTd
>>7-8
最近では自分はほとんどしなくなった
要所要所でしか書き込まないからちょうどいい進捗確認になる。
10 :
2017/03/15(水) 20:42:29.87 ID:SxG8JjnMx
>>6
そうね
recordset張り付けがほとんどだから
11 :
2017/03/15(水) 22:06:14.60 ID:8JhP7Jbn0
確かに高速化する過程で描画とかあんまり関係無くなるよな
でも昔作ったクラスを流用してるから計算と警告止めるついでに描画が止まる
12 :
2017/03/15(水) 22:35:50.60 ID:9x7Uk/iK0
まあ確かにあんまりパチパチ書き込みせんな
めんどくさくて適当に作ったときは使う
13 :
2017/03/15(水) 22:59:51.14 ID:SQ1wYD/X0
前スレ>>988
>最新のプログラミング技術って今は何なんだろうな。

操作するだけで勝手にプログラムを書いてくれる技術。
これ以上のものはないんじゃないの。
14 :
2017/03/15(水) 23:17:02.77 ID:9x7Uk/iK0
>>13
マクロの記録か!?
15 :
2017/03/15(水) 23:27:52.02 ID:qp+ADeck0
>>14
実は20年前にExcelは時代の最先端を進んでいたということかっ!?
16 :
2017/03/15(水) 23:53:07.36 ID:FiGu7lnE0
マクロレコーダーならEmacsやVimのほうが歴史が古いと思うぞ
17 :
2017/03/16(木) 02:30:58.40 ID:BRJmk+vj0
>>16
プログラムコード書いてくれたっけ?
18 :
2017/03/16(木) 09:36:54.17 ID:CmubgaKBd
モジュールのエクスポートってエクスプローラにドラッグ&ドロップするだけでいいんだな。
今まで律儀にプロジェクトから右クリックメニューからエクスポートしてたわw
19 :
2017/03/16(木) 10:43:45.54 ID:nbrWiG2Ia
マジかw
めっちゃ便利じゃねえか!
もしかしてインポートも?
20 :
2017/03/16(木) 11:50:16.42 ID:CmubgaKBd
>>19
Yes.
さっき多数の.basモジュールをExcelからPublisherに移動させるときに気づいた。
21 :
2017/03/16(木) 15:58:53.62 ID:wlBz8l330
質問です。
今日になって、いつも使用しているマクロの途中でExcelがハングアップするようになりました。

環境はWindows 7 pro 32bit、Excel 2010
発生するタイミングをトレースしたところ、Workbook.Open()メソッドでした。

全体的なフローとしては、
 001.xlsxを読取専用で開く
 →データを解析
 →閉じる
 →条件を観たした時、001.xlsxを書き込み可で開く※ココでエラー発生
となります。

・閉じた後のメモリの開放が不完全なのかと思い、Set WB = Nothingをしましたが効果はありませんでした。
・2回目に書き込み可で開く直前に、001.xlsxを空の新規ファイルに差し替えましたが、同様のエラーが出ました。
・他のPCも同様にダメでした。
 (Windows10 Excel2016で試した場合はハングアップしない代わりに、Open直後でマクロが強制終了されたかのような状態になりました。)

※初回は大人の事情でどうしても読取専用で開く必要があります。
※関係あるかは不明ですが、昨日Windowsの更新がありました。

皆様の知恵をお貸し下さい。よろしくお願い致します。
22 :
デフォルトの名無しさん (ワッチョイ cf42-9jmm)
2017/03/16(木) 16:20:35.41 ID:p/OuygEJ0
とりあえず、簡単にこれとか試すのは?
これが通るなら元の2行目の何かがいけない。


001.xlsxを読取専用で開く
→ たとえば1+1を計算して見る
→閉じる
→001.xlsxを書き込み可で開く
23 :
2017/03/16(木) 16:45:47.11 ID:TdHpVUldM
とりあえず困った時はdoeventsを間にかます
nothing の次ぐらいに書いてみたらどないだ?
24 :
デフォルトの名無しさん (ワッチョイ efa6-tpgq)
2017/03/16(木) 16:50:01.07 ID:FSeN9Ukg0
質問です
VBEでマクロを修正後実行しても再コンパイルされず
修正前のものが実行される時があります
強制的に再コンパイルさせる方法ってないでしょうか
25 :
2017/03/16(木) 17:19:28.88 ID:tDvUwYEMH
>>24
> 修正前のものが実行される時があります
気のせいだと思うけど、もし本当にそうなら、VBEのメニューの「デバッグ->VBAプロジェクトのコンパイル」でコンパイルできる。
26 :
デフォルトの名無しさん (ワッチョイ efa6-tpgq)
2017/03/16(木) 17:58:10.29 ID:FSeN9Ukg0
>>25
ありがとうございます
メニューの目の前にあったとはw はずかしい

時々エラーを修正してもエラーが続いて「なんでだーー」と嵌り、
再コンパイルされてないとやっと気づいでexcelの再起動で対処
面倒くさくていらついていました
27 :
2017/03/16(木) 18:16:32.83 ID:wlBz8l330
>>22
書き忘れて申し訳ないのですが、上記の処理を連番になっているファイルに対して順番に実行するようになっており、処理する順番を色々並び替えた結果、発生する周回数はランダムで一定以上重い処理が続いた後に起こる傾向がありました。
一応空のファイルを100個用意して回してみましたが、軽い計算では発生しませんでした。
>>23
なるほど!DoEventを試してみます。
28 :
2017/03/16(木) 18:21:45.32 ID:wlBz8l330
>>26
変数を未定義のまま実行して、デバッグ中に未定義だった変数を定義すると停止しても永久にエラーが出るようになるね。
やってしまったら、エクセル再起動か該当の変数を使ってるマクロを切り取りして一度コンパイルを通す必要があってめんどくさい。
だから実行前には必ず手動でコンパイルするような癖がついたわ。
29 :
2017/03/16(木) 19:06:57.17 ID:PUp87fRB0
コンパイルっていうけどさ、それで何か実行ファイルが出来るっていうわけじゃないよね?
文法エラーや未定義の変数のチェックには役に立ってるけど
30 :
デフォルトの名無しさん (ワッチョイ efa6-tpgq)
2017/03/16(木) 19:08:33.20 ID:FSeN9Ukg0
>>28
マジですか
未定義でばっと作ってデバッグ修正、後から定義することがよくあるのできっとそれですね
うちのシステムがおかしくなってきてOSの再インストールが必要かと思ってました
31 :
2017/03/16(木) 19:29:13.09 ID:hC3XZAlvM
>>21 開けないファイルを右クリック→プロパティ→ブロックの解除
32 :
2017/03/16(木) 19:40:30.59 ID:CmubgaKBd
VBAで未定義変数の問題なんてあるの?
必ず初期値は決まっていると思ってたけど。
33 :
2017/03/16(木) 20:01:38.98 ID:PUp87fRB0
>>32
Option Explicit を付けたら変数の宣言を強制されるよね。それでその変数のスペルミスをすれば当然エラーになるよね
少なくとも俺はそのつもりで書いているんだけど
34 :
2017/03/16(木) 21:47:46.14 ID:CmubgaKBd
>>33
ああ、宣言してないってことか。
未定義を未初期化の意味にとってた。
スマソ
35 :
2017/03/16(木) 22:34:03.38 ID:x5pnev3p0
>>25
マジであるよ。

俺の場合、「Msgbox ""」の文を行ごと消したのに、
延々メッセージボックスが出続けた事があった。
保存して開き直したら直ったけど。
36 :
2017/03/16(木) 22:59:37.95 ID:2FaryFSh0
>>35
それってステップ実行したらどうなるんだろう
幽霊が出てくる?
37 :
2017/03/16(木) 23:53:38.39 ID:OzitRQy30
>>19
キーボードショートカットありますよね?
38 :
2017/03/16(木) 23:59:48.26 ID:OzitRQy30
>>17
プログラムコードの線引きをどこでしてるのかわからないけどExcelで実現できてることと同じだよ
39 :
2017/03/17(金) 02:10:26.92 ID:wFMeanHH0
一時期、「仕様書書くだけでプログラムを自動生成してくれるソフト」みたいなのが夢物語として頻繁に語られた事あったな。
「金が無限に湧いてくる壺」みたいなもんで、本質的にあり得ないし、あったとしても誰にも公開しないだろっていう。
40 :
2017/03/17(金) 06:58:02.45 ID:lGJhgaEjM
>>38
> Excelで実現できてることと同じだよ
違うでしょ
> たとえば現在行を消してキルリングに入れるにはC-a C-k C-kを使います。
の操作は
> (fset 'kill-current-line "\C-a\C-k\C-k")
になるけど欲しいのは
> (defun kill-current-line () "現在行を削除する"
> (interactive)
> (move-beginning-of-line 1)
> (kill-line nil)
> (kill-line nil))
だし
そのために elmacro.el なんてものがある
http://emacs.rubikitch.com/elmacro/
41 :
2017/03/17(金) 07:14:33.42 ID:lGJhgaEjM
> 本質的にあり得ない
仕様書のレベルによるでしょ
状態遷移表からコードを生成するツールは大昔から使われてるし、UML からコード生成する Rhapsody なんてものもある
まあ >>39 は Excel みたいなソフトが欲しいって入れたら Excel のソースコードが出るような奴を想定してるんだろうけど w
42 :
2017/03/17(金) 09:52:24.03 ID:JeKk6+P8r
VBAが他言語と比較して下に見られるのはどうしてだろう。
他はCとHaskellしか触ってないから他言語はちら見だけど、OOPを使わないからどれも同じに見える。

むしろ、会社のPCにはエクセルは大体入ってるからコンパイラなしでスクラッチで書けて具合がいい。
また、Office系を動かすにはこれしかないんじゃないの?
43 :
2017/03/17(金) 09:56:57.68 ID:70xhhbvzM
30年以上前の話だけど、当時のパソコン雑誌(アスキーとかI/Oとか)には
投稿プログラムの16進ダンプリストが何ページにもわたって掲載されていた。

それを読者が手打ちで打ち込んでゲーム遊んだりしてたわけだが、
何の脈絡もない数字とアルファベットの羅列をひたすら打ち込む作業は
ドラクエの復活の呪文どころではない大変さだった。

一人でやってたら辛すぎるんで、
何人かで分担を決めて打ち込んで後でマージするんだけど、
それでも辛いことにはかわりない。

ダンプリストの端に付いてるチェックサムだけを入力して
ダンプリストを生成するようなプログラムが出来ないものかと
本気で考えていた。
44 :
2017/03/17(金) 10:01:38.86 ID:wFMeanHH0
>>42
このスレでVBAの悪口を言っていたのはC言語処理系しか触った事無くて文法的に拒絶反応起こしていた奴らだな。

C言語処理系があまりにも氾濫しすぎていて、プログラム言語といえばC言語の文法って考えちゃってるんだと思う。
だから異なる文法の言語は全て本格的でない、オモチャみたいなものに見えるんじゃないの。
45 :
2017/03/17(金) 10:24:08.40 ID:ua/HmJ88a
>>44
この原因もあるけど、使い手がピンきりってレベルじゃないのもある
オブジェクト指向サポートしてないし、製品の付属品ってこともあって軽んじられるのは多少仕方ないよね
まあ俺は使うしかないから使うんだけど
46 :
2017/03/17(金) 11:14:59.17 ID:eWWVtvGxd
>>42
言うほど下には見られてないんじゃないか?
47 :
2017/03/17(金) 11:41:15.01 ID:hpHy/rBLH
>>29
> コンパイルっていうけどさ、それで何か実行ファイルが出来るっていうわけじゃないよね?
コンパイルするとP-codeと呼ばれる中間コードに変換される。
メニューからコンパイルすると、Bookを保存するときにそのP-codeも含めて保存されて、次回からはコンパイルが不要になる、みたいなことをどっかで見た記憶がある。(嘘かも)
48 :
2017/03/17(金) 11:52:37.24 ID:eWWVtvGxd
>>44
関係ないけど昔
「2chで悪口が頻繁に言われればMicrosoftも対応せざるを得なくなるよな」
と本気で言ってるやつがいた
49 :
2017/03/17(金) 11:53:19.31 ID:mgEFiKt+M
VBAはコレクションを扱うのにいちいちループ処理が必要なのがめんどい。
デフォで高階関数実装してくんねーかなあ。
50 :
2017/03/17(金) 12:00:59.79 ID:eWWVtvGxd
>>49
自力で実装
 ↓
公開
 ↓
富豪
51 :
2017/03/17(金) 14:35:00.57 ID:wFMeanHH0
高階関数って使ったこと無いけどちょっと調べた限りだとクラスを多用すれば似たような書き方に近づけそう
52 :
2017/03/17(金) 18:04:12.43 ID:4a5+BdOt0
>>40
何が違うって言いたいのか理解できないんだけど
操作内容をプログラムとして利用可能な状態で記録できてないの?
53 :
2017/03/17(金) 18:10:22.03 ID:4a5+BdOt0
>>42
汎用言語じゃなく基本的にOfficeでしか動かないにもかかわらず
ループ処理や配列処理で低いレイヤーを意識した90年代的コーディングが必要だから
あとVBAerの質の問題
54 :
2017/03/17(金) 18:13:05.09 ID:4a5+BdOt0
あーあとWindowsプログラミングでC++かVBかっていう時代に
VBはアマチュアでC++がプロみたいな印象があってその名残もあるかもね
C#かVB.NETかっていう時代になってもなぜかVB.NETは馬鹿にされがち
55 :
2017/03/17(金) 18:23:47.31 ID:dpI1G6OFM
>>52
> 何が違うって言いたいのか理解できないんだけど

>> (fset 'kill-current-line "\C-a\C-k\C-k")
これは単にキーシーケンスを記録/再生してるだけでしょ
例えば条件判断して動作を変えようとしたら Emacs のキーマクロ再生ルーチンに手を入れる必要がある

>> (defun kill-current-line () "現在行を削除する"
>> (interactive)
>> (move-beginning-of-line 1)
>> (kill-line nil)
>> (kill-line nil))
これなら Lisp と Emacs のキーバインドがわかってる人なら条件判断でもループでも組み放題ってこと
56 :
2017/03/17(金) 18:26:51.11 ID:idI0Aki4M
>>55
上の方でも動くのは動くんだろ?
自動生成にそこまで精度は求めない
57 :
2017/03/17(金) 18:43:44.26 ID:dpI1G6OFM
>>56
動けばいいというならもうなにも言う必要はないね
58 :
2017/03/17(金) 18:51:02.18 ID:eWWVtvGxd
VBAerの質っても初心者が多いってだけでしょ。
敷居が低い以上しかたのない話だね。
59 :
2017/03/17(金) 19:06:22.25 ID:ua/HmJ88a
>>58
プログラマーじゃなくてマクラー止まりがほとんどだからな
60 :
2017/03/17(金) 19:20:00.77 ID:0wlX6r36M
VB系列メインの人材って吐き気がするほど低品質なコードを生産するから業界全体で悪いイメージが定着してるんだよ
そして坊主憎けりゃ袈裟まで憎いの理論でVBまで悪者になってしまった
61 :
2017/03/17(金) 21:11:39.09 ID:4a5+BdOt0
>>55
後者のほうがコードとしては使いやすいとか読みやすいのは理解できるが
前者でも条件判断だろうがループだろうが別に使えるし
必要ならキーシーケンスにバインドされてるコマンドに変換することもできる
本質的な違いがあるようには思えないわ
62 :
2017/03/17(金) 21:22:16.33 ID:4a5+BdOt0
>>58
うーんそうじゃなくて、例えば他の言語もバリバリに使えるけど目的に応じてVBAも書くっていう人がまず少ないでしょ?
それに経歴の長い人でもメンテ不能な独善的コードを書く人が他の言語に比べて相対的に多いと思う
逆に誰でもメンテできるように仕様書やテストコードもきちんと整備して、わかりやすく読みやすいコードのかけるVBAerは超レア

※個人の感想です
63 :
2017/03/17(金) 21:47:05.87 ID:wFMeanHH0
>>62
保守性が高く、仕様書とテストコードが完璧で、分かりやすく読みやすいコードを書ける人材が、
他の言語では掃いて捨てるほどいるというのか・・・。
64 :
2017/03/17(金) 22:29:46.54 ID:z6ML212A0
計算結果を出力する以下の行でエラーでたま〜に止まる。
ws_out.Cells(LastRow_out + 1, 1).Resize(200, 12) = Out
エラーの内容は”アプリケーション定義またはオブジェクト定義のエラーです。”というもの。
エラーが出るとVBEが立ち上がってるからF8で逐次実行すると何もなかったように無事に書き込まれる。

そこで、On Error GoTo ErrorHandlerを追加し、
以下のように再帰で再び書き込もうとすると数回エラーは出るもののその後は無事に書き込めるという訳わからんことになっています。

(続く)
65 :
2017/03/17(金) 22:32:09.02 ID:z6ML212A0
なんか書きこめない・・・
66 :
2017/03/17(金) 22:34:27.02 ID:z6ML212A0
途中が書きこめない・・・なんで?

つまり、ws_out.Cells(LastRow_out + 1, 1).Resize(200, 12) = Out
で、無事に書き込めるときもあれば、書きこめないときもある。
その違いが全くわからないという状況なんです。
今のところはエラー出たら何度も書き込みをトライして無事書きこめている状況です。
なんか気持ち悪いのでエラー発生の原因を知りたいのです。
どなたかアドバイスを宜しくお願いします。
67 :
2017/03/17(金) 22:36:54.25 ID:z6ML212A0
なぜか、On Error GoTo ErrorHandlerの内容が書きこめない・・・
68 :
2017/03/17(金) 22:42:10.97 ID:z6ML212A0
>>64です。
なんか書きこめないので画像ですみません。
http://i.imgur.com/zhd3NB0.jpg
69 :
2017/03/17(金) 22:43:31.10 ID:4a5+BdOt0
>>63
「完璧」って急にハードル上げるなよ

会社や使ってる言語にもよるだろうけど
例えばそこそこの経験があるRuby使いが10人いれば少なくとも3~5人は
メンテできるように仕様書やテストコードもきちんと整備して
わかりやすく読みやすいコードのかける人っていう印象
VBAだと20人に1人いるかどうか(※あくまで印象)

VBAerの質というよりVBAと他言語の文化の違いかもね
70 :
2017/03/17(金) 22:51:28.68 ID:pi9a1Bwa0
>>64
アプリケーション定義のエラーってセルのアドレス指定がおかしいんじゃねえかと
0とか指定してんじゃね?
71 :
2017/03/17(金) 23:15:45.93 ID:woddruPm0
>>61
> 前者でも条件判断だろうがループだろうが別に使えるし
どうやってやるの?
具体的に書いてみて

> 必要ならキーシーケンスにバインドされてるコマンドに変換することもできる
それが elmacro.el
そもそも○○すればできる
って言い出したらそりゃなんでもありありだよ
72 :
2017/03/17(金) 23:29:05.33 ID:Ilx7INmz0
VBAのBがいけない。
VCAだったら誰もバカにしないだろう。
73 :
2017/03/18(土) 00:28:05.58 ID:j21tsAGgM
>>71
やるなら他でやってくれ
既にVBAの話題じゃなくなってる
74 :
2017/03/18(土) 01:49:37.37 ID:vBdYmHk50
>>71
ググるなりEmacsスレに行くなりお好きにどうぞ
別にelmacroみたいな追加パッケージが必須なわけじゃないんだよ
75 :
2017/03/18(土) 05:33:14.82 ID:1jN6Nl4i0
>>74
具体的にって言われてそれかよ w
76 :
2017/03/18(土) 09:32:02.11 ID:tmgM3nCR0
VBAは自分の仕事を効率化するためにだけ使ってる人が多いと言うことでは?
他人に引き継がせるのを想定していないのに、業務上引き継ぎを求められる時に問題となるのではないかと。
77 :
2017/03/18(土) 09:44:26.54 ID:AVWnB++fx
>>75
理解できるのw
78 :
2017/03/18(土) 10:02:12.33 ID:1jN6Nl4i0
>>77
恥ずかしいからもう出てくるなよ w
79 :
2017/03/18(土) 10:18:08.14 ID:Gq5DbfzeM
普段からエレガントなコードを心がければ別に自分用だろうがなんだろうが引き継ぎに問題はないはずなんだが…
VBAは使い捨てだから自分用だからという理由を免罪符にして雑で汚いコードを書く人ばかりだから困る
他の言語では丁寧に美しいコードを書く優秀な人ですらVBAになると所詮はVBAだし適当でいいだろと開き直る
VBAは人を堕落させるなにか不思議な力がある
80 :
2017/03/18(土) 10:33:35.52 ID:E70njaCZa
>>79
レガシー環境だとエレガントに書こうとしても理解してもらえない
81 :
2017/03/18(土) 11:57:59.67 ID:3dStCg/nM
>>78
はい
82 :
2017/03/18(土) 12:40:55.94 ID:SPZFu7Fy0
だいぶ前から特定のソースコードが書き込めないし、エラーすら出ない
なぜかNGワード判定すらスルーされて、原因を絞り込もうとすると連投エラーだけは出て絞り込みも困難

2ちゃんねるのCGIのバグだと思うけど、どうすりゃいいんだ
83 :
2017/03/18(土) 12:50:48.69 ID:E70njaCZa
>>82
ダブルクォーテーションでエラー出てたことあったしその辺の関係じゃないかな
84 :
2017/03/18(土) 13:02:12.46 ID:ySaYO4GFr
多義的な形容詞を具体例を示さずに不用意に使う人間はそういう人間なのだと思ってる。
85 :
2017/03/18(土) 13:45:10.97 ID:Gq5DbfzeM
コードを書き込むとエラーすら出ずに書き込め無いことがある
2chとはそういうもんだと諦めるんだな
不便だと思うなら他のコミュニケーションサイトを使おう
86 :
2017/03/18(土) 17:07:22.13 ID:vBdYmHk50
>>75
君はいつも自分の無知を棚に上げて嫌味な物言いだよね
煽っても教えてあげないから
つかEmacsユーザーなら少しググればすぐ分かるだろ

レコーダーで記録したマクロをきれいなコードにするには
大なり小なり編集が必要なのはどのツールでも同じ
Excelは違うと思ってるんなら別にそれでもいいんじゃない
87 :
2017/03/18(土) 17:12:42.72 ID:vBdYmHk50
>>66
これってほんとに成功するケースと失敗するケースで何も条件変わってないの?
書き込もうとしてる値とか対象とかActiveSheet/Selectionとか
intermittentなエラーってあまり聞いたことがない
88 :
2017/03/18(土) 17:18:57.64 ID:gLAUrVs40
>>70
>アプリケーション定義のエラーってセルのアドレス指定がおかしいんじゃねえかと
>0とか指定してんじゃね?
いや、エラーで止まる度に各変数の値は確認していますがそんなことはないんです。
その証拠にエラーで止まって変数確認したすぐ後にF8押すと問題なくその行が実行されるんです。
変数は書き換えてないのに・・・

殆どの場合は問題ないんですが稀に止まるという気持ち悪い状況なんです。
他に考えられる原因ってありますかね?
89 :
2017/03/18(土) 17:32:42.37 ID:gLAUrVs40
>>87
条件は変わってないはずです。もっとよく考えてみますが。
昨日もエラーでてましたが変数など書き換えずに書き込みを数度繰り返し無事書きこめました。
アクティブシートを切り替えても普段は正常に書きこめます。

書き込む値についてはあまり気にかけていませんでしたが、
エラーで止まった後にF8で問題なく実行できるので値が原因ではないような気がしますがどうなんでしょう?

>ws_out.Cells(LastRow_out + 1, 1).Resize(200, 12) = Out
のOutは標準モジュールでPublic Out(1 To 200, 1 To 12)で宣言しているものです。
型指定なしの宣言です。
90 :
2017/03/18(土) 17:44:41.47 ID:SPZFu7Fy0
Win8やWin10はアプリを終了してもすぐにプロセスが消えないことがあるんで、
条件が完全に同じかどうか使用者でもわかってない場合がある
91 :
2017/03/18(土) 19:59:50.33 ID:1jN6Nl4i0
>>86
きれいなコード?
苦しいね w
92 :
2017/03/18(土) 20:09:06.17 ID:SiDzaxEQM
>>91
恥ずかしいからもう出てくるなよ w
93 :
2017/03/18(土) 20:21:20.20 ID:1jN6Nl4i0
恥ずかしいのは後出しで「きれいなコード」とか言い出したアホなんだけど w

> 別にelmacroみたいな追加パッケージが必須なわけじゃないんだよ
と言ってどうするのかと思ったら
> レコーダーで記録したマクロをきれいなコードにするには
> 大なり小なり編集が必要なのはどのツールでも同じ
とか笑えるわ
94 :
2017/03/18(土) 20:33:19.62 ID:u64MpNEX0
元々自動生成の程度を厳密に定義してなかったからな
95 :
2017/03/18(土) 20:36:14.03 ID:ybox44GAa
>>85
書き込んだのに書き込めないとはこれいかに
96 :
2017/03/18(土) 20:38:46.38 ID:1jN6Nl4i0
97 :
2017/03/18(土) 21:06:01.70 ID:MrF88dzm0
emacsのことは知らないし今のところ興味もないんです
98 :
2017/03/18(土) 21:19:04.00 ID:vBdYmHk50
>>93
もうみっともないな
Emacs知らないのに無理して突っかかる必要ないだろ
99 :
2017/03/18(土) 21:27:23.36 ID:1jN6Nl4i0
他人にまで突っかかるようになったらおしまいやね w
100 :
2017/03/18(土) 22:58:59.74 ID:gLAUrVs40
>>90
今の環境はWin7 + Office2010 です。
101 :
2017/03/18(土) 23:38:29.66 ID:CfRBZ1GA0
>89
>Outは標準モジュールでPublic Out(1 To 200, 1 To 12)で宣言しているものです
リトライしたときにOutが戻す値が変わってるんじゃね
戻り値一回変数に受けて、エラーが出たときと出ないときで比べてみれば?
102 :
2017/03/18(土) 23:46:34.39 ID:EFRz0aVM0
最近エクセルVBA勉強し始めたど素人です。
どなたか教えてください。

ttp://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_listbox.html
↑のページに書いてあるコードを参考に検索フォームを作ってます。

検索するデータを配列mydataに格納して、検索で一致したデータをmydata2に格納するコードについてなのですが、

If myData(i, 2) Like "*" & TextBox1.Value & "*" And myData(i, 7) Like "*" & TextBox2.Value & "*" Then

上記コードは、テキストボックス1で2列目、テキストボックス2で7列目を検索していますが、
テキストボックス1で2列目〜7列目まで範囲を広げて検索をかけるようなコードにできないものでしょうか?
mydataのなかにrangeやcells等入れて試してみたんですが、なかなかうまくいきません。

どなたかご教授ください・・・
103 :
2017/03/19(日) 00:32:27.77 ID:AQDq39VFa
>>88
そら大した証拠になってない
その処理でエラーの場合明らかにワークシートかセルにたいしておかしな値を指定してるのが問題だろう
そもそもどういう処理の流れでってのがわからんとなんとも言えないのだがな
まあ、とにかく問題の切り分けだ
エラーで止まってから確認するんでなく処理の流れで確認しないとダメなこともあるんでDebug.Printか.Assert入れて各変数およびオブジェクトの値やら型やら全部確認してみて
そしたらおかしなところで止まるからそれが原因
104 :
2017/03/19(日) 00:34:49.34 ID:Xey8ybM4M
iで縦をなめてるのなら同じように横をなめればいいよ
2列目と7列目を固定で検索してるのはどこかわかれば見当つくと思う
105 :
2017/03/19(日) 00:37:39.29 ID:AQDq39VFa
>>102
for i = iの最初 to iの最後
 for j = 2 to 7
  if myData(i,j) like テキストボックスの値 then
   処理
 next j
next i

恐らくiはループ変数だと予想したんだが、間違ってないよな?
聞くときはその辺もちゃんと書いてくれないとエスパーにしか答えられなくなるぞ
106 :
2017/03/19(日) 00:38:24.11 ID:AQDq39VFa
end ifが抜けてたw
すまんな
107 :
2017/03/19(日) 08:24:55.47 ID:TEeAUA+Q0
>>102
>最近エクセルVBA勉強し始めたど素人です。

だったら、こんな難しいのじゃなくて、
Excelのフィルタ機能を使っている所をマクロ記録して、
改変するほうが簡単。
108 :
2017/03/19(日) 09:03:57.15 ID:d7txTs2Od
練習問題を否定してどうする
109 :
2017/03/19(日) 09:12:08.74 ID:7xRC3K/l0
>>102
氏名は2列目じゃなくて1列目、住所は7列目じゃなくて6列目にしないといけないのでは?
つまり
If myData(i, 1) Like "*" & TextBox1.Value & "*" And myData(i, 6) Like〜
110 :
2017/03/19(日) 09:42:20.97 ID:7GUCcHR60
likeなんて関数があるんだね。全部自作してたわ。
111 :
2017/03/19(日) 09:47:39.48 ID:h5YhjNPa0
>>109
どう見ても氏名は2列目で住所は7列目なんだが…
初心者にデタラメ教えてどうする。

>>110
関数と演算子の違いくらいわかろうぜ
112 :
2017/03/19(日) 11:30:18.32 ID:7xRC3K/l0
>>111
オッ、今はセル範囲.Value で取れる配列が 1オリジンなんだな!!!
素で間違えていたわ。スマソ
113 :
2017/03/19(日) 11:34:09.69 ID:7xRC3K/l0
>>102
自分のプログラムではセル範囲からとった配列を0オリジン(LBound = 0)に変換する関数を10年くらい使っていて
無意識のうちにそれがデフォルトの仕様だと思いこんでいた。
>>109は忘れてください。すまんこって
114 :
2017/03/19(日) 11:47:03.48 ID:7RBNWPmYM
10年も配列に取り憑かれているのか
115 :
2017/03/19(日) 12:14:39.77 ID:7xRC3K/l0
>>114
ごめん15年だった
116 :
2017/03/19(日) 12:16:55.06 ID:j3OPhkRkr
>>111
arityが2の中置関数だよ、演算子は。関数の方が概念として広い。
こういう感覚がないのだな、プログラマって。
117 :
2017/03/19(日) 12:18:45.58 ID:j3OPhkRkr
関数型プログラミングが難しいと言われてるのも分かった気がする。
118 :
2017/03/19(日) 12:30:30.27 ID:IinMJCLx0
配列の上下限を設定できる言語使ってのにわざわざ変換するとか意味わからん...
119 :
2017/03/19(日) 12:31:47.22 ID:IinMJCLx0
>>116
そんな感覚はないわ
120 :
2017/03/19(日) 12:38:41.90 ID:7xRC3K/l0
>>118
複数の配列を扱うプログラム中では下限を統一しとかないと面倒でしょ
121 :
2017/03/19(日) 12:45:05.70 ID:h5YhjNPa0
>>116
概念として 関数⊃演算子 なのはわかる。
ただVBAで関数と演算子は使い方が明確に区別されてるから、
VBAでLikeや四則演算を関数と呼ぶには物凄く違和感がある。
122 :
2017/03/19(日) 12:54:00.77 ID:IinMJCLx0
>>120
そのために下限を設定する機能があるんだが...
123 :
2017/03/19(日) 12:55:47.83 ID:BuwKrgPYM
>>121
+ を関数って呼ぶようなアスペの相手するなよ
124 :
2017/03/19(日) 13:50:34.07 ID:ZMNP6m9nd
>>122
Option Base をどうしようと
範囲.ValueのLBoundはで1SplitのLBoundは0じゃなかった?
125 :
2017/03/19(日) 14:06:34.29 ID:ZMNP6m9nd
>>123
まあこの世に数学がまずあってプログラム言語はそこから派生すると考えれば
演算子は関数の一種だし、そう考えなければ別物だし
126 :
2017/03/19(日) 18:38:46.15 ID:7xRC3K/l0
>>124
あと VBA.Array も Option Baseと関係なしに LBound=0 だね。
(Array はOption Baseの指定通りになる)
127 :
2017/03/19(日) 18:54:28.31 ID:XVhEhS/Wa
>>88
それって結構よくあることだと思うんだが。
PC再起動すれば直る。
っちゅうか、それエラーって認識なの?
確かにエラー表示だけどさ。


あれだろ、ステップ実行はできるんだけどやたら止められる奴だろ。
止まってもF5で続行できるけどすぐ別の所で止まる。
んで、止まった場所見てもおよそエラーとは考えられないようなの。
128 :
2017/03/19(日) 18:59:48.58 ID:XVhEhS/Wa
>>126
基本は0だけどvarArry=Range("C3:P250")みたいなのは1からになるだろ。
で、混在するから素直にLbound使う。
上記のようなことしないなら0使うな。
129 :
2017/03/19(日) 19:11:04.55 ID:7xRC3K/l0
>>128
混在して厄介だから統一するために
「セル範囲からとった配列を0オリジン(LBound = 0)に変換する関数を使う」
という話なんだが。
つまりvarArry=Range("C3:P250")としたあとすぐにLBound(varArry)を0にチェンジしておけばそのあと楽だ、ということ。
130 :
2017/03/19(日) 19:13:57.84 ID:XVhEhS/Wa
>>129
よくわからんな。
Lboundのまま使わんの?
131 :
2017/03/19(日) 20:45:33.05 ID:IinMJCLx0
>>130
面倒なことが好きなんだろ
132 :
2017/03/19(日) 22:06:16.39 ID:7xRC3K/l0
>>130
すごく単純化して言うと、関数の引数が ArrayA と ArrayB で、
For i : ArrayC(i) = ArrayA(i) + ArrayB(i)
みたいにして作った ArrayC が返り値だとして、
ArrayA と ArrayB のLBoundが違っていたら単純に面倒な上にArrayC のLBoundを
何にするかが問題になる。
だから全部0に統一したい。
133 :
2017/03/19(日) 22:46:34.24 ID:yQ6I5BAH0
Option Base で 0 にしときゃいーだろとめんどくさそうな流れ全然見ずにw
134 :
2017/03/19(日) 22:50:58.30 ID:7xRC3K/l0
>>133
Option Base = 0 にしといてもExcel VBAの仕様で範囲.Value のLBoundは強制的に 1になっちゃうんだよ。
135 :
2017/03/19(日) 22:56:05.51 ID:7RBNWPmYM
ABの境界チェックして違ってたらエラー
同じならCも揃えて返せば良いだろ
形の違う行列を加算するのは100円と100グラムを加算するようにおかしな行為なんだよ
素人ってこういう当たり前の感覚もないんだな
つうかまあそもそも配列をそのまま使うのがトラブルの素なんだけどな
136 :
2017/03/19(日) 22:57:38.53 ID:7xRC3K/l0
>>135
形も長さも同じでLBoundが違うだけでもおかしいな行為なのかよ?
その感覚の方がおかしい
137 :
2017/03/19(日) 23:02:05.59 ID:7xRC3K/l0
例えばArrayAはテキストファイル由来の配列データでLBound=0
ArrayBはワークシート由来の配列データでLBound=1
同じ大きさだとして、これを比較して何か結果を返す関数なんていくらでも考えられるだろ?
138 :
2017/03/19(日) 23:03:18.99 ID:7RBNWPmYM
>>136
もうすでにどっちの下限使うかで判断付かなくなってるだろ
何も悩まず自然な定義が出来ない時点でその処理はどこかがおかしいんだよ
こういうコードに対する感覚って大事だぜ
139 :
2017/03/19(日) 23:07:07.34 ID:7xRC3K/l0
>>138
だから0に統一すると言っているじゃないか
140 :
2017/03/19(日) 23:07:25.78 ID:7RBNWPmYM
>>137
それはフォワードオンリーなシーケンスとしてABを抽象化してシーケンス比較する時の話だろ
行列の加算と全く意味合い異なるんだが素人には同じに見えるのか?
141 :
2017/03/19(日) 23:10:00.23 ID:7xRC3K/l0
>>138
コードに対する感覚っていうことなら
Option Base 0 と設定しているのに 範囲.Value のLBoundが 1になるのがおかしい、
が正解なんじゃないか?

製品の仕様に文句付けても実りがないから、0に統一する関数を自分で作るというのはとても真っ当だと思うけどね。
142 :
2017/03/19(日) 23:10:23.74 ID:7RBNWPmYM
>>139
それはお前のルールだろ
世の中には1ベースの方が自然な人も沢山いるんだよ
どうしても違う形の行列を加算したいなら配列とオフセットを渡すようにしなさい
143 :
2017/03/19(日) 23:13:11.18 ID:7RBNWPmYM
>>141
アプリケーション側で指定したOption Base 0にライブラリ側が従う義理はない
当然ライブラリにそれを求めて達成できなければおかしいと考えるお前がおかしい
144 :
2017/03/19(日) 23:13:29.28 ID:7xRC3K/l0
>>140
シーケンスがどうとか関係なく出来上がった結果の配列を処理するときの話だぞ?
出来上がった配列を引数に取る関数が、その配列の由来がどこかなんて気にしないだろ。

加算:ArrayC(i) = ArrayA(i) + ArrayB(i)

比較:If ArrayA(i) < ArrayB(i) Then〜
で何の意味合いの違いがあるというのか?
145 :
2017/03/19(日) 23:15:07.60 ID:H6GrSOXqa
配列の加減を統一する関数の発想はなかったな
まあ最近はあんまり配列使わんけど
146 :
2017/03/19(日) 23:15:24.65 ID:7xRC3K/l0
>>142-143
ごめん、ちょっと意味がわからない
147 :
2017/03/19(日) 23:19:59.71 ID:7RBNWPmYM
>>144
ソースがファイルだろうがシートだろうがメモリだろうが同じ話だよ
行列の加算なら形が違うのはおかしい
形が同じならおかしくない
シーケンスの比較なら形が違ってもおかしくない
148 :
2017/03/19(日) 23:23:12.41 ID:7xRC3K/l0
>>138
Function FuncX(配列A, 配列B)
という関数があって、配列Aと配列Bが同じLBoundであるべきだ、っていうのはまあその通りさ。

俺が言っているのは、FuncXのユーザーがふたつの配列を渡したいんだけど、片方はLBound=0で他方はLBound=1のとき困るから
LBoundを0に変える関数を用意してあげる、っていう意味だぞ?
149 :
2017/03/19(日) 23:24:32.61 ID:7xRC3K/l0
>>147
「形」って何だよ?定義してくれ
150 :
2017/03/19(日) 23:28:59.32 ID:21BNG92vM
そもそもな
102のmydataの型は配列ではなくrange
そのため1スタート
その他の表にとらわれない型は0スタート

これだけの話
151 :
2017/03/19(日) 23:30:39.84 ID:7RBNWPmYM
>>148
エラーにする
オフセットを指定するようにする
配列ではなく別の抽象コンテナを作って配列をラップする

下限が違うのに勝手に下限を揃えて処理をするなんて直感に反するよ
152 :
2017/03/19(日) 23:32:15.63 ID:7RBNWPmYM
>>149
2つの配列の各次元の下限上限が同じならそれらを同じ形とする
153 :
2017/03/19(日) 23:35:33.45 ID:7xRC3K/l0
>>151
それは単に不便だ。
セル範囲由来の配列を使う場面は多い。

>>152
俺の定義は違うな
「2つの配列の各次元のサイズが同じならそれを同じ形とする」だ
154 :
2017/03/19(日) 23:38:27.57 ID:7xRC3K/l0
>>151
「勝手に」とか「直感に反する」とかいうのがまさに主観的過ぎてついていけませんね
155 :
2017/03/19(日) 23:41:41.40 ID:7xRC3K/l0
「配列とオフセットを渡すようにしなさい」
とかいうのも微妙におかしな主張であるな
156 :
2017/03/19(日) 23:43:39.33 ID:7RBNWPmYM
>>153
視覚にとらわれすぎ

>>154
重要な考え方だぞ
157 :
2017/03/19(日) 23:48:55.28 ID:7RBNWPmYM
>>155
伝統的で直感に反することなく要求を満たしている方法の筈だが?
無論最初にあげたようにエラーにするのが最も安全だ
とはいえオーバーヘッドを避けたい場面もあるからな
158 :
2017/03/19(日) 23:49:28.78 ID:7xRC3K/l0
>>156
どうでもいいよ。
単に「不便だ」、と言っている。

ユーザーにとってLBoundが違うだけでFuncXが使えないのが不便と感じるなら
LBoundを0に変える関数を用意したから使ってね、というだけのこと。
もしくは 範囲.Value をラップして LBound=0の配列を返す関数を用意するとか。

「勝手にLBoundを変えるな」とか「直感に反する」とかどうでもいいや。俺はな。
159 :
2017/03/19(日) 23:53:47.80 ID:21BNG92vM
なるほど
様々な視点があるからモノは準備はしておいて
使うかどうかは利用者に任せるよってスタンスなのね
160 :
2017/03/19(日) 23:55:52.03 ID:7RBNWPmYM
>>158
それなら別にいいぞ
勝手に変換かけたりクライアント視点で直感的でない法則で比較したりしなければな
そういうことをやると後々不便になるから
161 :
2017/03/19(日) 23:58:05.08 ID:Lj5IhMr80
あいも変わらず上から目線の嫌味な人ばっかりだね
こういう人たちが目につくからVBAerって嫌われるんだろうな

>>158
俺は君の感覚のほうが普通だと思うぞ
162 :
2017/03/20(月) 00:35:09.06 ID:vLjOgWLd0
LBoundなんて飾りなんですよ。
LBound=0の配列xのx(0)とLBound=1の配列yのy(1)は相対的に同じ位置なんだし。
163 :
2017/03/20(月) 00:43:50.45 ID:AEJU+djn0
また恐ろしくどうでも良いことでやりあってるなw
むしろ誰か>>150へ突っ込んでやれw
164 :
2017/03/20(月) 04:43:30.15 ID:Kbki2X9l0
>>132
はあ?
何が面倒なの?
全く面倒じゃ無いだろ。

ArrayCのLBoundは0にするだろ。
お前は基本0始まりじゃ無かったのか?
お前のルールでは範囲.Valueの時だけだろ1始まりにするのは。
165 :
2017/03/20(月) 05:53:42.73 ID:l0Ltc5750
プログラムに普遍的な解法なんてないから(あったら自動化されてるから)、
せめてケースを限定して取り扱い方を議論してくれ。
166 :
2017/03/20(月) 07:01:39.79 ID:LcNjV7jZ0
>>132
普通に i を 0 ベースにして
ArrayC(i+LBound(ArrayC)) = ArrayA(i+LBound(ArrayA)) + ArrayB(i+LBound(ArrayB))
ってやればいいだけでしょ
面倒なのはわかるけどそんな箇所がはそうたくさんにならないだろ
> ArrayC のLBoundを
> 何にするかが問題になる。
何が問題なのかさっぱりわからん
167 :
2017/03/20(月) 07:18:38.16 ID:vLjOgWLd0
そんなことより朝起きたらステップ実行で止まったままの状態だった
168 :
2017/03/20(月) 11:42:03.16 ID:SDewNJ4f0
そもそも、アドバンスドフィルタで済むことを、
何で複雑にやろうとするんだよ。
169 :
2017/03/20(月) 13:15:05.95 ID:LXO+ChBL0
>>121
>>125

関数と演算子って何が違うん?
基地外じゃないけど糖衣構文なだけで一緒に見えるが。
170 :
2017/03/20(月) 13:37:39.53 ID:l0Ltc5750
>>169
処理的にも概念的にも同じものだけど、
初心者に教える際に同じものとして教えてしまうと、

+ A,B
Ary = "A,B,C,D" Split ","

等の表記が何故出来ないのかっていう疑問にぶつかっちゃうからじゃない?
171 :
2017/03/20(月) 13:54:11.51 ID:LcNjV7jZ0
>>169
同じだと言えば同じだし
違うと言えば違う
比較項目を決めないと意味がないよ
172 :
2017/03/20(月) 13:56:37.31 ID:2XxH75njd
>>170
出来てもおかしくないし採用するしないの違いだけ
173 :
2017/03/20(月) 13:59:08.25 ID:6Q778giHM
>>169
CallByName
174 :
2017/03/20(月) 14:02:37.39 ID:AEJU+djn0
>>169
「VBAでは」演算子のことを普通は関数って呼ばないでしょって話。
>>170が書いてくれた理由にて。
Common Lispみたいな言語なら別に違和感ないんだけどね。
175 :
2017/03/20(月) 14:07:44.05 ID:6Q778giHM
関数は呼び出せる
演算子は呼び出せない

関数は名前がある
演算子は名前がない
176 :
2017/03/20(月) 14:09:55.53 ID:AEJU+djn0
Common Lispだと演算子っていうよりシンボルか。

あと、リファレンスなんかではOperatorとFunctionって別個の項目に書かれてない?
VBAのその辺のリファレンス見たことないけどw
177 :
2017/03/20(月) 14:48:21.64 ID:ONBQjivu0
>>175
名前の有無って言い方はおかしい

機能と文字列が対応してるって意味では同じ
記号だって文字列のうちだし、例えばAnd演算子なんか英単語そのもの

結局はオペレータとオペランドを並べる順番だとか、わかりやすさだけの問題
最後は宗教か哲学の話に行き着く
178 :
2017/03/20(月) 14:53:46.56 ID:LcNjV7jZ0
>>176
> VBAのその辺のリファレンス見たことないけどw

Function
https://msdn.microsoft.com/en-us/library/office/jj692811.aspx
Operators
https://msdn.microsoft.com/en-us/library/office/gg278416.aspx
179 :
2017/03/20(月) 15:04:02.62 ID:6Q778giHM
>>177
コンパイラの動作を考えれば分かるでしょ
関数は名前をつけて他から参照できるように処理する
演算子はその場で計算されるか対応するニーモニックに置き換えられる
関数と演算子じゃやってる事が全く違うんだよ
Andが英単語とかトンチンカンな事を言うな
180 :
2017/03/20(月) 15:07:05.39 ID:6Q778giHM
Andは名前ではなくキーワード
これ重要な
181 :
2017/03/20(月) 15:10:26.39 ID:ONBQjivu0
>>179
結局はコンパイラにどこまで処理させるかっていう設計上の問題に過ぎない
たとえば足し算を
Plus(a, b)
みたいな関数的な書き方にしようと思えば相互に変換可能だし得られる結果も等価
結局は慣れ、あるいは宗教
182 :
2017/03/20(月) 15:23:29.41 ID:2XxH75njd
2変数関数として解釈するのが普通ではあるが
183 :
2017/03/20(月) 15:26:30.29 ID:6Q778giHM
>>181
相互に変換不可能
CallByNameは演算子を使えないぞ
184 :
2017/03/20(月) 15:35:54.51 ID:LcNjV7jZ0
>>179
Variant に対する演算は1命令じゃできなくて内部の処理ルーチン呼び出すから関数とやることはたいして変わらんよ
C とかなら一部の関数はインライン展開したりもするし
185 :
2017/03/20(月) 15:37:35.97 ID:LcNjV7jZ0
>>183
だからそれはシンタックスの問題
C++ なら演算子を関数のように呼び出したりもできる
186 :
2017/03/20(月) 16:02:06.14 ID:6Q778giHM
>>185
operator +は関数のように扱えるが+演算子はそうではないだろ
つうか今はVBAの話だらな?
187 :
2017/03/20(月) 16:09:51.07 ID:l0Ltc5750
「関数と演算子の区別がつかない」と言っている人向けの解説を模索すべきであって、
「僕の考えた最強の分類」を語るべきでは無い。
188 :
2017/03/20(月) 17:02:37.76 ID:X7rTJWAq0
なんかすごく難しい話になってるけど、関数と演算子の区別なんて、「リファレンスの区分がこうなってるから」で終わりだよね
189 :
2017/03/20(月) 17:14:25.70 ID:2XxH75njd
>>188
Yes.
あるべき論じゃないもんな
190 :
2017/03/20(月) 17:22:50.30 ID:2XxH75njd
竜頭蛇尾は困る
191 :
2017/03/20(月) 17:53:48.96 ID:ONBQjivu0
VBAに限って、どう違うかわからない人のために説明すると、
「言語を作った人がそう決めたから」「丸暗記するかマニュアルを見るしかない」
てことになる

あんまり合理性はなく、むしろ歴史的な理由の方が大きい
結局は人間が適当に、あるいはリソースが少なかったために仕方なく決めたこと
言語によって使える演算子は違うし、関数だって初期のMS-BASICでは使えないか貧弱だった
192 :
2017/03/20(月) 17:54:11.68 ID:kdixSjkW0
なんか盛り上がってる・・・

>>101
そうですね、Outの内容を確認してみます。
リトライ前後でOutの内容は同じはずと思いこんでてやってませんでした。

>>103
了解しました。変数の内容を確認してみます。
debug.assert って初めて知りました。なんか便利そうです。

>>127
よくあることなんですか?再起動しか解決方法はないんですか?
できればコード修正でエラーを防ぎたいのですが・・・
193 :
2017/03/20(月) 18:16:47.53 ID:WHkWYxkrM
どうせ >>116 辺りが引っ込みつかなくなって暴れてるだけだろ w
194 :
2017/03/20(月) 18:21:21.83 ID:LcNjV7jZ0
>>186
> operator +は関数のように扱えるが+演算子はそうではないだろ
何を言ってるんだ?さて
operator は演算子を定義するキーワードだぞ

> つうか今はVBAの話だらな?
と言うなら >>188 (>>178) で終わりだろ
195 :
2017/03/20(月) 18:29:48.60 ID:vLjOgWLd0
射だよ射
196 :
2017/03/20(月) 18:30:42.95 ID:6Q778giHM
>>194
c++やり直してこい
197 :
2017/03/20(月) 18:39:12.73 ID:LcNjV7jZ0
>>196
そんなレスしかできないなら黙ってろ
198 :
2017/03/20(月) 18:53:46.84 ID:6Q778giHM
>>197
いやほんとやり直してきた方がいいよ
君の知ってるc++っておかしいから
199 :
2017/03/20(月) 19:41:59.64 ID:LcNjV7jZ0
>>198
どこがおかしいのかも指摘できないなら黙ってろ
200 :
2017/03/20(月) 20:01:28.22 ID:6Q778giHM
>>199
レス読めよ
もう書いてあるだろ
201 :
2017/03/20(月) 20:07:28.18 ID:LcNjV7jZ0
>>200
低能のやり口乙
レス番示して引用してみ
202 :
2017/03/20(月) 20:16:19.09 ID:6Q778giHM
203 :
2017/03/20(月) 20:38:28.41 ID:LcNjV7jZ0
>>202
で、どこがおかしいのかも書けないのかよ
バカですか?
204 :
2017/03/20(月) 20:44:51.60 ID:6Q778giHM
>>203
だから>>194見なよ書いてあるから
もしかしてそういう芸風なの?
205 :
2017/03/20(月) 21:10:42.30 ID:LcNjV7jZ0
>>204
やっぱり具体的に指摘できないのな w
どうせそのまま逃げ回るんでしょ
206 :
2017/03/20(月) 21:20:00.80 ID:6Q778giHM
>>205
既に具体的に書いてあるじゃん
なんで見ないふりするのよ
207 :
2017/03/20(月) 21:31:12.17 ID:vLjOgWLd0
「演算子である」は「関数ではない」を導かないから水掛け論だ
208 :
2017/03/20(月) 21:39:03.23 ID:LcNjV7jZ0
>>206
はい逃げた w
209 :
2017/03/20(月) 22:46:05.48 ID:AEzdqyypx
さて
マウンティング大会の勝者はだれw
210 :
2017/03/20(月) 23:15:23.23 ID:vLjOgWLd0
高安
211 :
2017/03/20(月) 23:33:47.39 ID:oLSEmtobM
VBA での関数/演算子の話なら >>188 で終了
212 :
2017/03/21(火) 01:08:04.88 ID:gDv70PB60
VBAのクラスにもOperatorキーワード欲しかったな。
213 :
2017/03/21(火) 09:32:12.88 ID:9jHYTXobx
あれ?
勝者はいないのかな?

時間掛けてなにも分からずw
214 :
2017/03/21(火) 09:57:56.10 ID:ilj7cuzd0
215 :
2017/03/21(火) 10:02:29.55 ID:g2yQnV2GM
>>214
サンキュー
216 :
2017/03/21(火) 10:29:49.19 ID:upZZF7qfa
>>192
結果出たら教えてね
217 :
2017/03/21(火) 12:47:48.47 ID:ilj7cuzd0
IsNumeric(Date)とIsNumeric(Now)がFalseなのが気に食わない
218 :
2017/03/21(火) 12:55:45.22 ID:upZZF7qfa
>>217
日付時刻型は数値に変換はできるけど数値ではないだろそりゃ
219 :
2017/03/21(火) 13:08:11.44 ID:ilj7cuzd0
>>218
IsNumeric(Empty)とIsNumeric("999")はTrue
IsNumeric(Null)とIsNumeric(Nothing)はFalse

これでDate型がNumericでないのは気に食わない
220 :
2017/03/21(火) 13:10:56.31 ID:ilj7cuzd0
>>219
も一つ忘れてた
IsNumeric(True)とIsNumeric(False)もTrue
221 :
2017/03/21(火) 13:15:49.31 ID:sHA4zKwN0
お前が気に食わなかろうとどうだろうと知ったこっちゃない
文句いいたきゃMSに言え
222 :
2017/03/21(火) 13:21:09.80 ID:ilj7cuzd0
>>221
だからこういう場所で言ってんじゃんかよw
223 :
2017/03/21(火) 13:23:41.95 ID:anlqUc4mM
それは俺らに解消できる質問になるの?
224 :
2017/03/21(火) 13:40:43.95 ID:ilj7cuzd0
>>223
さあ。
気に食わないから呟いただけで、賛同者がいなくて話題が続かなければ引っ込むまでさ
225 :
2017/03/21(火) 15:14:53.68 ID:62+JQA0Hd
>>217
じゃあさ、
CLng(#2017/3/21#) = CLng("42815") = 42815
なんだけど、お前は #2017/3/21# と"42815"のどっちが「数値らしさ」が上だと思う?
226 :
2017/03/21(火) 15:47:43.28 ID:HrPLjJur0
Dim V As Variant
V = "12345"
?IsNumeric(V) ・・・Trueになる
V = #1/1/2017#
?IsNumeric(V) ・・・Falseになる
これで困る場面を必死に考えたけど、全く思い当たらなかった。
普通は日付かどうかはVarType()かTypeName()で判定するし、実際どんな時に気に食わないんだろうか。
仕様が気に入らない=>VarTypeの存在を知らなかっただけ?
227 :
2017/03/21(火) 15:54:46.88 ID:xokVubGZH
毎日ID真っ赤にしてる奴はなんなんですかね
228 :
2017/03/21(火) 16:39:11.35 ID:ilj7cuzd0
>>225
見た目上で言えば"42815"の方が#2017/3/21#より整数らしい。それはそうだ。
#2017/3/21#がどんな整数になるかは変換してみるまでわからない。
しかし"型"で言えば常に数値変換できる日付型の方が値によっては数値にならない文字列型より
「数値らしさが上」だろうね。

>>226
IsNumeric=Trueが相応しい型は
Integer, Long, Double, Single, Currency, Date, Boolean だろう。
それを判定するたの条件がめんどくさいじゃないか。
229 :
2017/03/21(火) 16:48:21.45 ID:62+JQA0Hd
>>228
そうかい。別に否定はしない。
230 :
2017/03/21(火) 16:55:27.50 ID:anlqUc4mM
>>228
おまえの考える「ふさわしさ」とVBAの仕様は異なってるってだけの話
おまえのふさわしさを発揮したければそのルールを採用している言語で開発すればいい

このスレはVBAの質問スレだ
おまえの理想を語る場ではない
231 :
2017/03/21(火) 16:59:33.62 ID:ilj7cuzd0
>>230
これまでの流れを見てこういう発言をしてるんだがね。。。
232 :
2017/03/21(火) 17:02:07.12 ID:ilj7cuzd0
てゆうかさ、
「IsNumeric(日付型)はTrue であるべきだ」
に賛同の声が集まらないことに驚きを禁じ得ないねw
233 :
2017/03/21(火) 17:14:25.76 ID:upZZF7qfa
他の言語ではどうなってんのよ
234 :
2017/03/21(火) 17:44:02.71 ID:eec8ZFhb0
賛同したら仕様が変わるんですかね
235 :
2017/03/21(火) 18:18:24.25 ID:TjPLkVcte
IsNumeric 関数
https://msdn.microsoft.com/ja-jp/library/office/gg264560.aspx

> 解説
> IsNumeric は、expression 全体が数値として認識される場合は True を返し、それ以外の場合は False を返します。
> expression が日付式の場合、IsNumeric は False を返します。
236 :
2017/03/21(火) 18:38:56.03 ID:xokVubGZH
IsNumeric(#1/1/2000#)がTrueになるべきなら、IsDate(1)もTrueになるべきだな。
・・・そして混沌へ。
237 :
2017/03/21(火) 18:42:39.01 ID:ImIzgaAk0
質問です。
常に前面配置したユーザーフォームのテキストエリアに、他ブックも含めて現在選択しているセルの値をリアルタイムで反映させたい。
他ブックは、数千単位であって、全部にマクロをかけない。また、他ブックの名前は統一されていない。

ThisWorkbook に、
Private Sub Workbook_Open()
UserForm1.Show vbModeless
End Sub

Sheet1 に、
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
UserForm1.TextBox1.Text = Cells(ActiveCell.Row, ActiveCell.Column)
End Sub

上記で、開いたブックのシート内なら、リアルタイムで書き込める。でも、このselectionchangeイベントは、そのシート内のセル選択にしか反応してくれない。


また、ユーザーフォームのコマンドボタンに、

Private Sub CommandButton1_Click()

Dim telno As String
telno = ActiveWorkbook.ActiveSheet.Cells(ActiveCell.Row, ActiveCell.Column)
UserForm1.TextBox3 = telno

という風に書き込めば、ボタンを押すことで他ブックのセルを選択していても、そのセルの値を書き込める。

ボタンを押さなくても、他ブックのセルを選択することで、リアルタイムに数値を書き込む方法を教えてくだせぇ。
238 :
2017/03/21(火) 18:51:46.93 ID:HrPLjJur0
>>237
Cellsオブジェクトなどは、ブック、シートを省略すると自動的にActiveWorkbook、ActiveSheetが対象となる。
つまり、ヒントをあげるとするなら
Dim WB as Workbook
For Each WB in Workbooks
Debug.Print WB.ActiveSheet.Cells(ActiveCell.Row, ActiveCell.Column)
Next
とすると、現在選択中のアドレスがA1なら開いている全ブックのアクティブシートのA1に記載された値がイミディエイトウィンドウに出力されます。
239 :
2017/03/21(火) 18:56:53.32 ID:HrPLjJur0
>>237
他ブックのSelectionChangeイベントを拾いたい場合、クラスモジュールで
Public WithEvents App As Applicationの定義が必要
説明が面倒なので「WithEvents」で検索して
http://www.geocities.jp/vbaxl/sample/012.html
とかの記事を参考にやってみたまえ
240 :
2017/03/21(火) 19:01:18.37 ID:jV0Y+t/Y0
>>239
ApplicationレベルでSelectionChangeイベント拾える?
241 :
2017/03/21(火) 19:03:08.70 ID:jV0Y+t/Y0
イベントに頼らずタイマーで無限ループするか
SheetがActiveになったタイミングでコードを注入するかどっちかかな
242 :
2017/03/21(火) 19:06:21.66 ID:ilj7cuzd0
>>236
IsNumeric(Empty) → True
Empty = 0 → True
IsEmpty(0) → False

すでに混沌
243 :
2017/03/21(火) 19:07:35.61 ID:ImIzgaAk0
>>上
今日はもうおうち帰る。上で書いてあること明日試して、上手くできなかったらまたくるます。

SheetがActiveになったタイミングでコードを注入するってのは、メインのブックに戻ってきたときって
ことかな?
ユーザーフォームを最前面に表示しているから、ユーザーフォームを置いているメインのブックはアクティブにはならないんですよね
244 :
2017/03/21(火) 19:10:28.34 ID:RrALGwywM
245 :
2017/03/21(火) 19:11:57.70 ID:jV0Y+t/Y0
>>243
SheetChangeとかApplicationレベルのイベントを活用する
246 :
2017/03/21(火) 19:12:47.23 ID:jV0Y+t/Y0
>>244
お、拾えるのね
247 :
2017/03/21(火) 19:19:57.02 ID:72kEtT2QM
>>237
ボタンの代わりにタイマーとかで更新しまくればいいんじゃね
248 :
2017/03/21(火) 19:36:04.72 ID:upZZF7qfa
タイマーなんて勧めるなよ
最後の最後の最後の手段だろ
249 :
2017/03/21(火) 19:47:35.23 ID:pOexkesp0
日本では禁止されてるからな
250 :
2017/03/21(火) 23:20:44.64 ID:8T5Lb3B40
何度読んでも、ISナメックに脳内変換されてしまう。
251 :
2017/03/22(水) 16:53:14.53 ID:ZwY56S9Z0
>>239
ありがとう。できたわ。詳しい仕組みはよくわからんけど、意図したとおりに動いてるからいいか。
まさかVBAでオブジェクト指向するとは思わんかったっすわ。

ところで、他ブックからの参照なんて、デフォルトで対応していていいと思うんだけど、あえてしてないのは、
何かデメリットなり不都合なりがあるからなのかね? 教えて239!
252 :
2017/03/22(水) 17:45:40.05 ID:ffkhDjHj0
>>251
俺も最初気持ち悪いとは思ったけど、そういうもんだと覚えるしかないで。

「他ブックからの参照がデフォルトで対応していない」って思った理由が良くわからないけど、
VBAのオブジェクトはApplication>Workbook>Worksheet>RangeやShapeなど・・と階層構造になっているので、モジュールで省略したらすべてActive〜になる。
ThisWorkbookモジュールでRangeと書くとThisWorkbook.ActiveSheet.Rangeと同等になるし
SheetモジュールのRange()はMe.Rangeと同等になる。
VBAのイベント名は固定で勝手に関連付けされるからワークブックの指定なんて出来ないし、強引に他ブックのイベントを拾おうと思うとClassでWithEventsで一風変わった形式になるのも止む終えないかなと思う。
253 :
2017/03/22(水) 18:19:04.60 ID:mdyqPZUSH
>>251
> ところで、他ブックからの参照なんて、デフォルトで対応していていいと思うんだけど、あえてしてないのは、
> 何かデメリットなり不都合なりがあるからなのかね?
究極的には、ビルゲイツの美意識にあわなかったからじゃないかと思う。

ビルゲイツがVBAの仕様レビューをしたときの話:
http://local.joelonsoftware.com/wiki/%E3%81%AF%E3%81%98%E3%82%81%E3%81%A6%E3%81%AEBillG%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC%E3%81%AE%E3%81%93%E3%81%A8
254 :
2017/03/22(水) 18:28:40.33 ID:mdyqPZUSH
どこかの段階で、イベントを所有者をたどって上に伝播するかどうかが決められたはずだけど、相当早い段階でそれは決まったんじゃないかと思う。
最初のバージョンのVBA(Excel 5.0時代)がすでにそうだったのかも。

イベントが上に伝播すると、上に伝播されると困るところでそれを止めるというコードをいたるところで書かなければならない羽目になったりする。
(javascriptのpreventdefault()とか)
255 :
2017/03/22(水) 18:47:07.37 ID:3v9b3PRy0
>>253
>Lotusマクロはワークシートのセルに長々と入れられたキーストロークの並び以外の何物でもなかった
んでもねぇ、Lotus123ユーザーだったら分かると思うけどOffice向けソフトウェアとしての出来は圧倒的にLotusが優れていたよ。
256 :
2017/03/22(水) 18:48:33.49 ID:ZwY56S9Z0
なるほどねぇ。 SelectionChangeの引数に0−2くらいで適応範囲指定できるようにしたらええのに、
とか思ったんだけど、たしかに親子関係考えるとおかしいのかもね。
superさんは偉いということですか。

なんにせよ、やりたいことはできたから良しですわ。ありがとん
257 :
2017/03/22(水) 18:57:26.31 ID:ffkhDjHj0
>>256
Superと言えば、VBAではRange.Parentでシートオブジェクト取れるし、Range.Parent.Parentでブックオブジェクト取れるで!
258 :
デフォルトの名無しさん (ワッチョイ bfaa-p9iL)
2017/03/22(水) 19:33:22.68 ID:3v9b3PRy0
会社で「今後はエクセル形式で書類を提出してもらう」と言われ、ブラック企業勤めの俺は涙目で
デンコードーに走った。「Microsoft Excel」と書かれたパッケージを見つけて値札を見たら「3,480」に見えたので
即座にレジに持って行ってビックリ、34,800円!
「えっ、そんなに高けえの?」と店員に言ったら苦笑いしながら「ロータスのこれ、良いですよ。マイクロソフトオフィスとの互換性
もバッチリだし」と言われて買ったのがLotusSuperOffice2000だった。7,980円だったと思う。
何が良いって、シート関数がエクセルとはくらべものにならないぐらい優れていて、エクセルのSUMIFとか「なんでこんなクソ高いシロモノが条件一つしか指定出来ねえんだよ」と言いたくなるほどの出来だった。だって、単純な集計処理だったらANDでいくらでも条件をネストできるんだからマクロなんて必要なかったんだ。エクセルだったら当時は二つ以上の条件で合計を出す時は
配列数式?でやるかマクロを書くしか無かった。
個人的な意見だが、ビル・ゲイツは天才営業マンで商人としては凄かったんだろうがソフト屋としては二流なんじゃねえかと。
不味い食い物ばっか売ってるイオングループが日本の小売業界トップなのと被るね。
259 :
2017/03/22(水) 20:20:33.14 ID:ZF7PxTXkd
会社に個人のMcIntoshを持ち込んで得意気にExcelを使ってるやつがいたなあ
260 :
2017/03/22(水) 20:23:38.85 ID:sbuoUxmo0
Range.Parent.Range.Parent.Range.Parent.Range.Parent.Range
261 :
2017/03/22(水) 23:32:43.84 ID:XGhQwYf/0
範囲選択したセルを画像として保存したい。またグラフも画像として保存したいんだけどいい方法ないかな?
Excel2016使ってます
ネットのマクロいろいろめしてみたけどうまくいかなかった
惜しかったのがあったけど範囲選択したところが拡大されて画像化されちゃった
262 :
2017/03/22(水) 23:41:35.49 ID:sbuoUxmo0
>>261
CubePDFで変換
263 :
2017/03/22(水) 23:46:12.21 ID:dFQUDVA10
>>260
With使う時は自身への参照を持っていてくれると綺麗にまとまる場合が多いんだよな。
全てのオブジェクト型に自己参照"This"を実装してほしいくらい。
264 :
2017/03/23(木) 00:39:31.79 ID:fjk8NBgx0
よくわからないけど、
エクセルとロータスにも、
プレステとサターンみたいな争いがあったということですね。
よくわからないけど。
265 :
2017/03/23(木) 01:03:56.69 ID:aP6AqsDEa
>>261
たぶんもう見てると思うけど、このサイトの方法でできます。
ttp://www.excel-excel.com/tips/vba_186.html
266 :
2017/03/23(木) 02:03:50.76 ID:iwKD8Hm60
>>258
Joel on softwareみりゃわかると思うけど、BillGはクソ細かい仕様まで把握していた
ゲイツはExcelとLotusでは西暦の起点が違うことを把握していた
(LotusのチームはビットシフトでごまかしてたがExcelチームはキチンとした、程度の意味)

こりゃプログラマだ
267 :
2017/03/23(木) 06:22:40.54 ID:vaDKEBcS0
>>265
これもやってみてうまく動かなかったけどもう一度やってみる!
ありがとー!
268 :
2017/03/23(木) 13:37:06.70 ID:n8VArJDy0
>>257
へぇ〜、そうなんだ。こんなどうでもいいネタにまで付き合ってくれてどうも。

割といろいろできるのんね。所詮ベーシックでしょ、と思ってたわすまんのVBA
269 :
デフォルトの名無しさん (ワッチョイ 2a35-ZYFz)
2017/03/23(木) 13:39:30.32 ID:bb5P/wmt0
VBAにもともと入ってる定数をあらわす変数の名前って簡単に調べる方法はありますか?
たぶんF2で利用できるオブジェクトブラウザかどこかに載っているのだと思うけど。

・色
黒はvbBlack、赤はvbRedと暗記してるけど、オレンジとか水色とかマイナーな色たちはいちいち調べないといけない。

・Endで移動する方向
→あっ、これはオブジェクトブラウザですぐ見つかった

などなど。

オブジェクトブラウザの下の蘭でクリックできるものがあればEndのように簡単にみつかるけど
そうでないことがよくあったので。
270 :
デフォルトの名無しさん (ワッチョイ 2a35-ZYFz)
2017/03/23(木) 13:46:36.51 ID:bb5P/wmt0
上の話はいまWordのVBAやってて
RangeのメソッドCollapseには引数が必要でその引数にはWordの元からある定数を指定しないといけない。
でもWordのオプジェクトブラウザの下の蘭には単に「Sub Collapse([Direction])」としか書いてなくクリックできない。
でもここのDirectionにはwdCollapseStartかwdCollapseEndを入れる必要がある。
その調べ方は?

というところでつまづいてて、そういやExcelでもこういう困り方をしたことは多々あったなと思って。
271 :
2017/03/23(木) 13:53:51.17 ID:SzpAfZmQa
>>269
オブジェクトブラウザでEnumかなんかで調べたら出てこない?
色ならvbColor列挙体じゃなかったっけ
うろおぼえですまんけど
272 :
2017/03/23(木) 13:56:50.41 ID:1Qddb7ZOH
>>270
IDEでCollapseとタイプしてF1
RTFM
273 :
デフォルトの名無しさん (ワッチョイ 2a35-ZYFz)
2017/03/23(木) 13:58:07.78 ID:bb5P/wmt0
>>271
ありがとうございます。
はい、excelだとオブジェクトブラウザの左のクラスのところで「XlRgbColor」を調べると
無数の色の定数が知ることができます。
でもそれは色だから簡単に調べることが出来ました。
オブジェクトブラウザでvbRedで検索したらたどりつけたから。

でもそれは色だから簡単に分かったけど
そうじゃない場合はその列挙体に相当する「XlRgbColor」みたいなのをどうやって探すかというのが質問の焦点です。
274 :
デフォルトの名無しさん (ワッチョイ 2a35-ZYFz)
2017/03/23(木) 14:05:18.23 ID:bb5P/wmt0
>>272
F1押してからCollapseとタイプでは?(ワラ。
あとRTFMとは? you are Really Tallented Fantastic Mathmatician?
275 :
2017/03/23(木) 14:08:02.28 ID:SzpAfZmQa
>>273
列挙体、定数の具体的な値(vbRedとか)で検索すれば出てくるっしょ
MSDNで検索しても出てくると思うし
276 :
2017/03/23(木) 14:08:21.97 ID:SzpAfZmQa
値ではないか、名前を検索
277 :
2017/03/23(木) 14:10:27.59 ID:1Qddb7ZOH
>>274
> F1押してからCollapseとタイプでは?(ワラ
笑ってる暇があったら、試してみたらどうかね
278 :
2017/03/23(木) 14:15:12.06 ID:LmZ8p62R0
Office アプリケーションの組み込み定数の値を取得する方法
https://support.microsoft.com/ja-jp/help/239930/how-to-obtain-built-in-constant-values-for-an-office-application
279 :
デフォルトの名無しさん (ワッチョイ 2a35-ZYFz)
2017/03/23(木) 14:16:20.18 ID:bb5P/wmt0
>>275-276
いやさっきのWordの例だとwdCollapseStartやwdCollapseEndを忘れてるから検索のしようがない。
こんな場面はExcelのVBAでもいままでに何回もあった、という話なのですが。
そりゃ色だと知ってるものがあれば検索するという技は使えますが。
280 :
2017/03/23(木) 14:16:37.32 ID:UAdpg5mq0
>>273
1.大半の列挙体の名前はエクセルなら「xl」、ワードなら「wd」+メソッド名なので、予想して入力してCtrl+Space
2.1に失敗したらオブジェクトブラウザでメソッド名か、引数名で検索
3.普通にメソッド名でググる
マクロの記録から生成したのであれば、何らかのメンバ名が分かってるわけなので、「wdCollapseStart」をオブジェクトブラウザで検索すれば一発出でるね
281 :
2017/03/23(木) 14:20:56.54 ID:1Qddb7ZOH
マゾかお前ら。
まずマニュアル見ろよ。
282 :
デフォルトの名無しさん (ワッチョイ 2a35-ZYFz)
2017/03/23(木) 14:26:08.56 ID:bb5P/wmt0
>>280-281
みんなわたしのやりたいことがわかっていないようだ。
オレはExcelやWordでいろんな作業をするとき数秒から1分くらいでやりたいわけ。
そのときVBAでコードを書いて一瞬で処理したいわけだ。
その一瞬ですますためにコードの引数などで定数の名前を忘れたときに簡単に調べる方法を聞いている。

マニュアルとか検索は、全くの初心者がはじめて事柄を学ぶときに有効。
いま聞いてるのは、やりかたや処理は分かってて、定数の名前を瞬時に知る方法。
283 :
2017/03/23(木) 14:44:49.83 ID:SzpAfZmQa
なんじゃあそりゃ
自分で勝手にライブラリ作るしかなくねえかそんなの
一覧を取得する方法ならググりゃ出てくるが
ある程度はクラス名とか定数名でわかるように作ってあるんだからもうそっから先はじぶんで工夫する以上のことはできないだろ
284 :
2017/03/23(木) 15:06:49.95 ID:mxf1LURC0
本来はCollapseの定義が
Sub Collapse([Direction]) じゃなくて
Sub Collapse([WdCollapseDirection]) になってればいいんだけどね

オブジェクトブラウザでCollapseで検索にするかDirectionで検索するか
Collapseで検索すれば一番最初にWdCollapseDirectionが出てきた
285 :
2017/03/23(木) 15:08:41.10 ID:1Qddb7ZOH
>>282
> マニュアルとか検索は、全くの初心者がはじめて事柄を学ぶときに有効。
マニュアルの使い方も知らなかったくせに、何言ってんだか。

> 定数の名前を瞬時に知る方法。
F1で瞬時にマニュアルが開き、すぐにこう書かれてるのを目にするだろう。

> 指定範囲または選択範囲を解除する方向です。WdCollapseDirection定数は、
> 次のいずれかをすることができます: wdCollapseEndまたはwdCollapseStartです。
> 既定値はwdCollapseStartです。

RTFM? ggrks
286 :
2017/03/23(木) 15:14:09.35 ID:UAdpg5mq0
>>282
いや、だから一瞬で知りたいときは、wd+メソッド名頭文字打ってCtrl+Spaceだってば。
初見じゃないならこれぐらいできるだろ
それすら暗記できないならおとなしくF1押してマニュアル読んどけ
馬鹿でも10回も繰り返せば覚えるだろう
287 :
2017/03/23(木) 15:15:48.69 ID:PawQYZEHM
図形を作成すると同時にその図形にハイパーリンク設定ってどうすればよい?
コード例があればうれしい
288 :
2017/03/23(木) 15:22:44.15 ID:UAdpg5mq0
>>287
っマクロの記録・・・
ActiveSheet.Shapes.AddShape(msoShapeRectangle, 233.25, 234, 274.5, 146.25).Select
ActiveSheet.Hyperlinks.Add Anchor:=Selection.ShapeRange.Item(1), Address:="C:\aaa.xls"
289 :
2017/03/23(木) 15:25:01.73 ID:UAdpg5mq0
>>288
Selectしなくても動いたわ
ActiveSheet.Hyperlinks.Add Anchor:=ActiveSheet.Shapes.AddShape(msoShapeRectangle, 233.25, 234, 274.5, 146.25), Address:="C:\aaa.xls"
290 :
デフォルトの名無しさん (ワッチョイ 66a6-VHv+)
2017/03/23(木) 18:21:44.88 ID:2WHRd7qq0
>>288
Select Selectionを使わずにオブジェクト変数をつかって書くとどうなりますか
291 :
2017/03/23(木) 23:15:58.88 ID:vaDKEBcS0
notesのvba詳しい人いないかな…
Excel vbaでNotesのメールは作れるんだけど添付ファイルが上手くいかない…
新規メールだと出来ないとかなんとか…
292 :
2017/03/23(木) 23:43:55.59 ID:fjk8NBgx0
エクセルファイルがZIPであることを利用した裏技はない?
あるとナイス。
293 :
デフォルトの名無しさん (ワッチョイ 2a35-ZYFz)
2017/03/23(木) 23:54:57.19 ID:bb5P/wmt0
>>292
エクセル内にいっぱい貼ってある写真や図があれば
それをzipにして回答すればjpgファイルとして一括で取り出せる。
294 :
2017/03/23(木) 23:57:02.96 ID:XZ4v6A+b0
>>291
Outlookじゃダメなのか?
295 :
2017/03/23(木) 23:59:48.01 ID:FkdET+B0M
>>292
高速読み書き
296 :
2017/03/24(金) 00:01:31.52 ID:caJOMCbq0
>>292
圧縮解凍専用ソフトで再圧縮してファイルサイズを減らして自己満足
297 :
2017/03/24(金) 00:21:28.15 ID:Ka6sWiwW0
windows シリーズ office シリーズ filemaker シリーズ 最近行い商品についてのキャンペーン, japansoftware.net
298 :
2017/03/24(金) 02:53:38.32 ID:suDsBIm10
>>292
表技だけどgitで差分比較
299 :
2017/03/24(金) 03:07:07.38 ID:r1mlMUXS0
裏技ってバグなんかの、仕様書(説明書)内に明記されていない動作を利用した行為だろ。
300 :
2017/03/24(金) 06:47:14.99 ID:hRC2OOpsM
>>298
実際にやるとほとんど使い物にならないけどね

>>299
説明書には書いてないけど仕様書はわからんな
昔 Excel にあったイースターエッグなんて仕様書なしでできるとは思えないし
てかどこから裏技が?
301 :
2017/03/24(金) 08:57:26.27 ID:cdPP3YHId
ActiveSheet.Activate という命令が必要になる日が来るとは思わなかった
302 :
2017/03/24(金) 10:29:14.81 ID:c/RC4PNV0
>>292
既出もあるけど
・バイナリエディタでDPB="〜"をゴニョゴニョ
・WinMergeなどのツールで差分比較
・普通に開くと破損して書式設定などが消滅してしまうファイルの復元
・良くないファイルをxlsxに埋め込んでバラマキ
・埋め込みの画像の一括抽出
ZIPだから〜と言うより、内部構造がXMLだから汎用ソフトが使えるので色々できるようになったとも言う
303 :
2017/03/24(金) 15:23:46.17 ID:9pPylWGn0
画像のように表1の黄色のデータ部分を参照してグラフ1を作成するコードを教えてください。
http://imgur.com/tUaPTQQ.jpg
304 :
2017/03/24(金) 15:30:28.37 ID:lxkR7uxCa
>>303
マクロの記録
305 :
2017/03/24(金) 16:08:20.78 ID:cdPP3YHId
>>303
この「計」って何なんだ?
306 :
2017/03/24(金) 16:33:11.14 ID:1dGmf1c20
>>304
やりましたが、そのまま実行しても上手く出来ませんでした

>>305
営業と事務の合計なんですけど、機密保持のため適当に数字を打ってるのでおかしなことになってますが、気にしないでくださいw
307 :
2017/03/24(金) 17:55:57.96 ID:stJCVKXLa
>>306
どんなコードになってどこで止まるの?
308 :
デフォルトの名無しさん (ササクッテロリ Spd3-0QwW)
2017/03/24(金) 20:33:05.87 ID:h+s0FglGp
簡単そうてかなりめんどくさい。

セルA1に数値を入れると、セルB1からある数値が帰るシートがあります。
この時以下のプログラムを簡単にできないだろうか

ただしkは変数で、初期値0とします。
1)
いまA1に値k-0.1,k,k+0.1をそれぞれいれ、B1の値が最大になるときのA1を次のkにする。
1)に戻る

どなたかお願いします。
309 :
2017/03/24(金) 20:34:50.50 ID:mVTbO5eq0
>>294
残念ながらNotesしか無理なんだ…
310 :
2017/03/24(金) 22:11:02.15 ID:suDsBIm10
>>308
終了条件は?
311 :
2017/03/24(金) 22:18:27.74 ID:XQ+bYqg60
B1の返ってきた値で条件分岐してkに代入するようにしてループ回せばいいんじゃね?
B1の返る条件が分からないから詳しくはわからんけど
312 :
2017/03/24(金) 22:40:22.97 ID:4RUE8vp70
プログラミングセンスのない俺がそのまま書いてやったぜ 異論は認める
Sub Main()
Dim i As Long
For i = 1 To 10000
Call saidai
Next i
End Sub
Private Sub saidai()
Dim k As Double, k1 As Double, k2 As Double
Dim b1_1 As Double, b1_2 As Double,b1_3 As Double
Calculate
k = Range("A1").Value
k1 = k - 0.1
k2 = k + 0.1
b1_1 = Range("B1").Value
Range("A1").Value = k1
Calculate
b1_2 = Range("B1").Value
Range("A1").Value = k2
Calculate
b1_3 = Range("B1").Value
If b1_1 > b1_2 And b1_1 > b1_3 Then
Range("A1").Value = k
ElseIf b1_2 > b1_1 And b1_2 > b1_3 Then
Range("A1").Value = k1
ElseIf b1_3 > b1_1 And b1_3 > b1_2 Then
Range("A1").Value = k2
End If
End Sub
313 :
2017/03/24(金) 22:44:31.10 ID:suDsBIm10
>>308
sude codeだけど

A1 = x
B1 = f(x)
の場合
foo = [a, b, c]
bar = [f(a), f(b), f(c)]
A1 = foo[bar.index(bar.max)]

ただA1の値を新しくするやり方だと
終了条件がないとずっと回ってるかもね
314 :
2017/03/24(金) 22:56:51.04 ID:suDsBIm10
>>313
ぶpseudo code
315 :
デフォルトの名無しさん (ワッチョイ 66a6-0QwW)
2017/03/24(金) 22:58:10.10 ID:0Cra7A6M0
312さんごめんなさい
313さんぐらいのシンプルさが欲しいのですわ

>313
もう少し詳しくお願いします。
316 :
2017/03/24(金) 23:04:20.85 ID:wY6QBO5Y0
>>303
wwwwwwwwwwwwwwwwwwwwwwwwww
wwwwwwwwwwwwwwwwwwwwwwwwwwww
wwwwwwwwwwwwwwwwwwwwwww

つい今日、俺もそんな表からグラフ作らされたわwwwwwwwwwww
作りにくいったらありゃしないwwwwwwwww
317 :
2017/03/24(金) 23:45:07.41 ID:suDsBIm10
>>315
配列[f(a), f(b), f(c)] の要素の最大値がf(c)なら f(c)のindexが2なので
配列[a, b, c]のindexが2の値をとってc
最大値が2つ以上になった場合どうしたいかによっては違う方法のほうがいいかも

違う方法の一つとしては
[(a, f(a)), (b, f(b)), (c, f(c))]みたいな形にして最大値に対応する入力値を取得するとか
(a, f(a))の型は配列、ディクショナリ、ユーザー定義型とかを使う
318 :
デフォルトの名無しさん (アウアウウー Sa3f-n/U6)
2017/03/25(土) 00:05:52.08 ID:w0EH7KAWa
test
319 :
デフォルトの名無しさん (アウアウウー Sa3f-n/U6)
2017/03/25(土) 00:14:03.67 ID:w0EH7KAWa
説明下手で申し訳ないんだけど
すでに開いているブラウザをアクティブにして、プルダウンメニューを選択するものを作りたいんだけどどうしたらいいんだろう・・・
AppActivateでアクティブにするとこまでしか作れてない・・
プルダウンの選択って難しいかな?
使いたいページが3フレーム構造のページなんだけど、何かいい方法ないかな
320 :
2017/03/25(土) 00:26:53.18 ID:qXyaqpvi0
>>319
sendkeys
321 :
デフォルトの名無しさん (アウアウウー Sa3f-n/U6)
2017/03/25(土) 00:27:25.30 ID:w0EH7KAWa
<select name="month" />
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
<option value="9">9</option>
<option value="10">10</option>
<option value="11">11</option>
<option value="12">12</option>
</select>
<label for="month">月</label>
たとえばボタンクリックしたらAppActivateでアクティブにして、monthの2を選ぶみたいなコードって作れないかな・・
322 :
デフォルトの名無しさん (アウアウウー Sa3f-n/U6)
2017/03/25(土) 00:29:26.32 ID:w0EH7KAWa
>>320
sendkeysでプルダウン選択できる?
無知ですまん・・
できるとしたらコードの書き方教えて欲しい
321に貼ったmonthの月を選択するプルダウンなんだが
323 :
2017/03/25(土) 00:42:30.55 ID:qXyaqpvi0
>>322
Alt+Tabでウィンドウ切り替え
Tabでフォーカス移動
↓↑カーソルキーでリスト選択
リストの選択肢が半角なら頭文字の入力で一発で飛べる

いっぺん自分でキーボードだけでブラウザを動かしてみ
それをそのままSendKeysで飛ばせばいいだけ
324 :
デフォルトの名無しさん (アウアウウー Sa3f-n/U6)
2017/03/25(土) 01:43:39.80 ID:w0EH7KAWa
>>323
その方法ではできたんですが、他の方法はないでしょうか?
それだと最後にクリックした場所によってはぜんぜん違う動きをしてしまうので
なるべく確実な方法を取りたかったです、説明不足ですいません
キーボード操作ではなくて直接プルダウンをいじれるコードってないですか
325 :
デフォルトの名無しさん (アウアウウー Sa3f-n/U6)
2017/03/25(土) 01:48:39.54 ID:w0EH7KAWa
>>323
それか、毎回ブラウザをActiveにした場合に同じ場所へ戻ってTABで移動したりはできないですか?
ページの上部をクリックした場合と下部をクリックした場合では挙動が全く違ってしまうので。それを解決したいんですがいい方法が思いつかなくて・・・
326 :
2017/03/25(土) 02:29:29.80 ID:9FVY8Pdra
リスト直接指定できないの?
327 :
デフォルトの名無しさん (アウアウウー Sa3f-n/U6)
2017/03/25(土) 02:34:33.44 ID:Cbf6Eb44a
リストと言いますと?
328 :
2017/03/25(土) 02:55:27.76 ID:qXyaqpvi0
>>324
ページを開く作業とセットで、VBAを起動する前にクリックする場所も決めておく

ブラウザだとリストを選択したあと検索とか送信とか、何かボタンを押して次のページに飛ぶだろ
その次のURLを直接指定するという方法もある
URLの最後にnameとvalueを並べて書けば入力したことになるから
329 :
2017/03/25(土) 03:08:14.05 ID:S5QLF0+B0
>>319
ブラウザが IEなら IEオブジェクト使えばいいんじゃね?
330 :
2017/03/25(土) 10:53:09.97 ID:Rc2Ti6ZPM
>>329
>>319
>ブラウザが IEなら IEオブジェクト使えばいいんじゃね?
それ使えば今開いてるページをアクティブの状態にして、プルダウン選んでくれる??
できたらコード教えて欲しい
331 :
2017/03/25(土) 11:38:50.64 ID:RRHIuX+r0
>>330
ありがたいお言葉

ググれカス
332 :
2017/03/25(土) 12:33:39.13 ID:fBnAPO3ip
getelementsbynameで対象オブジェ決めてvalueかselectedindex書き換える

ドロップダウンリストは開かないけど
333 :
2017/03/25(土) 13:09:52.46 ID:pySR9myI0
VBAでエクスプローラーの特定フォルダーを開こうとしています

Dim trag As String

Fol = "c:\myhome\hage\"
Shell "C:\Windows\Explorer.exe" & Fol, vbNormalFocus

エクスプローラーは開くのですが、ディフォルトのフォルダーで開きます。
どこが悪いのでしょうか?
334 :
2017/03/25(土) 14:08:06.46 ID:Q4Ej8fyjx
>>330
より先鋭的なお言葉
ビンれかす
335 :
2017/03/25(土) 14:16:01.39 ID:xdv6un5Q0
>>333
空白が足りないとかアクセス権がないとか
336 :
2017/03/25(土) 15:29:43.70 ID:DcHCHcD/0
>>330
間違いなくできると思うがWebペ−ジの仕様にもよる。
今ちょっと時間無いんでコード示すとしたら夜になってからだな。
既に開いてるならShellオブジェクトだね。

分かってて使ったりするけど人に対してはSendkeysは絶対に使ってはいけないと俺は言うね。
337 :
2017/03/25(土) 15:49:28.03 ID:RRHIuX+r0
IE操作したいならHTML勉強しろよ
338 :
2017/03/25(土) 15:54:46.27 ID:LXIplO5Za
>>333
間に空白いれなくてもie開くのか
339 :
2017/03/25(土) 15:55:11.96 ID:LXIplO5Za
ieじゃなくエクスプローラ
340 :
2017/03/25(土) 17:03:59.09 ID:rT+BXZwb0
>>333
はい。これで動くはず
Dim trag As String
Fol = """" & "c:\myhome\hage\" & """"
Shell "C:\Windows\Explorer.exe" & " " & Fol, vbNormalFocus
341 :
2017/03/25(土) 17:05:21.81 ID:rT+BXZwb0
>>330
ここで答え聞くより普通にググれば大量に資料出てくるんだから応用聞くと思う
キーワード 「vba IE操作」など
342 :
2017/03/25(土) 17:56:27.77 ID:Wmnjl+Lx0
>>340
横だけど
Fol = """c:\myhome\hage\"""
Shell "C:\Windows\Explorer.exe " & Fol, vbNormalFocus
じゃダメなの?
もしくは一行で
Shell "C:\Windows\Explorer.exe ""c:\myhome\hage\""", vbNormalFocus
ではダメなの?
343 :
2017/03/25(土) 19:17:16.60 ID:rT+BXZwb0
>>342
間違ってるところが分かるように意図的にこうしてるのが分からない?
ベタ打ち1行ならそれでいいよ
344 :
2017/03/25(土) 21:13:51.88 ID:pySR9myI0
>>335 >>338 >>340 >>342 返信ありがとうございます。ディフォルトのライブラリが開きます・・・。フォルダーは存在してるのですが・・・。
345 :
2017/03/25(土) 21:28:56.12 ID:rT+BXZwb0
>>344
じゃあ試しに "C:\"だけにして試してみなよ。
で、次に"C:\myhome\"という感じでパスを増やす。
それと、最後の\が不要だったカモシレナイ。
ついでに、 fso.FolderExits(パス)とかで、”本当に!”パス打ち間違えてないか確認したら?
346 :
2017/03/25(土) 23:25:29.86 ID:DcHCHcD/0
IEならF12キー押してメニュー下のボタンの中から[要素の選択]ってのを
押してから目的のボタンをクリックするとHTMLの中から該当の部分を表示してくれる。

その中でid属性、name属性なんかを基にプログラム上で目的のオブジェクトを取得して操作する。
取得や操作はDOMを勉強してくれ。
今回のサンプルではhttp://www.htmq.com/html/select.shtmlを利用させて頂いた。

https://www.friendpaste.com/42laVRyz5iwMFqn7Lx6g7S
347 :
2017/03/25(土) 23:35:26.21 ID:qZDjxVVm0
エクセルにはまって以降、
デザエモンはすっかりやらなくなってしまった。
348 :
デフォルトの名無しさん (ワッチョイ 2a35-ZYFz)
2017/03/26(日) 10:23:26.80 ID:keGLAbPN0
デザエモンとは?
349 :
2017/03/26(日) 19:33:27.18 ID:9vl54wzV0
http://home.att.ne.jp/zeta/gen/excel/c04p04.htm
を参考にVBAで音を鳴らすプロシージャを作成していますがエラーを解決できません。
どこをどう直せばいいでしょうか?

上記URLの"メモリ上のバッファから再生〜"で紹介されているコード:Public Function ReadSoundBuffer()を、
再生するファイルを引数で渡すように変更したのですがエラーが出てしまいます。
"Visual Basic でサポートされていないオートメーションが変数で使用されています。"
350 :
2017/03/26(日) 19:35:20.92 ID:9vl54wzV0
コードは以下の通りです。どこがまずいでしょうか?

Option Explicit

Public Declare Function PlaySound Lib "winmm.dll" Alias "PlaySoundA" ( _
ByRef pszSound As Byte, _
ByVal hmod As Long, _
ByVal fdwSound As Long _
) As Long
Public Const SND_ASYNC = &H1
Public Const SND_MEMORY = &H4

Public Snd_1() As Byte, Snd_2() As Byte, Snd_3() As Byte

Public Sub test() '←これを実行すると・・・

Call ReadSoundBuffer(Snd_1, "C:\RSSを取得(SSD)\wav files\1分 安値.wav")
'Call ReadSoundBuffer(Snd_2, "C:\RSSを取得(SSD)\wav files\2分 安値.wav")
'Call ReadSoundBuffer(Snd_3, "C:\RSSを取得(SSD)\wav files\3分 安値.wav")

PlaySound Snd_1(0), 0, SND_ASYNC + SND_MEMORY
'PlaySound Snd_2(0), 0, SND_ASYNC + SND_MEMORY
'PlaySound Snd_3(0), 0, SND_ASYNC + SND_MEMORY

End Sub
351 :
2017/03/26(日) 19:35:58.63 ID:9vl54wzV0
Public Function ReadSoundBuffer(SndBuf, strFileName)

Dim WrkSndFile As String
Dim WrkNumber As Long

WrkSndFile = strFileName
WrkNumber = FreeFile()
Open WrkSndFile For Binary As WrkNumber
ReDim SndBuf(LOF(WrkNumber))
Get WrkNumber, , SndBuf '←ここでエラー。"Visual Basic でサポートされていないオートメーションが変数で使用されています。"
Close WrkNumber

End Function
352 :
2017/03/26(日) 21:46:16.16 ID:6MyN9wgWE
>>349
引数の型指定がされていないからじゃない?

Public Function ReadSoundBuffer(SndBuf, strFileName)

Public Function ReadSoundBuffer(SndBuf() As Byte, strFileName)
353 :
2017/03/26(日) 22:36:58.07 ID:9vl54wzV0
>>352
あー、エラーでない すごいー
今まで呼び出される側の引数の型を省略すること多かったし、引数が配列のときに()を省略しても問題がおきたことなかったのに・・・
どういうときに省略で問題でてくるんだろ???
354 :
2017/03/26(日) 22:37:27.60 ID:9vl54wzV0
>>352
ありがとうございました
355 :
2017/03/26(日) 23:05:55.58 ID:zZzO0lh00
また Variant論争が起こる悪寒 w
356 :
2017/03/26(日) 23:06:04.57 ID:TV/WgqWka
直したの関数の型指定だな
357 :
2017/03/26(日) 23:07:22.99 ID:TV/WgqWka
あ、引数でいいのか
358 :
2017/03/26(日) 23:18:02.88 ID:NX2FjwOv0
MSDNでGet ステートメントの説明を読んだがわかりにくいのう
359 :
2017/03/26(日) 23:23:54.74 ID:9vl54wzV0
>>355
触れてはいけない話題でしたか、すいません
論争は望んでなくて、呼び出される側に、どんなとき()が必要でどんなとき引数の型指定が必要か知りたかっただけなんです
360 :
2017/03/26(日) 23:32:53.42 ID:NX2FjwOv0
>>359
MSDNのここじゃないかな


メモ
Get ステートメントを使用して、バリアント型 (Variant ) の配列をディスクから読み取ることはできますが、
Get を使用して、配列が含まれるスカラーのバリアント型 (Variant) を読み取ることはできません。
また、Get を使用して、オブジェクトをディスクから読み取ることもできません。
361 :
2017/03/26(日) 23:52:44.25 ID:NX2FjwOv0
そのMSDNに
「バリアント型 (Variant) の VarType を識別する 2 バイトが読み取られた後に・・・」って記述があるじゃろう。

SndBuf() As Byte と書かないと、ByRef SndBuf As Variant と解釈されるが、その場合上記の
VarTypeは、要素の型を表す本来の値(Byteなら17)と VT_BYREF(0x4000) の bit or になるんだよ。
「VT_BYREF」ってのは他の型の値を参照してますよ、ってフラグ。

多分Getステートメントはそういう状態に対応していないってことなんじゃないかな。
362 :
2017/03/27(月) 00:15:58.86 ID:J4FHBXqDM
何も考えずに型を書けばいいだけ
Variantなどというクソに頭を悩ませる必要はない
363 :
2017/03/27(月) 07:45:20.12 ID:G8XHCg/Aa
Variantはどうしても必要なとき以外は使わないってのが基本でいいと思う
あやまってbyte型じゃない値を入れても型が違うよってエラーが出てくれるから問題箇所も発覚させやすい
Byteより大きい値を入れる可能性があるなら関数の使い方を考え直さないと
364 :
2017/03/27(月) 07:47:43.67 ID:Sygej3yfd
Variantを使わないとコピペの嵐になるときとかがそうだな
365 :
2017/03/27(月) 07:54:35.50 ID:G8XHCg/Aa
>>364
でも結局関数の中で型を確定させるよね、その場合も
オブジェクト指向サポートしてる言語だとオーバーライドだっけ?なんかゴニョゴニョ出来るみたいだけど
366 :
2017/03/27(月) 12:01:35.84 ID:F/9rdJuK0
人は同じ過ちを何度でも繰り返す。
367 :
2017/03/27(月) 13:50:33.97 ID:D0Ly+ln50
エラーの出る場所が違うだけで、Variant型使わなければ防げるエラーなんてないんだけどね。
368 :
2017/03/27(月) 14:23:16.95 ID:Sygej3yfd
>>367
たとえば ByRef a As Long に Long じゃない変数を代入しようとするとコンパイルエラーになる。
369 :
デフォルトの名無しさん (ワッチョイ 2a35-ZYFz)
2017/03/27(月) 14:33:19.30 ID:z/XZODDJ0
Sub test()
Dim i As Integer
i = 5
Dim a(i) As String


End Sub
---------------------

これがダメなのはルールとして分かりましたわ。
でもこれをダメというルールにしてしまった理由はなんですか?
370 :
2017/03/27(月) 14:36:29.68 ID:D0Ly+ln50
>>368
Long型以外の値が紛れ込む余地があったら実行時にエラーになるし、
Long型以外の値が紛れ込む余地が無かったらVariant型でもエラーにならないだろ。
371 :
2017/03/27(月) 14:39:37.86 ID:D0Ly+ln50
>>369
実行時に値が確定してるかどうかの差じゃないの。

Const i = 4

Sub test()
Dim c(i) As String
Debug.Print UBound(c)
End Sub

だとエラー出なかったし。
372 :
2017/03/27(月) 14:43:43.63 ID:Sygej3yfd
>>370
余地?
俺は引数の型についてVariantかそうじゃないかの話をしてるんだけど?
373 :
2017/03/27(月) 15:05:20.07 ID:D0Ly+ln50
>>372
そうか。するとコンパイルエラーがどうこうというレスだけだと君の主張がよく分からないな。
俺は引数の型がVariant型かどうかについて限って話してるわけではないから、もしかして違う話題かな?
374 :
2017/03/27(月) 16:09:12.72 ID:F/9rdJuK0
>>369
理由もなにも固定長配列と動的配列の違い。
つまりメモリ確保のタイミングの問題だね。
Dim(定数)は固定長配列なんだから、当然変数を渡したら「定数式が必要です。」となる。

Dim (定数)はプロシージャに入って初めて通過したときにメモリを確保する。
トレースで矢印を動かして再度Dim(定数)を通っても変数は初期化されない。

Dim() As Stringと書いた場合はメモリを確保しないが、ReDim(i)を通るたびにメモリを再確保する。
トレースで矢印を動かして再度ReDim(数値)を通ると変数は初期化される。

一度固定長配列として宣言した変数は、動的配列にすることはできない
Dim b(10) As String
ReDim b(i)
エラー「配列は既に宣言されています。」

これでいいだろうか
375 :
2017/03/27(月) 17:53:46.64 ID:eAttwfk5a
コンパイルエラーと実行時エラーだったらコンパイルエラーの方が未然に防げるだろ
値によって変わるんじゃなくて型チェックの時点で防げるんだから
さすがにこれは明白すぎるぞ
376 :
2017/03/27(月) 18:00:25.62 ID:BGS+rNUAH
>>371,374
そういうことを聞くたいんじゃなくて、>>369のコードを駄目ということにした理由が知りたいんじゃないかな。
別に駄目じゃなくてOKということにしてもいいのに、なんで駄目というルールにしたんですかという疑問。

俺は知らないけど。
377 :
2017/03/27(月) 18:02:35.03 ID:eAttwfk5a
変数宣言するのに変数を使えるのはなんか気持ち悪いから
コンパイルの時にチェックしてるんじゃないの、知らんけど
378 :
2017/03/27(月) 18:17:07.67 ID:BGS+rNUAH
>>377
なるほど!と思って試してみたら、範囲外エラーは実行しないとエラーにはなりませんでした。
dim a(5) as long
a(6) = 1 ' <- コンパイルではエラーにはならない
379 :
2017/03/27(月) 18:25:08.74 ID:D0Ly+ln50
コンパイルエラーってあんまり頼りにならないんだよね。
コンパイルエラーで分かるものって実行時エラーでも分かるけど、その逆ってないし。
380 :
2017/03/27(月) 18:33:54.37 ID:e29nEpzRM
>>376
ぶっちゃけ言語仕様決めた奴の好みだろ
381 :
2017/03/27(月) 18:34:09.03 ID:wdUXzV9Gd
>>379
コンパイルできないのに実行できるコードがあるわけないだろ
382 :
2017/03/27(月) 19:00:18.34 ID:F/9rdJuK0
>>379
言ってることが意味不
VBAのコンパイルエラーは言語仕様に合ってて、機械が翻訳可能か検証してるだけだし、
実行時エラーは実際に実行した時のメモリアクセスやらなんやらのエラーだろう。
確かに>>378の文はコンパイルエラーで拾ってほしいけど、VBAにそこまで期待してはいけない。
383 :
2017/03/27(月) 19:02:26.80 ID:3B4Abdf9M
VBAはコンパイラが貧弱すぎるからVBAしか使わない人達はいまいち静的型付けの御利益を実感できないんだろう
他のまともな静的型付け言語を体験するともうVBAに嫌気がさしてくるよ
384 :
2017/03/27(月) 19:33:21.64 ID:Sygej3yfd
>>379
確かに気休めにしかならない

func(ByRef x As Long)
があるとして、

Dim a As Variant : a = 5
func(a)
はコンパイルエラーになってくれるけど
func(a + 0)
だと通る
385 :
2017/03/27(月) 20:15:45.93 ID:0qOI+dR00
そもそもVBAってコンパイルするのか?インタプリタだと思ってたよ。
386 :
2017/03/27(月) 20:37:13.86 ID:VgJTF0Ub0
>>385

VBEのデバッグにコンパイルってあるけど、あれは単に文法チェックをだけだろ
と思ってたんだけどね
>>47
みたいな話が
387 :
2017/03/27(月) 20:50:17.08 ID:v6c3i5dM0
初心者からの質問です。

「今日の上がり」というシートを「集計マクロ」というエクセルシートに取り込みたいのですが、
今日の上がりシートをダウンロードすると、時々
「今日の上がり(1)」とかって、(1)とかついたりします。
今書いたコードだと、その括弧のない場合でしか取り込めなく、
括弧がついてしまった場合だとエラーが起きてしまいます。
こういう場合はどうコードを書き直せばいいですか?

今使ってるコード↓

Workbooks("今日の上がり").Sheets("今日の上がり").copy_
After:=Workbooks("集計マクロ").Sheets("集計マクロ")
388 :
2017/03/27(月) 20:53:42.71 ID:jq8UKNgK0
Workbooks("今日の上がり(1)").Sheets("今日の上がり").copy_
After:=Workbooks("集計マクロ").Sheets("集計マクロ")
389 :
2017/03/27(月) 20:55:12.69 ID:D0Ly+ln50
>>387
Sub test()
For Each x In Workbooks("今日の上がり").Worksheets
If x.Name Like "今日の上がり*" Then
x.Copy after:=Workbooks("集計マクロ").Sheets("集計マクロ")
End If
Next
End Sub

こんな感じかな
390 :
2017/03/27(月) 20:59:18.59 ID:F/9rdJuK0
>>387
2パターンしか存在しないなら、エラー処理サブルーチンを組むとか。
sub aaa()
 '前処理
 On Error Goto LabelError
 Workbooks("今日の上がり").Sheets("今日の上がり").copy_
 After:=Workbooks("集計マクロ").Sheets("集計マクロ")
 Goto LabelSkip
LabelError:
 Workbooks("今日の上がり(1)").Sheets("今日の上がり(1)").copy_
 After:=Workbooks("集計マクロ").Sheets("集計マクロ")
 Resume Next
LabelSkip:
 '後処理
End Sub
でも>>389のほうが美しいな
391 :
2017/03/27(月) 21:14:05.14 ID:v6c3i5dM0
>>387です。
>>388-390
さっそくのご回答ありがとうございます!
(2)になったり(3)になったりでパターンは変わるようです。
>>389さんのが*がついてて、どのパターンにも対応が出来そうなので試してみます。
まだ色々分からない点があるので、また後日来ます。
ありがとうございました。
392 :
2017/03/27(月) 21:21:36.05 ID:BYe152/p0
他ブックから参照してる外部データのリンクをマクロで再度更新ってできないのかな?
activeWorkbook.RefreshAllでは無理だった…
393 :
2017/03/27(月) 21:46:23.45 ID:F/9rdJuK0
>>392
んー再計算なら、
Application.CalculateFullRebuild
を試してみては?
394 :
2017/03/27(月) 23:05:28.25 ID:TaZ9cxx50
>>392
ActiveWorkbook.UpdateLink Name:=ActiveWorkbook.LinkSources
395 :
2017/03/27(月) 23:12:49.26 ID:bKKFLlTl0
>>360>>361
ありがとうございます。でもこのMSDNの記述は私の理解を遥かに越えています
>>362>>363
呼び出される側の型省略は今後やめます、今回で凝りましたw
396 :
2017/03/27(月) 23:28:18.52 ID:Mw0tASpV0
>Get を使用して、配列が含まれるスカラーのバリアント型 (Variant) を読み取ることはできません。

スカラー波wwwwwwwwwwwwwwwwwwwwwwww
397 :
2017/03/28(火) 12:27:19.23 ID:5xPrq2Fua
>>374
いや、それ違う。
どっちも静的配列だ。

定数は実行前に置き換わるからだろ。
398 :
2017/03/28(火) 13:12:16.29 ID:4cdxOmGyd
ReDimできるものが静的配列のわけはないよ
399 :
2017/03/28(火) 13:19:30.09 ID:4cdxOmGyd
>>365

' 配列 x のサイズを計算する関数
 If IsArray(x) Then
  size = UBound(x) + LBound(x) + 1

これは型を確定させる必要はないし ByRef Variant じゃないと受けられない

遅レススマ
400 :
2017/03/28(火) 13:22:58.79 ID:RFK8HgDl0
>>397
>どっちも静的配列だ。
ん?Dim(5)が静的でDim()→Redim(n)が動的でしょ。
そりゃnが定数なら静的っぽく使えるけど、Preserveできるから結局は動的でしょうVBAでは。
http://officetanaka.net/excel/vba/variable/08.htm
http://www.asahi-net.or.jp/~ef2o-inue/vba_k/sub04_050_11.html
俺の解釈が間違ってるならもう詳しい解説おしえてほしいな

>定数は実行前に置き換わるからだろ。
当たり前すぎて何を言いたいのか分からない。
401 :
2017/03/28(火) 13:39:54.81 ID:uzRike2TH
>>386
コンパイル関連の仕組みとして、この記事を見つけたので、興味があればどうぞ。
http://cpap.com.br/orlando/VBADecompilerMore.asp

VBA CODE DECOMPILER AND COMPACTORというツールの紹介と、解説記事
* Features
* Download
* What it means to decompile and compact in VBA
* Advantage of saving decompiled and compacted VBA code
* Good practices to increase stability in VBA codes
* New Office 2007 and later (32 and 64-bit)
* Executing via Command Line
402 :
2017/03/28(火) 20:53:44.53 ID:gtx5yoip0
>>393>>394
ありがとう!
うまくいったー!
403 :
2017/03/28(火) 21:23:48.83 ID:5RUVNWwS0
>>400
一般用語の動的配列ではないけど
VBA用語では動的配列ってことでしょ
404 :
2017/03/28(火) 22:12:24.05 ID:y6dX2FWHa
>>400
スマン。
>>369>>371の違いを説明してると勘違いした。
405 :
2017/03/28(火) 22:16:58.20 ID:QvJjdHfs0
静的な配列は欲しい。

しかし、
Dim i As Integer : i = 5
Dim a(i) As String
を静的にするのはどうにも無理だった。

というだけのことなんじゃないかな。
406 :
2017/03/28(火) 22:39:27.90 ID:7XREnoOE0
>>387です。
昨日はコードを教えてくれてありがとうございました。
>>389さんのコードでやってみたのですが、上手くいかないです・・・。

すいません、自分の説明不足だったのですが、
(1)とか(2)とかってつくのはファイル名(ブック名?)でした。
>>389さんの場合だとシートだと上手くいくのですが・・・。

Workbooks("今日の上がり").Sheets("今日の上がり").copy_
After:=Workbooks("集計マクロ").Sheets("集計マクロ")
407 :
2017/03/28(火) 22:40:20.27 ID:dxleZkXF0
二次元配列のReDim Preserveって、最後の次元しか変更できないんじゃ使い道無いじゃん、と思ったが、
縦と横を入れ替えればいいんじゃん。

って思ったが、やっぱり慣れないから見づらいじゃん。
408 :
2017/03/28(火) 22:42:12.74 ID:7XREnoOE0
追記

今日一応ワイルドカードとかつけて色々試したのですが、ダメでした。
>>389さんのだと、「インデックスが有効でありません(エラー番号:9)」と出てしまいます。
409 :
2017/03/28(火) 22:46:17.17 ID:y6dX2FWHa
>>407
WorksheetFunction.Transposeを使うパターンだけど1行だった時は1次元配列になっちまうんだよなあ。
410 :
2017/03/28(火) 22:47:43.31 ID:7XREnoOE0
追記:仮に「今日の上がり(1)」を取り込もうとすると

Sub test()
For Each x In Workbooks("今日の上がり").Worksheets  ←ここでエラーが出てしまいます。
If x.Name Like "今日の上がり*" Then
x.Copy after:=Workbooks("集計マクロ").Sheets("集計マクロ")
End If
Next
End Sub
411 :
2017/03/28(火) 22:47:53.39 ID:QvJjdHfs0
>>407
Yes
そういう時はオブジェクトの列にするか配列の列にするのかも
412 :
2017/03/28(火) 22:47:59.33 ID:wdEWQ5Te0
Dirでファイル名を確定させてから処理すればいいんでない?

BookName = Dir("今日の上がり*.*")
If BookName <> "" Then
Workbooks(BookName).Sheets("今日の上がり").copy_
After:=Workbooks("集計マクロ").Sheets("集計マクロ")
End If
413 :
2017/03/28(火) 22:49:29.50 ID:y6dX2FWHa
>>408
Sub test()
For Each x In Workbooks("今日の上がり").Worksheets
If Instr(x.Name, "今日の上がり")>0 Then
x.Copy after:=Workbooks("集計マクロ").Sheets("集計マクロ")
End If
Next
End Sub

でどうだ?
414 :
2017/03/28(火) 22:50:51.66 ID:7XREnoOE0
>>412
「今日の上がり」と「集計マクロ」は両方開いたままの状態なのですが。
Dirって使えるんですか?
Dirって対象のファイルが閉じてる時じゃないと使えないとかありますか?
(初心者ですいません)
415 :
2017/03/28(火) 22:53:02.48 ID:7XREnoOE0
>>413
今日の上がり(1)を取り込もうとしたとき、

Sub test()
For Each x In Workbooks("今日の上がり").Worksheets  ←ここでエラーが出てしまいます。
If x.Name Like "今日の上がり*" Then
x.Copy after:=Workbooks("集計マクロ").Sheets("集計マクロ")
End If
Next
End Sub

最初の一行目で既にエラーなのですよね・・。
>>413さんのは2行目からは今までとは違いますが・・。
(今手元にその集計ファイルがないんで出来なくてすいません)
416 :
2017/03/28(火) 23:04:34.16 ID:QvJjdHfs0
>>414
普通に
For Each x In WorkBooks
If x.Name Like 〜
でいいように思えてならないが?
417 :
2017/03/28(火) 23:07:19.26 ID:r9lC3srD0
x.Sheets("今日の上がり").Copy after:=Workbooks("集計マクロ").Sheets("集計マクロ")
も修正
418 :
2017/03/28(火) 23:14:26.90 ID:7XREnoOE0
>>416
シートならそれでも上手く行くんですよね。
ですが、ファイル名が変わると出来なくなるみたいです。
419 :
2017/03/28(火) 23:34:59.25 ID:jSAv5Xa30
>>418
>>416 さんので良いと思うのだが
どうダメなの?

ブック名とシート名が同じだから混乱してないか?
420 :
2017/03/28(火) 23:44:34.14 ID:OuWj1GSF0
>>406
Const コピー元ワークブック名 = "今日の上がり"
Const コピー元ワークシート名 = "今日の上がり"
Const コピー先ワークブック名 = "集計マクロ"
Const コピー先ワークシート名 = "集計マクロ"

Sub test()
For Each x In Workbooks
If x.Name Like ワークブック名 & "*" Then
For Each y In x.Worksheets
If y.Name Like ワークシート名 & "*" Then
y.Copy after:=Workbooks(コピー先ワークブック名).Sheets(コピー先ワークシート名)
End If
Next
End If
Next
End Sub

こういうこと?
421 :
2017/03/29(水) 06:02:01.50 ID:rjGgE2Ur0
>>387です。
みなさんありがとうございます。
みなさんの教えてくれたコードで一旦試してみます。

>>419
ブック名とシート名が同じなのでオカシクなってる可能性はありますね・・。
422 :
2017/03/29(水) 12:46:03.55 ID:0n7r/WJXa
>>421
プログラムはそんなことで混乱しません。
あなたが混乱しているのでは?という意味だろ。

それぞれのサンプルを一行ずつどういう意味なのか考えれば、最初のサンプルで解決できた筈だよ。
ブックの中の全てのシートを見ていって、該当する名前のシートかどうかを調べるサンプルなんだから同じように全てのブックを見ていって、該当する名前のブックかどうかを調べるコードを書くだけだ。
それが>>416さんの方法だ。
423 :
2017/03/29(水) 17:48:34.37 ID:8sw2I1PH0
>>401
難しくてなんのこっちゃよく判らんけど、探し出してきてくれてありがとです。 w
424 :
2017/03/29(水) 19:09:46.40 ID:2Prvi8gF0
>>423
調べてみたらxlsファイルの中に、VBAをコンパイルしたデータ(pコード?)が保存されてて、その情報を削除してくれるツールのようだね
RelaxToolみたいに結構な量のマクロが入ったアドインの容量削減に使うと良いみたい。
425 :
2017/03/29(水) 23:15:25.05 ID:6GdUSfve0
>>387です。
皆さんからのアイデアを基に色々やったら出来ました!
ありがとうございます。
426 :
デフォルトの名無しさん (ワッチョイ efa6-agmj)
2017/03/30(木) 00:10:16.15 ID:mBKkA2D60
テーマの配色をオリジナルな色で登録したいのですが
VBAでユーザー定義を登録できますか?
http://officetanaka.net/excel/vba/cell/04-24.png
179KB

新着レスの表示

★スマホ版★■掲示板に戻る■全部前100次100最新50

名前:E-mail: