ExcelのVBAに関する質問スレです
★1 質問テンプレ(雛形)は用意しませんが、OSとExcelのバージョンは必ず書きましょう。
★2 ExcelのVBA以外の部分に関する質問はNGです。
但し、VBA無しでも出来ることだが、あえてVBAでやりたいって物に関してはOK。
★3 ExcelのVBE(Visual Basic Editor)を使うとしても、VBAの分野以外に関してはスレ違いです。
VBAとは、『Visual Basic for Applications』の略で
Application
├Workbooks
|└Workbook
| ├Worksheets
| |└Worksheet
というApplication以下のオブジェクトを、VB言語で操作するものを指します。
例えExcel付属のVBE(Visual Basic Editor)を利用しようとも、このApplication以下のブックやシート、
セルやオブジェクト等を操作するもの以外はVBA分野の話ではないので、ここでは聞かないでください。
★4 とりあえず、Excelのインスタンスを作らずにVB6で出来ることは全てスレ違いだと思ってください。
★5 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み、
コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。
ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。
★6 わからなければとりあえず「マクロの記録」(Alt, T, M, R)
前スレ:Excel VBA 質問スレ Part26
http://toro.2ch.net/test/read.cgi/tech/1345363310/
わからなければとりあえず Alt, T, M, R
T, M, R
T, M, R
4 :
デフォルトの名無しさん:2012/11/25(日) 20:29:39.60
新しいスレッドを立ててくださいです。。。
くださいです。。。
。。。
くださいです (ワラ
5 :
デフォルトの名無しさん:2012/11/25(日) 20:32:51.83
ある特定のシートに関連づいたWindowオブジェクト(複数ある場合もあり?)を取得するにはどうすればいいんでしょうか
WorkbookのWindowsプロパティやActiveWindowだと
状況によって意図しないWindowを取得してしまいそうなんですが
6 :
デフォルトの名無しさん:2012/11/25(日) 22:27:14.08
大阪マラソンのページで、ここにナンバー(4ケタ)を入れて検索すると、走った人の名前とゴールタイムや各5kmごとの区間タイムが出てきます
http://p.twpl.jp/show/orig/htR9M できるだけたくさんのデータをVBAを使って収集したいのですが、
そのために使用するブラウザを操作してwebからデータを集めるための使用するステートメントや関数などのコードは
どんなものがあるか代表的なものから便利なものまでひととおり教えていただけませんか?
お約束のようなので付け加えますと
(この質問を理解できるのはかなりVBAに精通してる人のみだと思いますが)
Excel VBAの勉強にオススメの本かサイトなどあれば教えてください
>>7 ★6 わからなければとりあえず「マクロの記録」(Alt, T, M, R)
正直な話、VBAはド素人でも何とか書けちゃう言語なのに
本とかサイトに沿って勉強しようとしてる時点で向いてない気がするよ
とりあえず書いて困ったら検索の方が合ってる言語だと思う
大抵やりたいことをぐぐれば答えが見つかるし
>>10 それは他言語の経験がある人の場合だな
どんなに簡単な言語でも素人がいきなり書くのは無理
アルゴリズムとか変数の概念とか、言語の種類に関係ない基本事項はやっぱりきちんと勉強しないと
13 :
7:2012/11/26(月) 01:46:15.16
そんなに難しく考えるようなものじゃないんですね
ありがとうございます
14 :
デフォルトの名無しさん:2012/11/26(月) 03:01:49.13
○ ∇ 、,、´`゙;~、 ';冫 ☆
┏ ━ゝヽ''人∧━∧从━〆A!゚━━┓。
╋┓"〓┃ < ゝ\',冫。' ∩___∩ ゛△│´'´,.ゝ'┃. ●┃ ┃┃
┃┃_.━┛ヤ━━━━━ | ノ ヽ━━━━━━━━━ ━┛ ・ ・
∇ ┠─Σ-/ ● ● | ァ Ζそ,´; ┨'゚,。
.。冫▽ < | ( _●_) ミ 乙 ≧ ▽
>>1乙
。 ┃ 彡、 |∪| 、`\ │ て く
┠─./ __ ヽノ /´> )'.┼ ァ Ζ┨ ミo''`
。、゚`。、 (___) / (_/' × 个o
○ ┃ `| / !ヽ.◇ o┃
┗〆━┷ Z,.' /┷━''o ヾo┷+\━┛,゛;
ヾ '、´ ∇
>>12 トップだけあって、お面と足の筋肉のギャップが凄いなw
そろそろ
>>6がとんでもないリンクを貼ってしまったことに気付く頃合かな
18 :
6:2012/11/26(月) 21:17:48.15
動的配列をdimで宣言しておいて、後からredimで要素数を指定する、
という使い方の場合、
その配列が
redimしてあるかどうかを調べる方法ってありますか?
別プロシージャから引数で渡された配列を処理する時に、
宣言だけでredimされていない変数は処理をスキップしたいのですが、
isarrayでは区別できませんでした。
(要素数が指定されてなくてもtrueになってしまう。)
使用しない変数にもredim (0) をするのは、
コードの改修がかなり必要になるので、出来れば避けたいです。
何か良い方法がありましたらアドバイスいただけると幸いです。
20 :
19:2012/11/27(火) 13:02:23.62
書き忘れてましたが、何故処理をスキップしたいのかというと、
redimされてない変数を処理すると
実行時エラー '9':
インデックスが有効範囲にありません。
というエラーがでるからです。
24 :
19:2012/11/27(火) 15:53:11.68
>>22 そうです、私の書いたコードのアルゴリズムがまちがってるので
エラーになります。
根本的に直すのは複数箇所の修正が必要になるので、
小手先でごまかそうと考えて先の質問をしました。
>>23 ありがとうございます。
残念ながらuboundもダメでした。やはり
インデックスの有効範囲〜
のエラーになります。
25 :
桃白白:2012/11/27(火) 16:04:24.14
27 :
19:2012/11/27(火) 16:08:11.75
連投すみません
とりあえず、邪道ですがエラートラップを用いて応急的に対策しました。
お騒がせして申し訳ありませんでした。
ちなみにこんな感じです。
On Error Resume Next
If UBound(hoge) < 0 Then
On Error GoTo 0
Else
On Error GoTo 0
[本来の処理]
End If
28 :
19:2012/11/27(火) 16:11:50.63
すみません。リロードしてませんでした。
アドバイスありがとうございました。
今後の参考にさせて頂きます。
「配列 空 vba」とかでググったらいっぱいヒットするけど・・・
30 :
19:2012/11/27(火) 16:22:47.40
いずれにしても、関数にした方がいいよ。
If not not varArray Then
とか、何を調べてるのかぱっと見意味不明だし。
If IsVarArrayEmpty(varArray) Then
とか
If Not IsVarArrayEmpty(varArray) Then
だったらわかりやすいでしょ。
色々調べたのですが突破口が見つかりません。
質問させてください、お願いします。
・Windows7,Office2007です。
1
2
1
0.5
2
…
と、D行に数字がありまして、合計8になるように並び替えたいのです。
もし、1+2+0.5…=7.5となった段階で、次の並びが1、2、0.5となっていた場合は、
1や2ではなく、0.5を選択したいです。
そして、1や2が入っていた行の上に、0.5が入っていた行を持ってきたいのです。
これを、配列がなくなるまで続けたいのですが、どのようにすればいいかが掴めません。
ご教授、宜しくお願いします。
>>32 質問1 数字は0.5、1、2の3通りだけ?
質問2 全体の合計は8の倍数になってる?整理したらきっちり最後まで「合計8」のグループに分けられる?
あれ、書き込んでなかった
困ってること:文字列(フォント)の横幅dot数を調べたい
Graphics.MeasureString メソッドがあればいいんだけれど、エクセルなので・・・
どうしたらいいでしょうか
>>34 GetTextExtentPoint32
うおーありがとうございます
37 :
32:2012/11/28(水) 02:13:13.20
>>33 ご回答ありがとうございます。
質問1 数値自体はその3つのみです。
質問2 いえ、全体の合計は不明です 少なくとも、8の倍数キッカリには収まりません
>>32>>37 ループ(
1 D行を足す、列番号を取得
2 8未満である
Y→1
8である
Y→ループ抜ける
8以上である
Y→最後の加算を破棄して次の列にいく→1
)
3 取得した列番号を基に列を入れかえる
>>32 まず一点、誤りを指摘すると、
エクセルでは「D行」とはいわず「D列」といいます。
「行」というのは1〜の縦方向、
「列」というのはA〜の横方向の呼び方です。
それであなたの質問に対する確認なのですが、
行を入れ替える条件はもっと限定できませんか?
たとえば、
1
2
2
2
0.5
1
2
0.5
と並んでいたら
1+2+2+2+0.5…(2個飛ばして)+0.5
で8ですが、
1+2+2+2…(1個飛ばして)+1
も8になります。
つまり数値の取り方に複数の候補がある場合、
どれを優先すればよいのかがよく分からないのです。
その部分はもっと厳密に説明する必要があると思います。
自由に並べ替えていいんなら全体を降順ソートすれば一発で終わるんだけど
42 :
32:2012/11/28(水) 08:57:48.88
>>38 ありがとうございます、早速試してみます
>>39 すみません、初歩的なミスでしたorz
順番ですが、上にあるもの程、優先になります。
その例ですと、1+2+2+2+0.5…(2個飛ばして)+0.5
を選択し、飛ばした先にある0.5を、
1+2+2+2+0.5 の次に並び替えるようにしたいです。
>>40 説明不足でした、優先順位がありますorz
つかここアルゴリズムスレじゃないんだから、方法は自分で考えろよ
その方法をVBAで実装する段階になってから質問しろや
44 :
32:2012/11/28(水) 18:32:59.44
皆様、ご指導ありがとうございます。
>>38さんのアドバイスを参考に、
汚いソースになりましたが、なんとか完成致しました。
スレ汚し、失礼しました
45 :
34:2012/11/28(水) 18:34:40.00
Excel2000に64bitバージョンなんてあったか?
どっちにしてもOSの情報わからんと何とも言えんわ
47 :
34:2012/11/28(水) 19:09:14.68
win7 64bit機です
何か勘違いしてたかも
>>45の
19: hWnd = Application.hWnd
でエラーが発生して動作しなくなりました
winXP 32bit機 Excel2000の入ってるPC引っ張り出してきて実行したところ
オブジェクトはこのプロパティまたはメソッドをサポートしていません
とエラーを生成しました
PC環境で実行できたり出来なかったりするんですが、何か参照設定が必要だったりするのでしょうか
48 :
34:2012/11/28(水) 19:22:47.39
・・・ああ判った
Application.hWnd てexcel2000じゃサポートしてないのか
ってことですよね
まず、
OSに32/64ビットの区別があること
EXCELに32/64ビットの区別があること
を理解してから出直してください
Long Long Ago問題か?
bit数とかPtrSafe以前にExcel2000じゃ動かないって話
OSとか関係ないって突っ込んでるの一人もいない・・・
楽しみは最後までとっておくタイプ
>>47 Excel2000の時代にはウィンドウハンドルが簡単に拾えるApplication.Hwnd なんて
便利なものは無かったからな。
Excel2000も守備範囲なら API FindWindow でExcelのウィンドウハンドルを取得
するようにしておけば新旧Excelで使える。数行増えるだけだし。
ってVBAからだんだん離れるのであとはググれ
>>50 でもExcel2000は32bitしかないでしょ。
13年前のソフトだよ?
56 :
デフォルトの名無しさん:2012/11/30(金) 18:40:44.70
助けて下さい!マジではまってます。
指定したディレクトリの中にあるファイル一覧を取得しようと
下記コードを書いたのですがなぜか、エラーが出てしまいます。
どこに問題があるのでしょうか?
Dim path_test As String
path_test = "C:\test"
Dim file_count As Integer
file_count = 0
strFileName = Dir(path_test & "\*.*", vbNormal)
Do While strFileName <> ""
strFileName = Dir() '★エラー発生★
file_count = file_count + 1
Loop
★エラー発生★
実行時エラー'5': プロシージャの呼び出し、または引数が不正です。
strFileName = Dir() ここ
58 :
デフォルトの名無しさん:2012/11/30(金) 19:08:22.96
>>57 エラーの起きる場所は分かってるのですが
strFileName = Dir() ← なぜここでエラーになりますか?
ネットで解説されたコードをそのまま利用しているのですが
その解説サイトの人は特にエラー発生の可能性については言及していませんでした。
>>56 これが全ソースコード?
このコードだけをサブプロシージャにしてエラーが出るの?
変数の命名ルールがキショいね
60 :
桃白白:2012/11/30(金) 19:24:36.72
>>56 そのコードには問題ないアルよ。
最初のDirを忘れてたり再帰でぐーるぐるしてたりするんじゃない?
桃白白はそういう疑念を持っています。
strFileNameをint指定してるのに、Dir()格納できねええだろ
フォルダ名一覧取得するためにstrFileNameとやらの中身に入れるなら別のstring型変数いれないと
あ、ごめん適当なこといった
C:\testってちゃんとフォルダが存在するよね?
Adodbオブジェクトは実は全力の5%位の力しか使っていないと聞きました。全力を使ったらどうなるのでしょうか?地球が壊れますか?また、どんなメソッドが使えるのでしょう。
良かったら教えて下さい
>>56 tempフォルダかその中のファイルに、アクセス権のないのがあるんじゃ?
66 :
56:2012/11/30(金) 20:02:47.65
>>59 問題となる部分のコードです。
一部ネット上に転がっていたソースを流用している為です。
>>60 >>61 >>62 再起処理はやっておりません。
また、 c:\test も存在しています。
私の環境が問題なのかなぁ?
Excel2010 でマクロ組んでるんですけどん。
>>65 tempじゃなくてtestだった
フォルダなくてもエラーにはならないっぽいから、フォルダはあるのに
ファイルかフォルダにアクセス権ないんじゃ?
>>66 問題となる部分かどうかはお前が判断するな
全コードを提示して
普通にExcelで、セルの色とかフォントの色を変えたいとき
ツールバーの該当コマンドボタンの▼をクリックするとカラーパレットが展開されて
そこから色を選ぶことができるんだけど
例えば
セルに下線を引くマクロを作ったとして、複数セルを選択し
・マクロボタンの▼をクリックして、カラーパレットが展開されて、「カラーを選んで下線を引く」
フォントの既定組み合わせ{明朝11、明朝13、ゴシック10、ゴシック11、ゴシック13}等を設定しておき
・マクロボタンの▼をクリックして、フォント・フォントサイズの組み合わせから選択して「フォントを変更する」
みたいなことってできますか?
できる
右クリックやツールバーからできることは大体できる
書式設定とか普通
>>66 ちなみにエラーが発生したとき、
変数"file_count"の値はどうなってます?
(コード中断時に file_count の上にマウスカーソル持ってくれば値が表示されます)
73 :
デフォルトの名無しさん:2012/12/01(土) 00:57:31.13
>>72 ありがとうございます。
どうしてもDirを使った方法だとできなかったので Fileうんたらの方法を使ってうまくいきました。
74 :
デフォルトの名無しさん:2012/12/01(土) 01:39:54.57
VBA エディタで行番号を表示させる事は出来ないのでしょうか?
>>74 アドイン公開してる人がいたような
ググればすぐに見つかるはず
セルに入力させるにあたって、1又は9以外を入力させたくないんですが、そういうことって出来ますか?
>>76 VBAではないが
セルに入力規則を設定して
マウスで候補を選ばせるのはどう?
>>77 入力規則のこと忘れてました^^;
それが良いですね。ありがとです
>>76 >>77の方法が一番簡単だけど、
どうしてもVBAでやりたかったら対象のシートにこんなマクロを設定してみる。
特定のセルのみの設定なら修正が必要。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim tmpRange As Range
For Each tmpRange In Target
If tmpRange.Value <> 1 And tmpRange.Value <> 9 Then
tmpRange.Value = ""
End If
Next
End Sub
>>79 ありがとう。今やってんのはC3セルのみなんで
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
If Target.Address = "$C$3" Then
If Range("c3").Value <> 1 And Range("c3").Value <> 9 Then
MsgBox "値は1,9のいずれかのみ 訂正!", vbOKOnly
End If
End If
Application.EnableEvents = True
End Sub
という事にしました。入力規則も簡単で良いんですが、VBAの勉強も兼ねて^^;
そりゃだめだC3を含んだ複数セルをコピペした場合そのチェックは動かない
targetをFor EachしてC3セルだった場合にだけチェックするように書き換えないと
これはVBA以前の問題で全てのケースを洗い出す想像力大切よ
チェンジ かつ 固定セルなら
V = Range("$C$3").Value
If V <> 1 And V <> 9 Then MsgBox "$C$3 is 1 or 9 only.", vbOKOnly
でいいじゃん入力規則でいいじゃん
入力規則の方が高速でいいよな
人間が介在する作業で高速もクソもないだろ
どうがんばっても人間の指の方が遅いんだから
スループットは確かに人間が介在したらそこがネックになるけど
操作する人間に対するレスポンスが早いか遅いかって話で、操作性の問題だな
人間の感覚でとらえられないぐらいの差ならどうでもいい
86 :
デフォルトの名無しさん:2012/12/01(土) 21:08:25.23
VBA で
c:\test\ を
c:\test
という具合に末尾の \ を削除したいのですがどうすれば末尾の特定文字を削除する事が出来ますか?
87 :
デフォルトの名無しさん:2012/12/01(土) 21:13:58.31
自己解決
left でいけた。いkぅぅう
>>80 それだけのためにマクロ入れたらxlsmにするとかマクロ有効にするとかで嫌がられないか?
leftってまさか、なんでもかんでも一文字削ってるんじゃ…
HTTP/HTTPSで通信を行い、JSONPのデータをデコードして
セルに書き出すようなExcelVBAのサンプルなどはございますでしょうか?
よろしくお願いいたします。
そんなCOMはねえな
と思ったらJScript使えばそのままいけるのか
「vba HTTP/HTTPSで通信を行い、JSONP」でぐぐれ
>>92 ありがとうございmす、さっそくググってきます!
対象バージョンは2007以降です。セルの幅と高さを初期化する方法を教えてください
ぐぐったら以下のようなコードが出てきましたが、数値で指定するのはなんだかスマートじゃない気がします
ActiveSheet.Cells.Select
Selection.RowHeight = 13.5
Selection.ColumnWidth = 8.38
例えばRowHeight.SetDefaultみたいに初期化する方法が用意されていたりはしないんでしょうか?
95 :
デフォルトの名無しさん:2012/12/05(水) 13:15:35.60
会社でその部署の各個人のPCすべてに
個人用のマクロ(フォームモジュールと標準モジュールの2つのファイルがある)をインポートさせてあげたいんですが
中にはおじいちゃんおばあちゃんがいるので
手順を示すのではなくVBAに似たVBSでスクリプトを書いて
そのファイルをダブルクリックすればいいだけ、というようにしたいです。
どうすればできますか?
>>95 とりあえずこんな感じのコードをAutoOpenに仕込めば可能だけど
Workbooks("Book1.xls").VBProject.VBComponents("Module1").Import Filename
全部で何人(何台)あるの?
作る手間と説明する手間を考えると、もし100台程度なら昼休みに自分と数人の詳しい仲間でクリックして回った方が早いよ
どんなに簡単にしても、普段と違うことはできない人、更新の指示を見落とす人なんかが年齢に関係なくいるし
設定をいじっちゃってて作ったスクリプトがうまく動かないマシンなんてのも必ず出てくる
仕事で使うんならあんまり凝ったことはせずに確実にやる方法を考えた方がいいよ
97 :
デフォルトの名無しさん:2012/12/05(水) 13:50:17.79
>>96 ありがとうございます。
たしかに机を回るのも手だけど
コードもときどき更新するので
そのたびに机を回るのは今後を考えると面倒。
そのAutoOpenを検討させていただきますね。
objIE.Document.All("BtnID").Click
これでIEのクリック操作で押せるボタンがあります
変数で使いたいので下記のようにするとエラーとなり押せません
変数を宣言しないと押せます(Variant型)
ここに使えるデータ型は何でしょうか?
Dim ID As String
ID = "BtnID"
objIE.Document.All(ID).Click
100 :
98:2012/12/06(木) 17:58:36.90
配列に値を格納するのにいちいち For Nextでループしていかないと出来ないっすかね?
たとえばC13からF13に数値が入っていたとして
Dim hairetu(4) As Integer
hairetu = Range("c13:f13")
とかってすると
コンパイルエラー
配列には割り当てられません
って出るんだけど何か方法とかありません?
例は範囲が小さいからループでも大したことはないけど、これが大きくなると…と思いまして
配列からシートへの転記は一発だったんだが、シートから配列へはちょっとめんどくさかった
for each使うとかいろいろ手段はあるけど
変数をvariant型にして
変数 = range("セル範囲")ってすれば変数にセルの内容ぶちこめる
その後配列に入れるとかするとちょっと楽
>>102 すいません、ちょっと具体的にお願いm(__)m
101の例で
Sub testArray()
Dim i As Integer, j As Integer
Dim hairetu(4) As Integer
Dim ha As Variant
ha = Range("c13:f13")
〜
For i = 0 To UBound(ha)
hairetu(i) = ha(i)
MsgBox hairetu(i)
Next
End Sub
〜の部分で配列に分解するのはどうするんですか?
>>103 Sub testArray()
Dim i As Long
Dim ha As Variant
ha = Range("c13:f13")
For i = 1 To UBound(ha, 2)
Debug.Print ha(1, i)
Next
End Sub
haは配列じゃないからiでまわさない
for each in i
hairetu(変数) = i
next
二元配列の場合変数を加工
多分調べればスマートなやり方いくらでも落ちてると思う
106 :
101:2012/12/08(土) 19:47:51.78
つき合っていただき、ありがとうございます
>>105 IsArray(ha)でtrueが返ってくるのに配列じゃないの?
配列なんだけど
なんていえばいいのやら
中みれば判るけどデータ上は二元配列になってるから普通の配列として扱うのは宜しくない
>>108 どういうこと?
haをウォッチしてみたけど普通の二次元配列だったよ?
>>105(
>>108?)
横から失礼します
二元配列ってどういう意味ですか?
ググって見たのですがよく分かりませんでした。
いわゆるジャグ配列ということでしょうか?
それとも二次元配列のことでしょうか?
ちなみに自分はセルの値をしょっちゅうVariant変数に代入して、
それをFor Nextで加工してます。
特に何も考えずに普通に二次元配列として扱ってました。
111 :
109:2012/12/08(土) 21:32:21.31
あれ?もしかして二元配列と二次元配列って別物?
112 :
110:2012/12/08(土) 21:39:04.23
>>109 自分もそれが分からないから質問したんですけど、
Variant型変数にセルの値を入れたときって普通の二次元配列ですよね?
セル範囲をバリアント型に代入したときは普通の2次元配列
単一セルのRange.Valueは配列にはならない
range型の配列ってclone出来たっけ?
そもそもVBAの配列にcloneなんてないはず
range型の配列ってのも何を指すかはっきりしない
exlap.rb使ってRubyでマクロ組み込もうとしてます
Excel2007で.xlsで保存してるんだけどマクロのセキュリティはあらかじめExcelの方で設定しなきゃいけないんだよね?
有効にしても動かないしどれ選んでも動かないんだけどどうしてなの?
ここは「ExcelのVBA」の質問のスレなんだよね?
なんでもの方に書いたつもりでしたスマソ 移動します
>>101 ループ回して入れたほうが速いけどVariant型変数に
hairetu = Application.Index(Range("C13:F13").Value,0)
とすればhairetuは一次元配列になってる
すまんWorksheetFunction.Indexで良かったわ
前スレでソートの質問をした者です
その時解決した質問はSheet1でセルを選択した時にSheet2の関連度を呼び出してソートする方法でした
http://www.dotup.org/uploda/www.dotup.org3715704.png 例えば,C1[う]を選択したら,Sheet2で[う]をみると関連のある順に[う][い][あ]なので
Sheet1全体を
A B C
1う い あ
2く き か
3す し さ
と並べ替えるというものです
その時桃白白さんに頂いた回答がこちらです
https://friendpaste.com/2SD94Big6C5rrUcyFYuphe さらにセルに色をつける方法について質問があります
上の状況と同じように[う]を選択した場合にsheet1を並べ替えると同時に
[う][い][あ]の順に濃い色をつけ(赤→ビビッドピンク→パステルピンクのように…)
さらに[う]を選択した場合に2行目に関してはSheet3の関連度を呼び出して
[く]を軸に[く][か][き]の順に濃い色をつけ
3行目も同様に[す]を軸に[す][し]=[さ]の順に濃い色をつける,ということは可能でしょうか
全くの初心者で上のプログラムを一行ずつ調べて理解するのがやっとというレベルです
アドバイスお願いします
>>121 どの行でどのシートを参照するのかはどうやって判断するのですか?
>>123 そういう愚にも付かない事は書かなくてよろしい
並べ替えのオプションとは違う話?
セルに色をつける でググれば解決するじゃん
ソースコードの的確な場所にコードを追加するだけ
だから
何
自助努力すら出来ない人を甘やかし救うスレなのかと
白桃が甘やかしたんだから白桃が最後まで責任持てばいいだけ
甘やかさないならスルーしてろよ
ってだけの話
自分で検索すらしない愚者に振り回されすぎだぞ。
>>121は白桃担当。
蛇足だがそもそも
>例えば,C1[う]を選択したら,Sheet2で[う]をみると関連のある順に[う][い][あ]なので
ここが、5、3、0とか解説がないから意味わからん。
検索もできない、説明もできない、そんな奴を相手に白桃さんは親切だな。登場を待とうじゃないか。
>>121 なんか最近、3×3の9マスのソートのアルゴリズムの研究をどこかで見た気がするんだけど・・・
それ関連?
そもそもマクロの記録すれば即解決じゃねえか
うんこにもほどがある
>>134 どの質問に対する回答なの?
まさか
>>121宛じゃないよね?
あれはマクロの記憶じゃ無理
>>135 てかさ、プログラムなんて単純な処理の集合なんだから、それを一つずつクリアして
やりたい処理に組み合わせればいいだけだろ。
単純な処理の部分についてはマクロの記録で充分。
138 :
桃白白:2012/12/12(水) 07:00:05.20
>>132 このテンプレって誰が考えたのか知らんけどすてきだなと桃白白思うの。
VBプログラマ質問スレ(Ver.6.0 まで) part60
http://toro.2ch.net/test/read.cgi/tech/1351327234/ >答えられない質問は無駄に罵倒せずスルー。無理するな。
まさにお前のようなやつを諫止するためにあると思うの。お前はまじめなやつなんだと
桃白白思う。答えようと必死になるけど答えられなくてやり場のない苛立ちを
質問者にぶつけてしまう甘えんぼなんだと思う。桃白白はお前の思いを受け止めよう。
なぜならば桃白白は心が広いから。俺のことはパイパイさんと呼べ。
パイパンさんかっけー!
マジリスペクトっす!
あんなのに、マジで答えられないやつなんているのかよw
>>140 せっかく白糖をおだててるんだから黙ってろ
142 :
69:2012/12/12(水) 13:55:33.53
>>70-71 VBを使ってかなりややこしいことをするのかと思い、具体例を聞かなかったのですが
ふと思い出して検索してみたら、至って簡単な手順でできるのですね
ツールバーに「新しいメニュー」をペースト
さらにそのメニューに「新しいメニュー」をペースとして階層化
そこにマクロを好きなだけ貼り付けていく
条件の入力と、VBの中で細かな分岐みたいなことをしなくても
条件の違う似たようなマクロを必要なだけ作っておいてメニューで選択すればOK
たったこれだけでした
メニューバーに自作マクロをグループ分けして「新しいメニュー」を並べることもできる
VB以前の話しでしたw
vba処理でメニュー出したり消したりできるからまあ
144 :
桃白白:2012/12/13(木) 12:37:08.08
>>141 おーまーたー
>>121 桃白白実装したから試してみて
friendpaste.com/2HcrMkLVj8VbUfTrZXDCy2
>>139 桃白白、またの名を下の毛タワシ丸と申すみたいな。やめろバカ。
パイパンじゃないパイパイだ。
この処理をwithでまとめたいのですがどうすればいいですか?
If Worksheets("test").Cells(20, 1) = 1 Then
Worksheets("test").Cells(20, 2) = 1
End If
自分で書いたやつだとエラーは出ないのですが上手くいきません
With Worksheets("test")
If .Cells(20, 1) = 1 Then
.Cells(20, 2) = 1
End If
End With
withってそんな使い方できたかよ?
できるが
動くが
シート名とかセル範囲とか確認してみ
A20に初めから1って入ってて気づかないか、B2を見てるかに3000ペリカ
B20だ
A20が1じゃない可能性もあるな
>上手くいきません
単に上手くいかないってだけでなくどう上手くいかないんだよ。それを説明しる
.Valueがないとか関係あるんだろうか
Withステートメントをネストしてるとか。
With hoge
With Foo
処理
End With
End With
処理は正常だが気づかんだけだろう
withのダブルネストでも動く
システムメッセージが出ないってことはエラーも何も発生しておらず、正常に動作してるんだろう
155 :
リリン:2012/12/13(木) 21:13:23.50 BE:427711777-PLT(45072)
withってホワイトスペースはさんでてもおkなの?
挟まないと動作しないが・・・どういう意味で?
>>145 は記述上何も問題ないだろ。盛り上がり過ぎやで。
暇だし簡単な案件だし質問者が出てこないから、他の質問でもないとしょうがない
>>158 では質問
ツールバーにある「塗りつぶし」ボタン
現在設定の色がボタンに表示されている
ボタンクリックで、指定セルがその色に変わる
ボタン右の▼をクリックすると
カラーパレットの表示された窓が開き、各パレットをクリックすると
指定セルの色が変わる
またパレットの上端をドラッグするとパレット自体をツールバーから切り離して
好きな場所に移動でき、かつ×ボタンで閉じることができる
このパレットに色ではなくてマクロボタンを配置して使いたいと考えたことがあるんだけど
あるワークシートの作業をするときに使用するマクロのグループをパレット上に配置し
作業をするときだけ、パレットを切り離して作業しやすいところに常時表示させて
ダイレクトにマクロボタンを操作できるようにする
使わないときは呼び出しボタン(「塗りつぶし」ボタンみたいなイメージ)だけツールバー上にあり
必要なときにパレットを表示して使う
みたいなことはどうやればできますか?
ツールバーを作れば似たようなことはできますが
ツールバーでええやん
>>144 ありがとうございます
これをもとに書き換えてシステム実装していこうと思っているのですが
63行目でアプリケーション定義またはオブジェクト定義のエラーが出てしまいます
その前にもユーザ定義型は定義されていませんと出たのですがツールの参照設定を変更して出なくなりました
162 :
161:2012/12/14(金) 23:36:33.23
>>144 できました!ありがとうございます!
本当に嬉しいです心から感謝です
まだまだ解読途中ですががんばります
パイパンか。
いいこと聞いたw
質問です
VBAでWorksheetFunction.NormSInv(Rnd)を2万回行うと、時折「取得できませんでした」というエラーで止まります
普通に2万回計算を終えて終了することもあります
エクセルシート上で関数=normsinv(rand())を計算し、値で別シートに貼り付けて保存する
再計算を行って2万回これを繰り返すというマクロにすると、今のところ一度もNUM!という結果が現れていません
VBAのWorksheetFunction.NormSInv(Rnd)がエラーで時折停止する理由を教えていただけないでしょうか
ランダム数で0を取得してしまい、NORMINV(0)=NUM!と同じことになっているのだろうと現在推測しているのですが
そうするとエクセルシート上で=normsinv(rand())を行っても同じ頻度でNUM!が結果に出ていてもいいと思われるので
根本的にマクロを間違っているのでしょうか
それともVBAのRndとエクセルシート上で使うRand()は別のものなのでしょうか
どうぞよろしくお願いします
二万回も何すんだよ
>>164 別物と言えば別物ではあるけど、ヘルプを見る限り、どちらも0以上1未満の数値を返す
つまりどっちにしても0でエラーになる可能性はあるわけで、単に確率の問題だと思われ
ヘルプに反してRandがゼロを返さない可能性も無いではないが
>>168 エラーで止まるとかよりrndで0が返るか確認すればいいのにとおもた
>>169 その通りですね
Rndをひたすら繰り返してみます
ありがとうございます
>>168 乱数つかって再現性とか...シード指定しろよ
>VBAにおいてWorksheetFunction.NormSInv(Rnd)が「取得できませんでした」とエラーで停止する理由
Rndがゼロを返すから
>VBAのRndとエクセルシート上で使用するRAND()は完全に同じものか
完全に同じものではない
>>171 ありがとうざいます
シードについて、まずは勉強していきます
不勉強で申し訳ございませんでした
>>168 頻度に差があるので気になっていますって
2万回なら頻度に差が出て当然だと思う
Excelの問題じゃない
質問です。
項目A 100
項目B 50
項目C 2
という値が入っています。項目A÷項目Bで、項目Cは「2」になります。
しかし、項目Aに50,項目Bに100が入ることがあります。
その場合、項目A÷項目Bをすると0.5となりますが、これを「-2」と表現したいです。
VBAの数式で、IF文を使わず、-2とできる方法がありますでしょうか。
>>174 法則がわからない
分数の分母にマイナスを付ければいいの?
>>174 AとBは50/100か100/50の2通りだけ?
>>175-176 普通にやると、項目Cのセルに、
IF(A1>A2,A1/A2,-(A1/A2))
とやればいいんですが、なんかスマートじゃないなぁと思いまして。
項目A,Bにはいろんな数字が来ます。ただし、A÷Bの順番は変えられません。
他にパッとするやり方があれば教えていただければ助かります。
それでいいんじゃね?
>>177 その式だとA1に50、A2に100が入っていた場合、-2じゃなくて-0.5になると思うけど、
本当にやりたいことはなんなの?
IF(A1>A2,A1/A2,-(A2/A1))
の間違いでしょ。それよりVBAなのかそうじゃないのかどっちよ
IFを使わずに書くこともできるけど、たぶんかえって長くなると思う
VBA使う必要ないよな
>>181 ただし、A÷Bの順番は変えられません。
指数使えば?
185 :
リリン:2012/12/17(月) 13:41:31.81 BE:305508375-PLT(45072)
Excelもってないんだけどどうすればいいですか、っと。
dotnetとテキストで1から作れば?
>>144 度々すみません
すべての行に対してソートを行うにはどこを書き換えれば良いでしょうか
色無し(121のリンク先)の時はコードを書き換えてすべての行を自由に選択→そこを軸にソートができたのですが
色がついたとたんに理解力が及ばなくなってしまいました…
189 :
桃白白:2012/12/18(火) 13:32:17.62
>>189 選択範囲は変わらない気がするのですが…
>>189 ごめんなさい,もう少しヒントを頂きたいです
実際に組んでるものはSheet1のA1:AG27にデータが入っていて,その内のCからAGの31件をソートしたいと思っています
選択できる範囲はそれぞれの9〜21列目,つまりC9:AG21です
なので以下のように直しましたがエラーが出てしまいます
29行目をWorksheets(rowNum - 7)←9行目選択でSheet2〜21行目選択でSheet14を参照するため
37行目Range("B1:AF1")←31件分
43行目Range("A2:AF32")←Sheet2以降のデータ入ってる31件分
92行目Range("C1:AG27")←Sheet1の中でソートで動かす範囲全部
エラーは実行時エラー9「インデックスが有効範囲にありません」です
どこか変更したりないのだと思いますがじっくり見ていってもどこだかわかりません
よろしくお願いします
>>191 書き忘れました
エラーが出るのは29行目の
Set GetSheet = Excel.Worksheets(rowNum - 7)
で調べたらrowNum=1になってしまっています
193 :
桃白白:2012/12/18(火) 17:43:06.32
>>192 ぇ・・・なんでだろ。C9:AG21の範囲でどれかひとつのセルが選択されると。
9行目から21行目に対応する関連度が書かれたシートがあると。
そうすると問題はカラーリングのところかしら。いまはソートされたところ
全部の関連度を引っ張ってきてそれを元に色付けするようになってる。
ソートする範囲と色付けする範囲が違ってたりしちゃうわけ?
まあまずはあれだな、原因を特定しなきゃいけないな。
' Coloring以降のコードをごっそり削除しても例外でる?
>>193 97〜114行目を削除したらエラーは出ませんでしたがマクロは実行されていませんとなりました
195 :
桃白白:2012/12/18(火) 18:10:16.66
>>194 ん?どゆこと?マクロが実行されなかった?
94行目は間違ってた。1をrowNumにして。
Call Sort(v, rowNum, GetRels(rowNum, char1))
色づけする範囲はC9:AG21?
>>195 ありがとうございます結婚してください
色付けの範囲はC9:AG21です
マクロの実行は私の勘違いでした(マクロの記録は現在行われておりませんの見間違い)
94行目を直して97〜114行目を削除したところ,色なしでのソートがうまくいきました
そのまま実行すると「インデックスが有効範囲にありません。(Error 9)」です
そろそろうざいな
読むからウザく感じる
読まずにスルーすればいいんだよ
丸投げのようで頑張ってるみたいだからいいんじゃね
今後馴れ合いしなければ
>>196 Coloring削除しても少しソートがうまくいかない部分がありました
ソートのみで間違いなく動くプログラムがこれです
friendpaste.com/21WFtusmIesUcgQ8eqvUpC
スレ汚しごめんなさい スレチでしたら誘導願います
おまえやさしくないやつだな
203 :
桃白白:2012/12/18(火) 19:15:43.20
>>201 つまらないものですがといって粗品と書かれた品物を渡されたら怒り狂うタイプ?
謙遜の心を知らずして日本で生きていくのはさぞかしつらいだろう。桃白白の手元に
バールのようなものがあったなら仁恵あふれる桃白白がお前の胸部に慈悲深い一撃をくれてやりたい。
できない
205 :
デフォルトの名無しさん:2012/12/18(火) 20:27:00.32
糞白白はいちいちうざくてきもちわるい
>>200のコードをもとに色を付けることはできませんか?
208 :
デフォルトの名無しさん:2012/12/18(火) 22:12:49.04
>手元にバールのようなものがあったならお前の胸部に一撃をくれてやりたい。
殺すぞって言ってるようだが気持ち悪くないのか?
気持ち悪いだろ。キチガイと言っていいレベル。
211 :
桃白白:2012/12/19(水) 13:29:09.45
パンパンか。
いいこと聞いたw
カンフーパンダっているじゃん
あーゆーやつで、道(タオ・ハンタの念とか、ドラゴンボールの気みたいなやつ)の使い手にパンパンっていたんだよ
パンダだからパンパン。
卑猥とかあのときのあれとか
パンパンかパイパンかどっちかにしなさいよ!
直接ExcelVBAの質問ではないのですが
白桃桃という人はOfficeTANAKAみたいに
ExcelVBAの世界ではそこそこ有名な人なんでしょうか?
215 :
デフォルトの名無しさん:2012/12/19(水) 17:18:31.52
キチガイで有名ではあるがそれだけだ
216 :
デフォルトの名無しさん:2012/12/19(水) 17:22:53.02
Imageオブジェクトを指定するとして、
オブジェクト名以外に、一つ目のImage、二つ目のImageというような
数値で指定する方法って無いんでしょうか
シートやセル範囲だと、sheets(2)とかcells(1,2)というふうに数値で指定できますよね。
しょうもない質問でしょうがどなたかお願いします
218 :
デフォルトの名無しさん:2012/12/19(水) 17:48:35.50
219 :
デフォルトの名無しさん:2012/12/19(水) 17:53:50.09
>>217-218 レスありがとうございます
まだ、そのワードで調べてる途中で理解できていませんが
時間かかりそうなので、ひとまずお礼だけ言っておきます。
OS:winXPSP3、 Ver:Excel2003
マクロ実行時以外ではマクロ関数が算出しないようにする方法があれば教えてください。
ワークシート関数に無い機能が欲しくて、マクロ関数を作ってあります。
マクロ修正のためVisualBasicEditorを開いたままの状態でシートのセル値を変更します。
すると、マクロ関数が機能し延々と算出し始めます。
マクロ修正中はマクロ関数が機能しなくてもいいので、止められるなら止めておきたいです。
>>220 マクロが動く条件何にしてるの?
特定のセルに入力したら、とかアクティブセルを変えたら、とか
発動条件自分で書いてるはずだけど、
それをボタンを押したら、とかに変えればいいじゃん。
あるいは手間を惜しまないなら、発動する部分を毎回コメントアウトする。
222 :
デフォルトの名無しさん:2012/12/19(水) 21:55:11.37
>>220 例えばDebugとかCodingとかの名前でパブリックでスタティックな変数を用意して
対象のマクロ関数でGet、別途Setプロシージャを用意するとか
手動計算は?
普通のおっさんでもパンダのパンパンくらいだと思うぞ
北京五輪だったか
226 :
デフォルトの名無しさん:2012/12/20(木) 10:29:53.28
並び替え(sort)で、ユーザ定義のものみたいなのを使いたいんですが
その文字列の順序を変数から指定するにはどうしたらいいですか?
(この質問は中級者以上じゃないと言ってる意味がわからないかもしれませんが)
エスパー中級が必要か……
228 :
デフォルトの名無しさん:2012/12/20(木) 12:21:56.95
>>227 あれはもう何年も前、いいえ2日前のことです。桃白白はぐりとぐらが作った特大の
カステラが食べたいと思いながら眠りにつきました。夜中にふと目が覚めました。
あたりが昼間のように明るいのです。体があたたかくてやわらかい黄色い光りに
つつまれていました。そうカステラと一体化したのです。それいらい桃白白は
エスパー能力を身につけました。
ユーザー定義といったらType。
>>226は一字一句間違いなくこう書いている。
Type Castella
Guri As String
Gura As String
End Type
シートの並べ替えってオプション指定する、優先文字列の列挙だよな
Type で定義してんのかあれ
参考にさせてもらおう
シートソートなら
カスタムリストのidゲットして、add customlist=arr(文字列)
並べ替えのときにordercustom:=カスタムリストのid
でいいんじゃないか
構造体とか使うのか
おいおい、わざわざ中級とか言ってるんだから超上級、ウィザード級VBA使い手に決まってる
TYPE とかソートなんて初心者みたいな質問するわけないだろ
調べれば出てくるような、そんなレベルの低い答えばわけないだろ
あっ
233 :
デフォルトの名無しさん:2012/12/22(土) 22:09:18.76
そんなに複雑なプログラムじゃないのに30分以上かかってるんだがありえるのか?
どっかで循環してんのか?
確かにデータは5万近くあるが
再計算と画面の書き換え止めろ
5万程度で30分とかどんな処理してるんだ
五年前のXPノートでも3秒かそこらだろう
どんなコード?
改行が入ってるセルが数万行あるようなExcelファイルの場合は数セル操作するのに1分とかよくある
だから画面の書き換え止めろって
238 :
デフォルトの名無しさん:2012/12/23(日) 01:30:04.90
今回の件とは関係ないと思うけど、100,200程度のレコードを追加していく処理で、
レコードの追加に合わせて印刷範囲を随時拡げていくという処理を入れたらふじこふじこ
レコードの追加の完了後に印刷範囲を拡げるという処理にしたらシャキィーン!だった。
つまり何が言いたいかって言うとさ、印刷範囲を随時拡げていくという処理は重いって事だよ。
>>238 なんのために随時広げる必要があったんだ?
よくあることだよ
最初のうちは複数回呼ばれることを想定してなかったからメソッドを分けてなかった
241 :
デフォルトの名無しさん:2012/12/23(日) 02:08:05.78
242 :
デフォルトの名無しさん:2012/12/23(日) 02:08:56.91
人間がせいぜい待てる時間は3秒から5秒くらいだろ?
Unionとか使うと平気で3時間とかはかかるけど
VBAを使って、yahooファイナンスから4000行10列くらいの株価データを
エクセルシートにダウンロードしてるんだけど、全て終わるまでに30分くらいかかる。
どうにかして速くする方法ない?
データを配列に入れて、rangeオブジェクトに張るの試したけどあんま変わらなかった。
>>244 おれも似たようなことやってるけど、
約1000銘柄200日分で20万行の処理に
20分くらいしかかかってないぞ。
どういうコードを書いていて、どの部分にどのくらい時間が掛かってるのかも示さずでは
速くする方法どころか、速くできるか否かすら解んねーよw
まあそんなことにも気付かず不適切な質問しちゃうくらい頭の弱い子なわけだから
改善の余地がありまくりなのは間違いないだろうがな
因みに、ダウンロードに時間が掛かってるなら、むしろそれは改善可能でも改善すべきじゃない
広告を見てくれることを前提に無料で提供してくれているデータを、広告も見ずにぶっこ抜きしてる時点で
「大変申し訳ない」「時間が掛かろうと無料で得られるだけで非常にありがたい」という態度で居るべきなのに
それを相手先の鯖負荷も考えずに、身勝手な自己都合だけで高速化(=鯖の高負荷化)するなんてのは
技術的に可能でも、人としてやるべきではないからね
>>244 とりあえずコード晒せ
回線や鯖の問題でなければいくらでも高速化できる
その結果アク禁や有料化されても俺は知らんけどな
248 :
デフォルトの名無しさん:2012/12/23(日) 14:46:21.97
Variant型変数を配列で使う場合の
使い方や注意点をすべて教えていただけませんか?
ちなみにまだ使ったことのない初心者ですのでそこを考慮願います。
>>248 別にないよ
Variant型以外の配列と同様に扱えばよし
250 :
248:2012/12/23(日) 15:52:46.50
いや例えば配列のくせに( )を使わないときもあるだろ
どういうとき( )を書かなくていいとか書くべきとか
いろいろ注意点はあるはずだ。
は?
252 :
桃白白:2012/12/23(日) 16:26:56.43
>>250 ないよ。いつからあるって錯覚してた?ないよ。そんなの。
徳川の埋蔵金みたいなもんだろ。あると夢を見続ける人は
絶えない。そう思わせることに価値があるのかもしれないな。
桃白白はしんみりとそう思う。
ももしろしろは黙ってろよ
Variant変数を()付きで宣言した場合は、配列のみが代入できる。
更に上限・下限を指定した場合、それに一致する配列のみが代入できる。
代入できるものに制限を付けるかどうかだけの違いで、使う分には全く変わらない。
とりあえずしゃぶれや。
256 :
248:2012/12/23(日) 19:01:30.70
>>254 ありがちょう。
こういうレスがほしかったです。
すこし賢くなりました。
しかし悲しいかな「知れば知るほど、分からないことが増える」というニュースの池上の名言のように
()のみは1次元となるのか
( , )とコンマだけ入れると上限下限の2次元となり、ほんとうに例えば test(500,1000)みたいな大きな数も自由に代入できるのか
VBAでフィルターかけるときのCriteriaでこのVariant変数が使えるのは1次元のときのみなのか
その他いろいろ
さらに不明点が倍増しました。
>>248 >Variant型変数を配列で使う場合
じゃなくて
Variant型変数で配列を使う場合
というべきじゃね?
Variant型変数にrangeを代入すると
変数の中身は配列になるけど()は付けないよね。
んで、配列の中の要素をいじるときには()使うけど、
そういう話かな?
258 :
桃白白:2012/12/23(日) 19:10:04.01
埋蔵金の話だろ。
259 :
248:2012/12/23(日) 19:10:30.20
>>257 はい、そういう話です。
Variantという自由なものをつくったばっかりに
いろんな場合が想定できるので逆にコード書く人にとっては把握事項が増えて実に使いにくいものとなった例だと思うんです。
VBAの基礎のオートメーション自体が、
型が曖昧でも適当に動くようにする方針で設計されていたからなあ。
ある程度型宣言が可能なVBAで違和感を覚えるのは、しようがないところか。
JavaScript位吹っ切れていれば全く気にならなくなるのだけどw
>>257 >Variant型変数にrangeを代入すると
>変数の中身は配列になるけど()は付けないよね。
それもちょっと違う
Variant以外でも配列全体に代入するときは括弧は付けないから、
それはVariant型で配列を使うときの注意点じゃない
Dim b() As String
b = Split("a,b,c", ",")
MsgBox b(0)
内部がvariant型じゃなくなる、配列以外で使えなくなるとかそんなかんじ
263 :
デフォルトの名無しさん:2012/12/24(月) 02:14:06.96
他の言語もやっておいたほうがいい
Excelに関係ないからVBAなんでものスレに移動してくれ
>>261 宣言で括弧つけてる(=動的配列変数として宣言してる)じゃん
Variant型だとそんなのお構いなし
一人で行ってろタコ
クラス モジュールで実装したクラスを、クラス名から動的にインスタンス化する方法ってないだろうか。
VBAProject
- 標準モジュール
+ FilesCommon
- クラスモジュール
+ Files
+ TreeFiles
+ ListFiles
みたいになってるときに、
[TreeFiles]
Implements Files
' 〜
[ListFiles]
Implements Files
' 〜
[FilesCommon]
Sub ShowList(ListType As String)
Dim Files As Files
Set Files = CreateObject(ListType)
' Filesを使ったリスト化処理
End sub
てな感じにして、クラスモジュールの追加と呼び出し文字列(ListType)の変更だけで
挙動を変えたい(ListType の Select Case を作ってそこもメンテさせるってのはちと不味い)のだが、良い方法ないもんかな
269 :
268:2012/12/24(月) 14:31:35.93
CreateObjectは当然COMでもなんでもないクラスモジュールを扱えないし、
Appication.EvaluateやCallByNameはNewできないし、
Vbs.Evalじゃプロジェクト内部のクラスモジュールまではあずかり知りません、だし、
うまく解決するすべがないものかと・・・。
271 :
268:2012/12/24(月) 14:47:33.53
>>270 失敬。間違えた。誘導先で聞くわ。サンクス
>>266 人が少ないスレに行く意味がわからん。
自分で建てたけど使われないからってみっともなw
?
>>244 Application.screenUpdatingだっけ?入れてる?
>>274 入れてました。若干速くなる気もするけど、せいぜい2分位です。
その間、セルに貼り付けてる過程が見れないので、2分短縮するくらいなら外した方がいいと思って
今は外してます。
ソースは本当にシンプルなので、問題があるとすればサイトへのアクセスの仕方かなぁ・・・
>>275 他の人も言ってるけどソース見せてくれないの?
ソース見ないことには判断出来ないっすよ
>>268 それ、普通は
sub ShowList(byref obj as Files)
'objを使ったリスト化処理
end sub
sub foo()
showlist new TreeFiles
showlist new ListFiles
end sub
みたいにやるんだけど、なんでそうしないの?
>>275 おい!ソース見せろや!おい!
指摘できんやろが!
>>276 kwsk
>>277,279
Set oHttp = CreateObject("MSXML2.XMLHTTP")
For r = 2 To Range("A" & Rows.Count).End(xlUp).Row 'A列にある4桁の銘柄コードの総数取得
' If (Cells(r, 1) >= 1000 And Cells(r, 1) <= 9999) Then 'A列に4桁の銘柄コードがあったら処理開始
With oHttp
strURL = "
http://stocks.finance.yahoo.co.jp/stocks/detail/?code=" & Cells(r, 1)
.Open "GET", strURL, False
.setRequestHeader "If-Modified-Since", "Thu, 01 Jun 1970 00:00:00 GMT"
.Send
(以降、HPから引っ張ってきたテキストを元に、銘柄名や市場名をセルに書き込み)
End With
End If
Next
こんな感じでほんとにふつーのやり方です。
If文内の、セルに書き込む処理や、HPからデータ持ってくる部分を
全部コメントアウトしても20分位かかるんで、If文の中の処理が問題という訳ではないです。
何が悪いんだ・・・
そういや昔図書館のサイトにクローラでアクセスして逮捕された人がいたっけ
282 :
デフォルトの名無しさん:2012/12/26(水) 00:03:28.66
うっすらと記憶になるな。
図書館を対象にした処理ではなく、別の目的のテストとして図書館を対象に処理してたんだっけ。
公共なのに糞サバなのが悪いだろアフォかとかいう意見もあったっけ。
Yahooなら個人が何をしても問題になんてならないと思うけど。
>>280 IF文内の以下略じゃなくて単にFor文の問題って言いたい。でいいのかな。
oHTTPも全然関係ないと。
あれは警察も管理者もみんなネットやコンピューターの知識が皆無だった
裁判でちゃんと無罪になってる
最近のなりすまし誤認逮捕以上に恥ずかしい事件だったんで、結末もひっそりとしか報道されなかった
おかげで、いまだに連続アクセスすると逮捕されるとか寝言を言うバカ
>>281がいる
クローラーを作ってる側に知識や常識がないとかなりキツいけどね
286 :
桃白白:2012/12/26(水) 02:03:06.78
調べてみた
YAHOOの鯖が遅いだけだね
平均すると1ページあたり0.3秒ぐらいかかってる
公開されてるのは3439銘柄だから、単純計算で15分以上かかることになる
試しに非同期でやってみたら2分で終わったけど、やるなら自己責任でね
それよりも、株価を公開してるサイトはたくさんあるから、もっと軽いサイトを探した方がいいかも
あと、何度か走らせたらガベージコレクションが始まってプチフリしたんで、
オブジェクトは1回ずつ解放した方がいい
Set…Nothingをループの中に入れてもスピードはほとんど変わらんかった
>>286-287 ありがとう!やっぱこんなもんなのか速度的には。
非同期ってのを頑張ってやってみようか・・・
プチフリは自分もたまにある。これが頻発すると下手すると40分してたんだよ(´Д`)ハァ…
オブジェクトの開放の仕方変えてみまつ。
> HPからデータ持ってくる部分を
> 全部コメントアウトしても20分位かかるんで
なんでこんな嘘をつく必要があったんだ・・・
例えば1日毎にA1からA15まで
16日目以降はB1からB15までといったように空欄に記入していたとします
このとき最後に記入した値を拾いたいのですがどのように書けばよいのでしょうか?
最後に入力したセル情報ってどっかに保存されてたはず
だけど適当でいいなら、ワークシートチェンジだかなんだかでセルアドレス、内容をどっかに保存
それを読み出すのが楽
>>290 For c = 1 To 2
For r = 1 To 15
If Cells(r, c) <> "" Then n = Cells(r, c)
Next
Next
Debug.Print n
一番右の一番下でいいんじゃね
end2回
VBA使いにはそんなマクロの記録みたいな不確定なコード組むやつがいるのな
欄外に注意書きとかあったらそっち拾ってくる可能性があるだろ
ほんと粗悪品だなお前
そもそも一番下なのかどうかも不明だし
最近、[
>>294]とまったく同じことを言いたくなるようなコードを保守させられてる。
ユーザが1セル書き漏らしたり、隣にメモ書きしたりしただけで
正常に動作しなくなるツール群を修正中。
>>296 基本的にダメ社員は保守作業をさせられるもんだよ
我慢して働いてればその内いいこともあるさ
頑張れ!
なぜ296の文章のそこだけに噛み付いたか興味深い
299 :
桃白白:2012/12/29(土) 13:40:27.55
桃白白にも仕事くれ
300 :
デフォルトの名無しさん:2012/12/29(土) 22:07:37.84
性格に難のある方にはちょっと…
301 :
デフォルトの名無しさん:2013/01/01(火) 11:34:22.80
セルを正方形にして
簡単なゲームを作りたいんだが
「キー入力」はどうコードで実現させますか?
302 :
MADOKA MAGICA:2013/01/01(火) 12:27:58.91
MADOKA MAGICA
>>301 リアルタイムキー入力のことなら
VBA自体にはその機能がない。
Windowsの機能を呼び出して使うことになるので
ここから先はスレ違いとなる。
「VBA キー入力」あたりのキーワードでググってみれ。
単純な表なのだから、せめてxlsx形式で公開すべきだよなあ。
xls形式っていうだけで身構えてしまう。
WINXP、Excel2007です。
ワークシート関数のCOUNTIFで配列を調べる事は出来ますか?
Dim c As Variant
c = Range("A1:C10000")
cnt = WorksheetFunction.CountIf(Range(c(1, 1), c(3, 1000)), "1")
これはエラーになります。
>>306 COUNTIFの引数はRange型っぽいからできないけど、何がしたいんだ?
エスパーしてみると
Dim c As Range
Set c = Range("A1:C10000")
cnt = WorksheetFunction.CountIf(c, "1")
こういうことか?
>>306 COUNTIF(範囲,検索条件)
だから、引数1個多いんでないの
CountIf(Range(略), "1")
だから引数は多くないだろ
ただ、なにがしたいかわからん
とりあえず変数cを使わずに直接CountIfの中で
やりたい事記述したら?
それでエラーがでない且つ出力結果が望む形になるようになれば
変数に置き換えてもうまくいくはずだが
311 :
306:2013/01/01(火) 21:24:09.89
大きなシートを調べたら、すごく時間がかかったので配列に入れました。
Setを付けたらエラー無く数えられました。
ただある範囲を調べたいので
cnt = WorksheetFunction.CountIf(Range(c(1, 1), c(3, 1000)), "1")
とかすると、エラーは出ないけど少なすぎる数字になります。
1は何千もあるはずなのに3とかになります。
範囲の指定のしかたがおかしいですか。
>>310 cは変数ていうか配列の名前のつもりなんです。
>>311 列と行の指定が変だから、皆突っ込んでいるのだと思うよ。
Range("A1:C10000") は3列10000行の範囲だけど、
その後の Range(c(1, 1), c(3, 1000)) は1000列3行の範囲になっている。
A1:C1000は
↓↓↓ x1000
Cells(1,1):Cells(3,1000)は
→
→
→
x1000
こうだな
>>313 え、そうなんですか
自分では1行1列目から3行1000列目のつもりでした。
316 :
306:2013/01/01(火) 21:43:54.26
なんか全然間違ってたのかも
今まで作ったの全部見直さなきゃなんない。
317 :
306:2013/01/01(火) 21:47:15.72
>>313 それで1が3個だった理由が分かりました
1行に1個あるから
>>313 >Range(c(1, 1), c(3, 1000)) は1000列3行の範囲になっている
なってないぞ
c(1,1)の値(=A1セルの値)の行数とc(3,1000)の値(=どっかのセルの値)の列数だ
Range(Cells(1, 1), Cells(3, 1000))と勘違いしてないか?
319 :
306:2013/01/01(火) 23:25:07.99
お詫び
自分勘違いしてました。ちゃんと動いてました。
>>307さんの通りSet付けたらもう完成でした。
Dim c As Range
Set c = Range("A1:C10000")
cnt = WorksheetFunction.CountIf(Range(c(1, 1), c(3, 1000)), "1")
これで配列の1行1列目から3行1000列目がちゃんと数えられてました
1が3個しか無いのを少ないと思ったけど1行に1個なので3個でよかったんです。
なんかすみませんでした。
何はともあれ乙
なぜ配列が a ではなく c なのか詳しく
aを使ったら勝手にAに変換されたんでエクセルが使う文字だと思ったんです。
配列って言ってもセル配列だからな
CellRange、CellArray、つまりcでも別におかしくはない
つーか配列はaって方が違和感あるな
プレフィックスとしてaを付加するってなら解らなくもないが
1文字で表現するなら「配列であること」より「何の」配列かの方が重要な要素なんだから
配列だからaってのは浅慮に過ぎる
大文字になるのか。なんだろね。
確かにセルならcか。rangeだからrでもいいか。
どうでもいいけど一言余分な人ってリアルでも一言余分なのかな。詳しく。
>>323 それ言うんならcじゃなくてcrかcaでしょ?
cだけじゃaより意味通んない。
>>324 > どうでもいいけど一言余分な人ってリアルでも一言余分なのかな。詳しく。
リアルでもそうだよ。
人はなかなか変われないからね。
327 :
リリン:2013/01/02(水) 06:42:12.25 BE:418982786-PLT(45072)
なぜハンガリアン記法なのか詳しく
ちょっとはググれ無能
CollectionにRangeオブジェクトを詰めるとVariant()になってしまうんですが仕様でしょうか?
Rangeのまま処理したいのですがどうすればいいですか?
Sub Test()
Dim rng As Range
Dim list As New Collection
Set rng = Range("A1:B2")
list.Add (rng)
Debug.Print (TypeName(rng))
Debug.Print (TypeName(list(1)))
End Sub
-- 結果 --
Range
Variant()
330 :
リリン:2013/01/02(水) 08:47:51.93 BE:488813478-PLT(45072)
構造体じゃだめなの?
仕様
Collectionは何でも突っ込めるようにするため型をVariantにして抽象化している
>>331 Variant型ならキャストしてRangeとして扱えそうなんですが
ご丁寧にセルごとのValueが入ったVariant配列に分割されてしまってるみたいです
いろいろこねくり回したんですがRangeとして取り出せませんでした
>>330 構造体はちょっと大げさなので今回は動的配列にしようと思います
お手数おかけしました
>>332 >ご丁寧にセルごとのValueが入ったVariant配列に分割されてしまってるみたいです
なにをしたいのか知らないが list.Add (rng) ならRange処理結果だから当然だろ
RangeのままCollectionに放り込みたいのなら list.Add rng
>>331 違う
>>329,332
list.Add (rng) はlist.Add (rng.Value)として解釈されてる
コレクションに追加するなら
list.Add (rng.Cells)
取り出すときは
Set rng2 = list(1)
Range型は特殊な動きするから直接取り扱わん方がいいかもね
335 :
334:2013/01/02(水) 16:02:01.44
ああ、追加は
>>333で良いのか
つまり
Call list.Add(rng)
Call list.Add((rng))
との違いで下は(rng)が評価されてValueがセットされてる
(ホントはValueじゃなくてデフォルトプロパティだけど)
VB.NETでデフォルトプロパティが非推奨とされた理由が良く解るな。
引数有りならともかく、無しの時の挙動がかなりキモい。
337 :
デフォルトの名無しさん:2013/01/02(水) 23:05:10.68
デフォルトプロパティ頼みで記述を省略するコードはウゼエって思ってたんだよ
省略して当たり前の物まで何もかも全部書いてあるのもウザいけどな
339 :
桃白白:2013/01/03(木) 00:14:28.78
桃白白の意見も聞いちゃう? 桃白白はねWithブロックがウゼエって思う。
コピペしちゃったらいいじゃんって思う。インデント節約できるしコピっちゃいなよって思う。
340 :
デフォルトの名無しさん:2013/01/03(木) 03:27:15.12
Withは使いどころによりけりでしょ
ひとつのオブジェクトに対して
複数のプロパティを操作するときには便利だと思うけど。
>>339 Withは一階層インデントが深くなるデメリットと
可読性のメリットの天秤をかけて使用するものかと。
そもそもコピペで済まそうなんていうのは、コードとして良くないと思う。
コピペ自体間違っていることもあるわけで。
それとコピペ推奨なんてことになると、似たような関数作りまくりなんていう輩も出てくる。
こうなるとメンテナンスが大変面倒になる。
コードなんて書けば書くほどバグが出るものなんだから
コピーも含めて、できるだけ書かないようにするのがセオリー。
342 :
桃白白:2013/01/03(木) 13:05:34.72
ちゃんとコーディングすれば可読性はあがる
VSだとIDEがしっかりしてるけど(しすぎて使いづらいのもあるが)VBAだと平打ちが面倒だったりする
>>342 すぐ納得できることならはじめから調べてWithダメとか言わないように
345 :
桃白白:2013/01/03(木) 22:36:03.73
346 :
デフォルトの名無しさん:2013/01/04(金) 00:31:51.86
たおぱいの駄文結構好きだな
なにもデータが入っていないのに無駄にスクロールバーが長いシートを綺麗にしたく、
Cells.SpecialCells(xlLastCell)
で有効な最終セルを取得して、1セルずつ
Cell.Borders(xlEdgeTop).LineStyle
Cell.Borders(xlEdgeBottom).LineStyle
Cell.Borders(xlEdgeLeft).LineStyle
Cell.Borders(xlEdgeRight).LineStyle
Cell.Borders(xlDiagonalDown).LineStyle
Cell.Borders(xlDiagonalUp).LineStyle
VarType(Cell)
で検査して、1行全て線無しだったら行削除。
というのをやってますがものすごく処理が遅いです。
なにか良い方法ないでしょうか?
データが入っていない = Valueが空 And 罫線なし
入力に伴う処理みたいに、作業中に行われる処理は遅くちゃこまるが
>>347みたいな処理は、他の作業の合間にバックグラウンドで実行させとくか
飯食ってる間や、会社なら会議中、自宅なら寝てる間とかに実行させとけばいいだけの話じゃん
むしろそれの処理を速くしようと試行錯誤する時間の方が無駄だと思うよ
セーブして開き直したら短くなってると思うが
>>347 遅いのは判定?削除?
削除は何度もやるんじゃなくて、削除すべき行を全部選択して一気にDeleteしてる?
>>347 範囲でBordersを取得した場合に罫線の有無が混じっていると、
BorderオブジェクトのLineStyleがNullになるっぽいから、
それを利用して一行単位で判定すれば良いんじゃないか?
その時はIsNullで判定するように注意な。
>>347 新規シートに有効なセルをコピペするんじゃダメなの?
その「有効なセル」の判定に困ってるんだろ。
356 :
355:2013/01/06(日) 07:52:32.78
追加。
検査開始行が分かっていれば、値が入っている有効セルの行さえわかれば
一気に削除という方法もあるかも。
>>355 >値が入っている有効セルの判定なんてググればすぐ分かる。
元のレス (
>>347) をちゃんと読めば、「有効な最終セルを取得」は
既にやってることぐらいわかるでしょ。
Excel の「有効セル」と
>>347 が言う「データが入っているセル」が
異なることぐらい理解しようよ。
358 :
347:2013/01/06(日) 08:47:28.23
レスありがとうございます。
>>348 量が多いので隙間の時間では終わらないんです。
>>350 色は無視してOKです。
>>351 判定が遅いです。
削除は一行づつやっているので改善してみます。
359 :
347:2013/01/06(日) 08:51:21.28
>>352 これは知りませんでした。
試してみます。
>>355 UsedRangeというものがありましたか。
UsedRangeとSpecialCells(xlLastCell)の間を削除対象とすれば良さそうですね。
UsedRangeがどういう判定するのか確認してみます。
>>347 「ワークシートの最終行、最終列を取得する」でググってコード書いてみたけど
これじゃだめかな?(動作確認してないですw)
'Excelが認識している最後尾
maxExcelRow = Selection.SpecialCells(xlCellTypeLastCell).Row
'ユーザが認識している最後尾
maxUserRow = ActiveSheet.UsedRange.Find("*", , xlFormulas, , xlByRows, xlPrevious).Row
'認識の差分を削除
.Range(maxUserRow + 1 & ":" & maxExcelRow).Delete
まあ一行づつ削除してたら重くなるわな
有効な最終セルを取得して、消したい行ってのはその最終行より上なのか下なのか
みんなの話は下って前提だけど、それなら何も考えずに全部消せばいいだけだろ
上なら画面表示とか再計算とか止めればかなり速度改善するぞ。すでにやってるかもしれんが
まあその場合は空行判定を簡素化して速度稼ぐぐらいか
> それなら何も考えずに全部消せばいいだけだろ
単純に最終行までDeleteしただけだとスクロールバーは短くならなかった気がする
Excel2010で確認してみたけど、
いちいち行削除とかしなくても、Ctrl+Sで上書き保存した瞬間にスクロールバーのスライダーの長さは元に戻ったぞ
再現の手順
(1) Excel起動
(2) A1にデータを入れ、名前を付けて保存
(3) A1000に飛んでデータを入力、Ctrl+S
(4) A1000を選択してDeleteキーを押してデータ消去
(5) A1に飛んでからCtrl+S → その瞬間にスライダーが長くなる
エクセルの有効セルを書き換えちゃえばいいんだけども
>>364 下側を削除するって前提だと
色は無視とか言ってるから、エクセル上で最終だと判断されるセルと
自分で設定したい最終行が違うんじゃね
セーブしろってのは
>>349で出てるし
>>366 そもそも
>>347 に「データが入っていない = Valueが空 And 罫線なし」って
書いてあるんだから、Excel の最終セルの判断と違うのは自明だと思うが…
複数行(行全体)を選択しているかどうかって、どうやって判別すればいいのかな?
ただし行はどこでも良い(連続した行を選択するが、連続しているかどうかはチェック不要)
例えば
4〜7行をまとめて選択している場合→複数行選択なのでOK
C4〜E7のセルを選択している場合→NG
C4だけ選択している場合→NG
C列を選択している場合→NG
>>368 必ず連続してるんなら
Selection.Rows.Count >1
Selection.Columns.Count = Columns.Count
で判定できる
逆に、連続してないと判定が面倒になる
>>369 おお、素晴らしい!
即レス有り難うございます
For k = 1 To 5
i_" & k & "= x
こんな感じで変数の中に変数を使いたいのですがエラーになります
変数の中に変数は使えないのでしょうか?
それとも書き方が間違っているだけでしょうか?
>>371 変数の中に変数なんて使えない。
どういうことをやろうとしてるのかな?
373 :
デフォルトの名無しさん:2013/01/07(月) 19:54:32.13
>i_" & k & "= x
>i_" & k & "= x
>i_" & k & "= x
>i_" & k & "= x
>i_" & k & "= x
クソにも限度ってもんがあるだろ
>>371 変数名に変数は使えない
配列を使いなさい
i_1=x
i_2=x
i_3=x
i_4=x
i_5=x
ってしたいのか・・・
素直に配列使えw
配列ですか・・・
難しそうですけど頑張って調べてみます
377 :
デフォルトの名無しさん:2013/01/07(月) 20:35:55.75
Evaluate、Eval でやれば
Evalの中で代入ってできたっけ
そもそもVBAにEvalはないぞ
Application.EvaluateとかはVBAに対しては効かんのじゃないかな
配列使うべし
糞コードにも程があるw
変数に変数って使えなかったっけ
モジュールに変数は使えるんだがなあ
382 :
桃白白:2013/01/09(水) 05:48:56.45
>>381 無理。完全に無理。シンボルとリテラルは違うものなんです。
>>381 モジュールに変数って
>>375のように
モジュール名_1
モジュール名_2
モジュール名_3
モジュール名_4
とかやってるの?
モジュールっていうか……オブジェクトかな
右クリックメニューで呼び出すコード名を、変数つかって簡略化したり部品化したり
>>381 つ 連想配列
どんなことがやりたいかは大体想像が付く
俺もVBA始めたばかりのころに、それと同じ事が出来ないものかと
悩んで調べて試行錯誤したから
でも連想配列使ったらあっさり解決した
オススメは組み込みのCollectionではなくScripting.Dictionary
Dictionary最高。
こればっか使ってる。
387 :
デフォルトの名無しさん:2013/01/10(木) 00:36:14.11
>>386 Dictionaryとは一言で言うとなんですかな?
辞書
質問です。
ユーザーフォームのテキストボックスに書き込んだ内容を
別のシートに書き込むというものを作っています。
12個のシートがあり、その中の1つに書き込みたいんですけど
テキストボックスに入力すると、12個すべてのシートに描かれてしまいます。
12個の中から1つを判別するにはどうすればいいでしょうか?
activesheetを用いてできますか?
WorkSheets(シート名)
シート名は定数なりで定義しておく
ユーザーによるシート追加や名称変更があるんなら設定シートでも作ってそこにシート名を書くようにする
どなたか助けてください!
作りたいのは特定範囲に数値が入力されたら、その数値を比較して
小さい場合にメッセージを出す
A1からA10に5以下の数値が入力されたら小さいってメッセージを
A11からA15は10以下で
B1からB15は3以下の数値で同じように小さいってメッセージをvbaで作りたいです
いろいろあってvbaで作りたいです
入力規則だったかなんかのエラーメッセージではなくvbaで作りたいです
どなたよろしくお願いします
イベント
入力が完了したときのイベント
セルの値が変更された時のイベント
397 :
392:2013/01/11(金) 10:45:33.01
>>396 and ALL
どなたか助けてください!
作りたいのは特定範囲に数値が入力されたら、その数値を比較して
小さい場合にメッセージを出す
A1からA10に5以下の数値が入力されたら小さいってメッセージを
A11からA15は10以下で
B1からB15は3以下の数値で同じように小さいってメッセージをvbaで作りたいです
いろいろあってvbaで作りたいです
入力規則だったかなんかのエラーメッセージではなくvbaで作りたいです
どなたよろしくお願いします
宿題丸投げスレって無くなったの?
>>397 おそらく躓くのは入力(変更)されたセルが
特定の単一セルではなく、一定の範囲内にあるかどうかを判定する部分だろうが
「セルの値が5以下だったらメッセージを出す」程度は自分で書けるだろ?
そういうところを少しでも書いて来て努力と真剣さの色見えるなら、レベルが低くても協力してやる気になるが
自分では何もせずに丸投げして、運良く答えてくれる人が居たら
「2chのバカ共も偶には役に立つなw
下手に出たフリして質問したらアッサリ釣られて無償労働(回答)してくれたよw」
と嘲笑うつもりなら、協力するつもりは一切無い。
以上。
400 :
392:2013/01/11(金) 11:35:15.03
392には勿体無い説教
これ
>>400はさすがに392を貶める為の、他人のなりすまし煽りだろ
本人だとしたら、この悔し紛れの負け犬遠吠え後釣り宣言は恥ずかしすぎるw
しょーがねーな
行はrowな
列はcolumn
cellsのrowとcolumnが一定範囲にあればいいんだから・・・
後はわかるな?
RowとColumnではなくIn.....いやなんでもない
405 :
デフォルトの名無しさん:2013/01/11(金) 19:40:51.02
あるフォルダにあるエクセルファイルを全部開いて
それぞれを配列のWorkbookオブジェクト変数にして
いろいろしたいんですが
どうすればいいですか?
とくに配列の( )の中の数字をいくつ数があるかわからないからどう宣言するかとか。
動的に配列数を決めるにはRedim使え
1個ずつ増やしてRedimするコード書くと遅くなるって文句つける人がでるから注意な
>>406 VBAには残念ながら連想配列はないんだ
まあ普通はScripting.Dictionaryを使うんだが、あくまでこれは外部機能
あとコレクション使う方法もあるけど、これもイマイチ
言語って基本的に外部機能使ってなんぼなんだが
まだそれを理解するレベルに達してないのか?
まあVBはもちろん、VBAは更に組み込みの機能が多すぎだからな
初心者かつVBAしか使えない奴は、内部機能だけで事足りちゃうのかもね
>>411 > 言語って基本的に外部機能使ってなんぼなんだが
初耳だな。
基本なんて言葉を迂闊に使うと恥をかくぞ?
お前の中だけの基本は基本とは言わないからな。
釣られちゃだめだ釣られちゃだめだ釣られちゃだめだ
414 :
桃白白:2013/01/11(金) 20:40:10.95
415 :
405:2013/01/11(金) 20:45:13.48
つべこべいわずに
コードを示してくれないか?
それすらできないと
みんな初心者と変わらないぞ
標準のライブラリを外部って言っちゃう脳
417 :
桃白白:2013/01/11(金) 20:49:54.74
>>415 桃白白は信心深そうに思われてるかもしれないけれどもじつは無心論者なんだよね。
イエスが神の子だと信じてもいないし、輪廻転生もないと思ってる。前世が見える
といっちゃうやつは完全に頭がいっちゃってると思う。みんな人生の初心者だってこと。
>>415 みんな初心者だよ。
熟練者は2ちゃんなんてやっている暇はない。
>>414 ありがとうございます。
そういうやり方があったんですね。
実際は指定範囲が可変になっていて
ChangeイベントでIntersect&ifだと、行を新たに追加した際に
型が違いますと出てしまって困ってたんですよ。
420 :
桃白白:2013/01/11(金) 22:49:14.04
>>419 え、なになに、どういうこと?桃白白はそのIntersectのほうに興味があるわ。
replaceって何か参照設定する必要ある?
LeftやRightは使えるんだけど、replaceが動かん。補完もされん。
↓な使い方してます。
buff = replace(stmInPutTextFile.ReadAll, "ab", "zz")
エラー:引数の数が一致しません。または不正なプロパティを指定しています。
Nullなんじゃね
補完とか、何の言語をどんな開発環境で使ってるのか知らんが
stmInPutTextFile.ReadAllやらがどうなってるのかまず調べろや
>>423 口臭そうだから人と会話する時はガムを噛めや
すまん。
VBE使ってちまちま書いてます。
stmInPutTextFileはOpenTextFileで開いたテキストストリームで
テキストファイルの中身は↓こうなってる。
--ここから--
abcdefg
hijklmn
--ここまで--
stmInPutTextFile.ReadAllをmsgboxで確認してみたけど、読めてはいるみたい。
一気にテキストファイルを読みこんで、必要な部分を置換して書き出すっていうのがやりたいんだけど、
いろんなところのサンプルは「Replace」だけで成り立っているのに
あたいのは動かないんだよね…
ReplaceがおかしいならReplaceに絞れよ
InPutTextってなんだよおちょくってんのか
MsgBox Replace( "ShineGomi", "Gomi", "Kasu" )
こういうのを試した結果を示せよアホ
?
教えてもらう分際で申し訳ないんだけどさ、
それができないからここで聞いてるんだけど。
なんでそんなに威圧的になってるかわからない。
結果は一緒だよ
引数の数が一致しません。または不正なプロパティを指定しています。
これだけでなんかわかんのか?
>これだけでなんかわかんのか?
>これだけでなんかわかんのか?
だからまず環境を詳しく書けよ
普通は動くものが動かないんだ。お前の環境がいちばん怪しいんだよ
まんこ
>>424 おまえウンコ臭い
パンツは毎日履き替えろや
それで動かないのは、予約後をどっかでうっかり使ってるとかじゃないか?
そのブックはとりあえず閉じて、新規ブックでReplace関数が動くか試してみろや
buff = replace(stmInPutTextFile.ReadAll, "ab", "zz")
buffが範囲を選択してそうな予感
Replaceって範囲セルを指して置換と単一セルを指して置換じゃ記述変わるぞ?
>>428 ここはお前のサポセンじゃねぇよ
お前こそクレーマー気質だな
お店に行って店員じゃないそこらのお客に質問して返答に怒ってる感じ
436 :
桃白白:2013/01/12(土) 09:13:20.41
はい喧嘩はやめて
喧嘩はやめてぇ〜♪
二人をとめてぇ〜♪
誰の歌だったっけ?キャリーパムパム?
>>434 ちょっと何言ってるかわからんが、
>>426が同じ結果だっていってるんだから
Range.Replaceの話ではないぞ
>>428 Replace選択してShift-F2でオブジェクトブラウザ立ち上げろ
そこに、なんのメンバだと書いてある?
みんな、ヒントありがとう
>>433 ありがとう。別ブックでやったら動いた。
何が原因かわからないんだけど、自分で設定した予約語ってどうやったら確認できるの?
replaceの頭をRで入れてもrに戻されるんだよね。
>>434 Range.とかCell.で試してみたけど一緒な結果だった。
今はテキストファイルの取り扱いでやっててエクセルのシートは使ってない。
>>438 VBA.Strings のメンバー
って書いてある。
ヘルプ出してみたらReplace関数って出た。
>>437 竹内まりやだろ
エクセルファイルは肥大化するから何かあれば新規ブックに引越しする必要があるよ
>>439 予約語云々より一等地の名称は関数名に使うなってことでしょ。
repelaceという名称をつけたいなら何をreplaceする関数なのかという意味を持たせて
replace○○とかにすれば、今回のような予約語を使ってしまったり、
関数名を重複するような問題はぐっと減ると思う。
>>440 プログラム探すのもめんどくさくなってくるしね。
まぁ、肥大化っつっても俺のブックは100k行ってないけど…
>>441 うん。いい勉強になったよ。
名前の付け方には気を付ける。
横着するとよくないな。
VBA で 100K行とか…、スゲーとしか思えない。
いろんな意味で。
>>439 Option Explicitでエラーが出なくなるまで必死に修正しろ
>>443 "100K行" じゃなくて"(ファイルサイズが)100K いってない" でしょ
と、マジレスしてみる
マジで「100k行」しか見てなかった orz
100k 「行ってない」 のな。
まあ、10行でも行ってないと言えば行ってないのは確かだが
VBAのソースだけで100Kあったらそれはそれでスゲーぞ
100KB なら、一行平均 20バイトとして 5,000行だから、
まあスゲーと言うほどでもないかと。
449 :
デフォルトの名無しさん:2013/01/13(日) 15:06:38.60
セルの値が他ファイルにあるか調べるには、どの方法がいい?
もちろんあったらそのファイルから関連データも一緒に取り出す。
(1) Find使う
(2) WorksheetFunction.Vlookup使う
(3) その他 (詳しく)
(1)はよく変な動きをするし
(2)はひっかからないときエラーが出て困る
「など」の不具合がある。
ファイル?
fsoだか使えばいいのでは
>>449 エラーが出て困るんならエラートラップすればいいだけ
Errプロパティで分岐
>>449 不具合あるのは君のコードかと・・・
その不具合のあるコードを晒してみたら誰かが改善してくれるよ
>>449 俺だったらFind使うけど、変な動きってのがどんなのか分からない
もっと詳しく教えて
454 :
449:2013/01/13(日) 18:51:19.07
またまた。
エラーや不具合や変な動きというのは
みんなエスパーしてくれよ。
VBA上級者ならそんなの簡単に推測できるだろ?
教えてとか晒してとか、単にニヤニヤしたいだけだろ?
fsoは調べてみたけど高級そうなのでとりあえず踏み込まないことにした。
やっぱりFindを使うことにしてFindの使用方法を極めたほうがいいのかな?
極めるっていうか、基本的な使い方を覚えればいいんじゃね?
まだそこまで達してないようだから
456 :
449:2013/01/13(日) 19:00:11.21
>>455 Findはかなりクセのあるメソッドなるは知っとるけ?
Ctrl+Fと同じ機能だけど、Ctrl+F押したときのWindowの設定がデフォになることとか。
なにそれこわい
458 :
453:2013/01/13(日) 19:35:22.49
>>456 いや、それは仕様としてちゃんとヘルプにも書いてあるから
「変な動き」でも「不具合」でもないよ
当たり前のことを当たり前にできるまでは時間がかかるもの。頑張って
>>211 亀ですがカラーリングとソート無事できました
本当に助かりました
ありがとうございました
461 :
デフォルトの名無しさん:2013/01/13(日) 23:15:42.41
このスレ言い争いが続いてるから、問題を出しましょう。
一番スッキリと的確に答えられた人を勝者とします。
【問】 あるブックに複数シートがあり、全セルを対象としてセルの値をすべて別ブックの1つのシートの1列目に書き出しなさい。
同一のセルの値がある場合は、当然1つだけを書き出します。
意味がわからなければ「エスパー」してください。
だからfind使えよ
問題ですじゃねえよカス
頭下げて教えを乞えないゴミはしね
>>461 こんな上から目線のレスの問いに答える必要なし、というエスパーの結果となりました。
俺は未来から来たエスパーだがこんなことしてる場合じゃないぞお前ら
>>461 文章問題の設問ってのは実は難しいだぜ
それこそプログラミングと同じ位難しい
意味が分かりやすいのはもちろんのこと、例外が発生しないように
あるいは例外時にどうするかまで事細かに考えなければならない
1つだけは例外への条件を提示しているが全然足らず、それを漏れなく提示できないレベルの頭なら
「質問」はいいが、「出題w」なんて出来るレベルには無いので
余計荒れる原因になる不適切な出題など投下しないで大人しくしてろ
>>461 問題とはぜんぜん関係ないんだけどさ。
問題文は
Aがあり、Bしろ。っていう形じゃん。
「あり」は「ある」の連用形。「しろ」は「する」の命令形。
動詞の連用形があとの動詞の形に順応するとするなら
Aがあれ。Bしろ。ということになっちゃわない?
素直に教えてくださいっていえよ
>>461 こんなカキコしてるから雪降っちまったじゃねぇか!
関東民乙
地方民乙
いいえ、私の住まいはパナマです
南極も雪です
ブックをオープンして、、そこにあるシートを順繰りに見ていく処理考えてんですけど、
For i = 1 To Worksheets.Count
←
Next
矢印の部分で順番にシートをアクティブにするにはどうしたらいいんでしょ?
475 :
474:2013/01/14(月) 21:09:50.85
For i = 1 To Worksheets.Count
Worksheets(i).Activate
MsgBox i & "番目のシート"
Next
End Sub
でしたね^^;
477 :
デフォルトの名無しさん:2013/01/15(火) 02:30:46.70
仕事でチーム内で共有状態でみんなで使ってるExcelファイルがあり
ある条件のセルには色を塗るというルールを決めてみんなで勝手に編集してるのですが
ここで問題。
標準の色の「赤」や「黄」はみんなそこから選ぶから問題はないんだけど
「ピンク」や「水色」はみんな色が微妙に違ってるのを選んでてバラバラ。
これをVBAで統一の「ピンク」や「水色」にしてください。
Sub aaa()
Dim c As Range
For Each c In ActiveSheet.UsedRange
c.Interior.Color = color_fix(c.Interior.Color)
Next
End Sub
Function color_fix(old_color As Long) As Long
Dim r As Long, g As Long, b As Long
r = old_color Mod 256
g = old_color \ 256 Mod 256
b = old_color \ 65536
If r > 230 Then r = 255
If g > 230 Then g = 255
If b > 230 Then b = 255
If r < 25 Then r = 0
If g < 25 Then g = 0
If b < 25 Then b = 0
color_fix = b * 65536 + g * 256 + r
End Function
479 :
桃白白:2013/01/15(火) 07:09:19.46
480 :
hope2013:2013/01/15(火) 09:17:41.89
ExcelのWorkSheet上にボタンを置いて、自分に対するADOをOpenします。
このADOをOpenして閉じるだけで、このBookを閉じても、VBAProjectが残ってしまいます。
何か回避策はありますでしょうか?よろしくお願いします。
vbaのintegerって2byteだったのか
482 :
477:2013/01/15(火) 10:45:39.52
>>478 コードみると動きそうだけど
どのセルの色もさっぱり色は変わりませんわ。
483 :
デフォルトの名無しさん:2013/01/15(火) 10:49:28.17
あるセル範囲を選択してる状態でそのマクロを走らせると
同一の値があるかどうか調べて
(1) もしなければ「問題ないよ」、あれば「値の重複セルがあるよ」とMsgBoxで表示するコードはどうなりますでしょうか?
さらにすすんで
(2) 値の重複セルがあった場合、そのすべてをシンプルに「"ABC"が重複 (アドレスA1, B2, B4)、<改行>"うんこ"が重複(アドレスA5, B1)」
みたいな感じでMsgBoxで表示するコードはどうなりますでしょうか?
(1)を基本に考えてるけど、
(2)がシンプルなコードで書けてしかもバグの全くない完璧な動きをするなら(2)を採用します。
485 :
483:2013/01/15(火) 12:12:39.52
そういうつもりではないのですが…
ちゃんと読めよ
丸投げじゃねえだろ
使えないなら採用しないってんだからもう少しひどいw
そもそも想定してるピンク、水色ってRGBでいうといくつだよ
幅がありすぎてプログラムできんわ
>>487 それは変だわ。
RGBの値を変更するだけでいいように作ればいいだけじゃんw
本筋のコードは関係ないだろ。
Sub aaa()
Set oDic = CreateObject("Scripting.Dictionary")
For Each c In Selection
If oDic.exists(c.Text) Then
oDic.Item(c.Text) = oDic.Item(c.Text) & "," & c.Address
Else
oDic.Add c.Text, c.Address
End If
Next
ks = oDic.Keys
For i = 0 To oDic.Count - 1
k = ks(i)
t = oDic.Item(k)
If InStr(t, ",") > 0 Then
If Len(s) > 0 Then s = s & vbCrLf
s = s & """" & k & """が重複 (アドレス" & Replace(t, "$", "") & ")"
End If
Next
If Len(s) > 0 Then MsgBox (s)
Set oDic = Nothing
End Sub
490 :
477:2013/01/15(火) 14:46:47.81
哲学論hqプログラミングには向いてないですぅ
リスト作って、ピンクとか赤とかのセルを系統振り分ければいいじゃん
コード側で読み出せ
とりあえず近い色かどうか判断する関数を作って、水色とピンクと2回ずつ呼ぶ
これなら想定する色がなんでも対応できる
Function 同じ色(色1, 色2, 誤差) As Boolean
r1 = 色1 Mod 256
r2 = 色2 Mod 256
g1 = 色1 \ 256 Mod 256
g2 = 色2 \ 256 Mod 256
b1 = 色1 \ 65536
b2 = 色2 \ 65536
If Abs(r2 - r1) < 誤差 And Abs(g2 - g1) < 誤差 And Abs(b2 - b1) < 誤差 Then
同じ色 = True
Else
同じ色 = False
End If
End Function
色相の範囲で判断するのが正解だとおもうが
ここまで労力使うんだったら、運用で済ませたほうが楽でしょうに。
495 :
デフォルトの名無しさん:2013/01/16(水) 15:56:32.94
運用とは?
496 :
494:2013/01/16(水) 17:35:06.75
>>495 色付けのルールをチームの中で決めて運用していくのがいいのかなと。
と、思ったけど、
>>477をよく見ると条件付き書式で対応できるんじゃねえの?
と思うようになった。
わざわざVBAで書くほどのことじゃないでしょ。
もっと楽しようぜ。
今後はそれでいいとして
今までに入力したのを何とかしたいって話なんじゃ
>>497 今までに入力したやつは書式のコピーで事足りるんじゃね?
いくら色が混在してるからって
パターン上にあるやつじゃないの?
自作カラーなんてないんじゃね?
>>498 色付きセルがランダムに何千個もあったりしたらと思うとぞっとする
>>499 >>490の画像の中でピンクに見える色はいくつある?
たぶん見る人によってかなりの幅があるぞ
モニターが変わると色の見え方も変わるし、色付きシートの現物を見ないことには
どこまで対応すればいいのか想像も付かん
502 :
498:2013/01/16(水) 22:22:23.02
>>500 そういう考え方もあるけど、グループみんなで扱ってるブックなら
ランダムってことは稀だと思うけど。
>>477を見る限り、ある条件で色を付けてるってことだから、バラバラの色は気にしなくて
ある条件の時のセルの色を決定すればいいと思うけどね。
今後、条件付き書式を使うんであれば、ある条件の時に条件付き書式を設定する
ようにしてあげれば統一が取れると思う。
まんこをいじると気持ちいい
>>501 せいぜい20だろ
そんなのエイヤと条件分岐でいいじゃん
色でなく名前とかIDとかを加えて条件付き書式で
って色の自由選択とかどんな中学生集団だよ
>>505 色固定にしちゃったらさ、別の色にしたい時にまたコード書かなくちゃいけないでしょ。
もっと楽に作ろうと思わないのかな?
条件付き書式程度にとどめておけば、使いたい色に変更できるし、コードを変更する必要がない。
コード書くというのは新たなバグを生む。
最初から、できるだけコードは書かないような作りにしておけば、後が楽になるし、
空いた時間はまた別な新たなことができるだろ。
>>506 ごめん
色でなく名前とかIDとかを加えて条件付き書式で(やれよ。)
って(いうか)色の自由選択とかどんな中学生集団だよ
508 :
デフォルトの名無しさん:2013/01/18(金) 20:09:55.89
「変数の型宣言」(Integer, Long, Doule, Stringみたいなやつ)と
「NumberFormatLocal」("0_ "とか"m/d/yyyy"とか"@"とかね)は
お互いに密接な関係があるの?
こういうのをお手のものに使いこなすために
知っておくべきことをまとめていただけますか?
前半:
関係ないよ
後半:
俺様が勉強しやすいように、資料や情報をおまえらが無償であつめてまとめろ
なんて傲慢な内容を表面だけ丁寧に言っても、誰がその内容に従うかよw
自分から努力することを放棄して、都合の良い資料を出せなんて我が儘言ってないで
まずは自ら努力していろいろ調べて、それでも解らないところがあったら具体的に聞け
以上
510 :
508:2013/01/18(金) 21:26:27.39
俺様が勉強しやすいように、資料や情報をおまえらが無償であつめてまとめろ
まあこの質問はVBAの達人でそれに熟知してないと答えられないだろうから
中途半端に知ってる人が偉そうに答えてほしくはないけどね。
>>508 「こういうの」ってどういう意味?
質問が曖昧すぎて答えられない。
> 知っておくべき
じゃなくて
やってみてどうなるかを覚えるほうが
>>508 知っておくべきこと→Is系のチェック関数としてまとまってるだろ
必要になったらその時点で調べて勉強する
でいい。
受験勉強じゃあるまいに
515 :
デフォルトの名無しさん:2013/01/18(金) 22:40:31.88
Is系のチェック関数とは?
517 :
デフォルトの名無しさん:2013/01/19(土) 06:33:48.88
ちゃんと答えられない人は(→まあこれは大部分の人だうけど)、単に
>>508様の質問のことが頭に整理されてないだけじゃん。
別にそれはそれでぜんぜん恥ずべきことじゃない。
むしろそれを頭に完全に整理できてる人なんて100万人に1人くらいかもしれないし。
だから答えられない人はだまってていただいてぜんぜんOKなのに。
なぜ偉そうに説教しようとするかな。
たった1行の質問に対して回答が何百行、何千行になるとかザラだからだよ
答えがわかっててもどこから手を付けていいのかわからなくなってパニックになる
初心者の質問に対して怒る人は、まあ好意的に解釈すれば完璧主義者だな
「こんな大変な事を気軽に聞くんじゃねぇよ」みたいな
519 :
デフォルトの名無しさん:2013/01/19(土) 07:12:10.93
>>518 たしかにそうだね。
初心者の質問に対して怒る人は完璧主義者かもしれない。
別にその人に回答を要求してないのに要求された気になってて
しかもその回答は完ぺきであるべきて論理的な矛盾は1%も含まれてはいけないみたいな。
でも回答できる人はまとめサイトを紹介するとか
自分でまとめたものをコピペするだけでいいのに。
you tubeで「新唐人テレビ」を検索して見てください。
新唐人テレビは中国の民主化を望む中国人自身によるテレビ局で、海外に拠点をおき、
中国共産党の圧力に屈する情けない日本のマスゴミよりもよっぽどまともなテレビ局です。
日本では中国共産党の圧力により報道出来ないニュースが沢山取り上げられています。
新唐人テレビのような勇気ある報道機関を広める事で、中共の圧力に屈し、
真実を伝えない日本のマスゴミのへなちょこぶりを浮き彫りにする事にもなります。
新唐人テレビを日本や在日中国人の間に広めて、
中共が日本に戦争をしかけてくる前に中共を内部崩壊させましょう!
クレクレ君がいっちょ前に反抗してるよw
523 :
デフォルトの名無しさん:2013/01/19(土) 18:57:35.03
次の方、どうぞ
525 :
デフォルトの名無しさん:2013/01/22(火) 12:26:15.46
次の方いきます。
フィルターしたシートに
他シートのSelectした部分のデータを
「うまく」コピペするためのコードを教えていただけませんか?
コピー先だけがフィルターされてて、コピー元はフィルターされてません。
「うまく」とは表示されてるセルにちゃんと記入されるということです。
>>525 Forで回してセルが非表示かどうか調べながら一セルずつコピーしてくしかないと思う
次の方、どうぞ
529 :
デフォルトの名無しさん:2013/01/22(火) 15:02:15.21
次の方いきましょう。
A列はセルに重複データも含まれています。
B列もセルに重複データも含まれています。
しかしA列のセルとB列のセルの文字列を連結した値は、すべての行でユニークです。
この「A列のセルとB列のセルの文字列」でAdvancedFilter機能を使いたいんですが
コードはどうすればいいか教えていただけませんか?
AdvancedFilter機能で使うフィルター用データは別シートでSelectされているものとします。
530 :
529:2013/01/22(火) 15:05:33.41
【例】
(A列) (B列)
チーム 守備
巨人 投手
巨人 捕手
巨人 左翼
巨人 中堅
巨人 右翼
阪神 投手
阪神 捕手
阪神 左翼
阪神 中堅
阪神 右翼
中日 投手
中日 捕手
中日 左翼
中日 中堅
中日 右翼
<フィルタ用>
チーム 守備
巨人 捕手
中日 投手
阪神 捕手
C列に連結した値入れておけば良いだけだろ
見えると邪魔なら非表示にしてもいいし
C列は他の用途で使ってるならDでもEでもZでもIVでもXFDでもいいし
後出しで作業列使うのはやだとか言うなよ
使わずにも出来るけど、使ったところで弊害無いし面倒だから
criteriarangeにセル範囲指定
セル範囲にかわるデータセット渡せないのかな
あるいはc列不可視に連結出力
フィルター使わなくていいなら、データをバックアップして結合して該当抜き出し
533 :
529:2013/01/22(火) 16:07:09.40
作業列使うのはやだ
534 :
529:2013/01/22(火) 16:08:07.12
元データは、みんなで共有で使ってるから、勝手にいじれないんですよ。
新しいウインドウに出力するのは?
自分のファイルで開いて、元データだけ取得して加工するのは?
・シート追加
・結合データ出力
・フィルタリング
・結果取得
・シート削除
>>529 何が問題なのかさっぱりわからん。
AdvancedFilter機能使いたいんならググればいいじゃん。
サンプルコードならすく検索できるだろ。
そのサンプルコードを参考に作ってみて分からなければここで質問してもいいと思うけど。
ちんこいじると気持ちいい
ちんこじゃなくってティンコだな(´・ω・`)b
540 :
デフォルトの名無しさん:2013/01/23(水) 14:16:02.09
質問です。超初心者で申し訳ないのですが。
for文のカウンタ変数は、for文をプロシージャの中で複数使う場合
宣言は一回でよろしいのでしょうか?iという変数を宣言しておけば、違う
for文でも普通に一緒のが使えますよね?
こういうのはよくないのでしょうか?
541 :
桃白白:2013/01/23(水) 14:27:29.94
>>540 下は良くないけど上は良い。
桃白白なら同じの使っちゃう。だって別の変数を宣言するのめんどうなんだもん。
Dim i
For i = 1 To 10
……
Next
For i = 1 To 10
……
Next
Dim i
For i = 1 To 10
For i = 1 To 10
……
Next
Next
Next だけで動くっけ
Next i じゃないと動かないんじゃないっけ
Step って省略しちゃうのか
Step って明示したくない?
>>540 言語仕様的には何の問題もないけど
ヒューマンエラーを招きやすいって意味では避けた方がいいね
まあ使い捨てコードや、こういうところでの回答としてサンプルコード晒す場合とかなら別にいいが、
長く使うつもりなら、そもそもForを1回しか廻さなくても、そしてiに限らず1文字変数を使うのは避けるべき
カウンタにi,j,k,lってのは、変数の文字数が多くなると弊害が出る時代に生まれた慣習であり
今となっては悪習でしかないからね
544 :
桃白白:2013/01/23(水) 14:40:10.44
>>542 Nextだけで動くよ。
桃白白はStepを省略しちゃう。だってStepを書くのめんどうなんだもん。
545 :
540:2013/01/23(水) 14:44:54.88
>>541 >>543 どうもありがとうございます。
明確にはあまり決まっていないのですね。参考にします。
>>桃白白
市況2にいるタオパイパイっていうコテハン思い出しました。
ループのカウンタ変数に一文字変数を使うと、ネストなしのループなら問題ないけど、
複数ネストしたループに一文字変数を使った場合、カウンタ変数がどこのループ
のカウントをしているのかわからなくなってバグを引き起こしやすい。
ループのカウンタ変数を状況によって一文字や単語?に使い分けていたりするのも有りだと思うけど
一文字変数を使ってはいけない状況で使ってしまいそうで怖い。
なので、どんな時でも一文字変数は使わないようにしておくとバグを起こしにくくなる。
つまり、FORTRANはバグだらけっと
>>542 個人的にはNextだけだとネストしたときに読みにくいから
必ずカウンタ変数もつけてる
そのほうがデバッグしやすい
Stepのほうは Step 1 なら省略する
でも、たまにそこが可変の処理
(たとえば時系列で並んだデータを、1秒ずつ処理するか、1分ずつ処理するか、みたいな時)
にはStepで指定することも有る
549 :
桃白白:2013/01/23(水) 15:06:34.78
>>543 桃白白それにはちょっと断固反対の立場だわ。グローバル変数でってことなら
わからないでもないけど、ローカル変数にまでその考えを適用しちゃったら
こういうことになっちゃうよ?バブルソートのロジックさえ複雑に見えない?
Sub BubblingSortTaopaipaiSpecial(ByRef unsortedArray As Variant)
Dim outerLoopIndex As Long
Dim innerLoopIndex As Long
For outerLoopIndex = LBound(unsortedArray) To UBound(unsortedArray) - 1 Step 1
For innerLoopIndex = LBound(unsortedArray) To UBound(unsortedArray) - 1 Step 1
If unsortedArray(innerLoopIndex) > unsortedArray(innerLoopIndex + 1) Then
Dim temporaryElement
temporaryElement = unsortedArray(innerLoopIndex)
unsortedArray(innerLoopIndex) = unsortedArray(innerLoopIndex + 1)
unsortedArray(innerLoopIndex + 1) = temporaryElement
End If
Next innerLoopIndex
Next outerLoopIndex
End Sub
Sub Sort(a)
Dim i, j, t
For i = LBound(a) To UBound(a) - 1
For j = LBound(a) To UBound(a) - 1
If a(j) > a(j + 1) Then
t = a(j)
a(j) = a(j + 1)
a(j + 1) = t
End If
Next
Next
End Sub
んなもんモノによるだろ
逆もまたしかり
>>549 バカ正直に単語を並べればいいってものじゃないでしょ。
outerLoopIndexなんてouterIdxでも通じるし。
「outer」っていうのが肝だから省略するのは考えるところだけど、
「LoopIndex」なんていうのはカウンタ変数であることが解ればそんなに長く書く必要はない。
552 :
桃白白:2013/01/23(水) 15:21:51.82
>>551 うんだから、桃白白は1文字の変数使っちゃったらロジックを
明快に示すことができるよって立場なの。
桃白白ってまだそのレベルなのか
cntOut、cntInnとかだわ
>>548 VBSなら Next'Cnt とかやる
Stepは変数使ったり-1とかであったりなかったりってのが嫌だから
Stepは書くわ
>>549 > Sub Sort(a)
> Dim i, j, t
> For i = LBound(a) To UBound(a) - 1
> For j = LBound(a) To UBound(a) - 1
> If a(j) > a(j + 1) Then
> t = a(j)
> a(j) = a(j + 1)
> a(j + 1) = t
> End If
> Next
> Next
> End Sub
あともう一つ。
jがカウンタ変数になっているループの中でiも使うパターンだってあるわけで、
変数が多くなってくると本当に解読が困難になってくる。
一文字変数が使われている一行を切り取って何を行なっている処理なのか普通はわからないと思うけど。
こんなやつは前後のコードを見ないといけなくなるからめんどくさい。
> a(j + 1) = t
こういうのはその時は本人が理解できているからいいのかもしれないけど、
時間が経つと何やってるんだっけ?と本人も理解できないようなコードに化ける。
for row = 1 to 10
for col = 1 to 20
next
next
みたいに、簡潔で意味のある変数名選択しろってことだよ。
>>557 同意。
特にExcelでセルの位置を舐めるときは、そういう変数名がいいね。
559 :
桃白白:2013/01/23(水) 15:42:35.41
560 :
桃白白:2013/01/23(水) 15:44:24.78
>>557 じゃあxとyでもいいわけじゃん。
簡潔で座標の意味を表すことができるわけだからさ。
>>552 一文字変数でロジックを明快に示すことは難しいと思うけど。
あまりにもコードがスッキリすぎて何をどうしたいのか理解するのに苦労する。
他人に物を伝えるときに一文字発すれば伝わるか?
最低限何かしら単語を発さないと伝わらないと思うが。
>>560 Excelの場合、行列という概念があるんだが。
>>560 座標って言っても、x,yだけじゃ何の座標か解らんな
例えばマウスカーソルの座標だったらcurX,curYとかな
>>562 シート上でも座標概念はあるぞ
x,yではなくTop,Leftだが
564 :
桃白白:2013/01/23(水) 15:58:49.52
>>561 他人にものを伝えるときに一文字しかしゃべらない人はそれはもう頭がおかしい人じゃん。
桃白白は頭がおかしい人じゃないからそんなことしない。いまも一生懸命文章書いてるよ。
何をするのかは関数名で示すなり、ここではバブルソートが行われるんでんがなみたいな
コメント書いとけばいいじゃん。
>>549を見てよ。どう見たって下のほうがわかりやすいっしょ。
565 :
桃白白:2013/01/23(水) 15:59:45.36
>>563 Cells(y, x)でわかるっしょ。そんなのわかるっしょ。わかるっしょ。
BASICのforのカウンタ変数は
外側からi,j,k,l.m...とするよう昔から相場が決まっている。
逆にカウンタ変数以外にこれらを使うことはない。
一文字で十分伝わる。
コーディング規約如何だろ
くだらん事で盛り上がってんなや
プログラミング一年生かお前ら
568 :
557:2013/01/23(水) 16:41:11.38
>>565 hoge(○, △)と表記するとき、まぁほとんどの人がxとyを選択するだろうなぁ的な文脈だったら
xとyがいいよ。
でも、cells(y, x)はあまり一般的じゃ無い気がするけど。
569 :
557:2013/01/23(水) 16:42:34.54
>>567 一周回ると、名前超重要ということに気づく。
570 :
桃白白:2013/01/23(水) 16:44:43.40
>>569 はい。
(規約如何である事に同意の上ならば)
そもそも、xyを変数に使わない
エクセルだもん
rowとcolmun だろ
あーそもそも論を出しちゃうのー??
↑この「そもそも論」って使う?もしくは使う人が身近にいる?
そもそもExcel VBAでコーディング規約??みたいな
20年以上前から様々な言語で同じ様な議論がされ常に結論は出ない→くだらん事ってことでしょ
正直自分もこの話題にはうんざり
Cells (x,y)だと
座標y,xになる
で、Cells (y,x)って記述するのは違和感がある
慣れてないものつかってヒューマンエラー起こすくらいなもんだし
直感で理解出来るコードって大事よ
577 :
桃白白:2013/01/23(水) 17:06:29.77
>>576 Cellsの1番目の引数が縦を表すことに変わりはないんだから
その違和感をものにしなきゃいけないと思うの。Cellsはたしか
違和感のある記述をしなきゃいけないんだったって記憶しちゃったらいいじゃん。いいじゃん。いいじゃん。
>>575 BBSでうんざりってなにを寝言言ってんだ
>>577 ExcelでRow、Columnと使っているのに何で態々x、yとExcelと異なった表記をしたくなるのか?
Row、Columnなら殆どの人がどこを操作しているのか明快だと思うけど。
名称がRow、Columnとなっているのに、x、yと名前と付けたがる方が違和感がある。
Top、Leftもそのような名称がExcelで使われているんであればそれを使ったほうが自然。
580 :
桃白白:2013/01/23(水) 17:31:53.07
>>579 Row, ColumnはRangeオブジェクトを参照するときに使うっしょ。
y, xはインデックスをあらわすときに使うっしょ。だから。
LeftはVBAの文字列操作関数とかぶるから使えないっしょ。
なんでこのスレって俺より解ってる奴が一人も居ないんだろう?
リアルだと俺より上なんてゴロゴロ居るのに、、、、、
>>581 いるけど
くだらないことにはレスしないんだよ
上級者というのはそういうものだ
やはり居ないみたいだな
おもいっくそCells(y, x)とか言ってるやつが何を
自分で使うならいい
人に自慢するならいい
人が使ってる手法を否定すんな
グラマとして最低限の作法だろ、それ
どうでもいいことかも知れないけど、言われてるほうからすればお前の主張こそ「どうでもいい」
いや、パイパンのことだけじゃないんだけど
586 :
桃白白:2013/01/23(水) 19:27:59.36
>>585 いいたいことはわかるけど、それやると女子のお茶会みたくならない?
えーそれかわいーと言い合うだけになっちゃわない?桃白白は別にいんだけどさそれでも。
桃白白はじっさいかわいいからさ。
>>585 お前も人のこと否定してるし、お前の主張もどうでもいいw
>>585 お前の主張が何なのかイマイチ良くわからんが
>人が使ってる手法を否定すんな
まっとうな批判ってのが世の中にはあるんですが
批判されるのがいやなら一般公開されるような掲示板に書き込みしちゃだめだよ
うむ。
ネット掲示板で議論するのなら
人格を始めとする様々な自己属性を
攻撃・否定されるのも当然覚悟のはずだろう。
主張はするけど否定されたくはないというのは
このうえない自己中。
591 :
デフォルトの名無しさん:2013/01/23(水) 19:57:07.19
久しぶりにのびてると思ったら・・・
ここは質問スレ。議論スレじゃない。否定・主張・批判、まったくもって関係ない。
プログラミング法について議論したいならそういうスレに逝け。
命名規則・コーディング規約はプロジェクトや個人で選択するもん。批判・否定レベルの話じゃない。
プログラミング法を否定しちゃいけない。これはプログラマなら魂の奥底から理解できること。
スレ違いです。
次の質問者どうぞ。
>>591 バグの出やすいコードと思われるものに対して何も言わないのも問題だと思うけどね。
というよりコードって人に見せて批判されて書き直して、を繰り返していかないと
いいコードになっていかないものだけど。
魂の奥底なんてコードを書くのに関係ないから。
年寄りから言わせてもらえば、英単語を省略する方がよっぽどバグの温床になるぞよ
IndexをIdxと書くとか
とくに開発の規模が大きくなると、どの単語をどう略するかのルール作りで余計な手間が増えるし
コーディング時のミスも増える
それで問題ないと言ってる人は結局はマイルールを作っちゃってるという意味で1文字変数と大差ない
一人で完成させるプロジェクトなら好きにすればええ
>>593 グローバルな変数しか使えなかった時代の人ですか?
IndexやObjectぐらいなら全員知ってるからいいけど、
辞書を引かないとわからないような単語を略されるとデバッグ担当が死ぬ
そういう経験が無いとか想像できない奴はまだまだ経験値不足だな
Aさんの作ったモジュールAではColor IndexををColIdxと略した
Bさんの作ったモジュールBではColumn IndexをColIdxと略した
これでバグが出ない方がおかしい
グローバルじゃないからこそ、こういうことが起きるわけで
>>596 見渡せないほどでかいスコープに変数公開してるからでしょ?
宣言と使用箇所が近ければそんな風に変数がどんな役割か見失ったりしないよ?
スコープに応じて変数名の長さ変えるとか今は常識だよ?
プログラミング向いてないんじゃない?
>>597 大きいプロジェクトなのにレビューしないのかよw
そういう省略はレビューで思いっきりNGになるんだが。
1回限りのカウンタにiを使うなんてどんな参考書にも書いてあるだろ
この程度の常識を知らないやつはコード書く資格なし
>>600 理想論だな
規約をきちんと作ればいい、レビューすればいい、それで解決できれば誰も苦労しない
そういう事務的な作業を増やさない工夫のが重要
(普段回答に参加できないからって、こういう時ばっかり張り切って揚げ足とるんだよなお前らって・・・
まあここまで俺の自演だけどな)
ルールっては増えれば増えるほど逆に質が落ちるんだぜ
故意でも過失でもルールを破る奴が増える、そのチェックにコストがかかる
無理にでも質を維持すると生産性が落ちる
迫る納期、辞めてく同僚
コーディング能力と人間性は比例しない
どんだけ金を積んでも理想の人材なんか決して集まらない、そもそも金なんか積めない
それでも作らなきゃいけない
さあどうする
結論、マ板へ行け
省略否定派は最低でもLocal_Variable_Integer_Temporary_Counter_Level001って書いてるんだろうな?
ア
悔しいからって極論厨に成り下がると、後から自分で見てもっと惨めでもっと悔しくなるよ
>>602 逆でしょ。
規約、レビューなしのほうが理想論。
>>605 省略否定派はいないと思うが。
一文字変数じゃ省略しすぎと言ってるだけ。
極論過ぎんだよ。
圧倒的 論破・・・っ!!
>>609 お前も極論すぎないか?なんでもかんでも1文字にしろとはいってないだろ
(VB以前のBASICにはそういう高速化テクニックもあったんだが)
重要でないループインデックスのi,j,kぐらいは、BASICの常識として通用するんじゃね
お前らもまんこにちんこ突っ込んでみなよ
気持ちいいぞ
>>611 その考えがバグにつながると言っているのだが。
コードを書けば書くほどバグが出るからといって、省略しすぎるのも問題。
BASICでは常識なのかもしれないけど、今じゃ悪習だし、そもそもBASICとVBAって全く違う。
マシン語ならコンピュータが理解できればいいから別に気にしない。
VBAが優れているかどうかの話は別にして、仮にも高級言語なんだから
人間が理解できるように書こうという姿勢が見られないんだよね。
614 :
桃白白:2013/01/24(木) 09:54:51.62
>>613 じゃあ何か実装してみてよ。
桃白白のバブルソートよりわかりやすいバブルソートが書ける?
重要ではないループの変数名を長くして何かわかりやすくなる?
お前が言っているのは机上の空論どころか騎乗の空論だよ。お馬さんに
乗ってパカパカやってるだけだよ。
>>613 すでに599でも言及されているけど、
変数のスコープが十分に狭ければ一文字変数であってもぜんぜん問題ない
そして611は変数名を全部一文字にすることを提唱しているわけでもない。
結局のところ変数名というものは短くて良いものもきちんとしたほうが良いものも
両方あるわけでその線引きはバランスの問題としか言いようが無い。
まぁアレだ
次の方どうぞ w
>>591 久しぶりにしか見ないんなら、またしばらく来るなよ。
ぬるぽ
日本語文を理解できないやつが多すぎてこまる
早とちり程度なら可愛げもあるが……
脳内で悪印象を付与して再構築、妄想レスが多すぎる
お前らの反応コード組んだプログラマ読んでこい、どうせメリケンなんだろ
> お前らの反応コード組んだプログラマ読んでこい、どうせメリケンなんだろ
マジで理解できない
621 :
デフォルトの名無しさん:2013/01/24(木) 13:03:46.43
>>620 同意
こんな文章しか書けない
>>619に
「日本語文が理解できないやつ」とか言われたくない
文脈が読めない人工無能ってことだろ
コードって言ってるんだから、それより下位の人工恥能を意味してるんだろうなあ
>>622 おまえもか・・・
君と
>>619は
自分の文章力について少し反省したほうが良いぞ
まずは新聞を毎日きちんと読むとか、
そういう習慣をつける事から始めてみなよ
俺は内容を支持するつもりは無いが、言ってる意味はわかるぞ
真に受ければ不快な内容だが、そこそこ上手いこと言ってるし
というか
>>619に「うっせぇ、氏ね」とか悪態つくならまだしも
理解できないとか意味不明とか言っちゃうと、
自分のリテラシーの無さを暴露してるだけになっちゃう気がする
とか書くと俺が
>>619本人の自演扱いにされそうだなw
読解力をリテラシーと言いたがる奴の存在について
> お前らの反応コード組んだプログラマ読んでこい、どうせメリケンなんだろ
補完: お前らのレスはできの悪い人工無能レベルだ)
お前らの反応コード→そのお前らのレスを自動生成する人工無能のアルゴリズム
組んだ奴→を書いた奴
読んでこい→呼んでこい
どうせメリケンなんだろ→どうせ日本人じゃ無いんだろ(だから程度低いレスなんだ)
何で句読点打たないのかしら。
何かの流行なの?
つかさ、たいした質問なんか出ないんだから、おいしそうな話題で盛り上がったっていいじゃない
>>624 ああいう(
>>619や
>>622のような)不完全な日本語を理解できたり
(もっとも、理解出来ると思っているだけなのかもしれない)
エスパーしたりすることが日本語の読解力だと思っているなら
それは大きな間違いだよ
630 :
桃白白:2013/01/24(木) 14:06:54.77
>>627 桃白白最近気づいたんだけどさ、漫画って句読点がないんだよね。
ワンピースやナルト、比較的文字数が多い名探偵コナンも句読点がない。
そうなるとさ、句読点ていらないんじゃね。
VBAでも変数はDimで宣言されてなくても使えちゃったりするじゃん。
むしろロジックと関係ないという意味でDimもAsも飾りみたいなものじゃん。
なくてもいいじゃん。
悔しさ爆発してる奴が居て笑えるw
>>630 Option Explicitくらい付けろ。
バグの元だ。
>>630 いや、宣言は強制しといたほうが良いだろ
他人の組んだコードのメンテ作業をすると、
変数を宣言せずに使ってて、変数名間違ってて別の変数扱いになってるとか
そういうバグは何度か見た経験があるよ
あと、変数の型指定もそれ自体が変数の意図を表してたりするから
出来れば適切な型指定を心がけたほうが見やすいコードになると思う。
634 :
桃白白:2013/01/24(木) 14:26:33.24
何かパイパンを更生させるスレになりつつあるなw
くっだらない言い争いが続いていますが、気にしなくて結構なんで、次の方どうぞ
くだらないということにしたいのは、何故なんだろう
スレ違いという自分の指摘を無視されたのが気に入らないのか
638 :
初心者:2013/01/24(木) 15:28:22.57
質問です。
VBAにinputbox関数が二つありますよね?あれって厳密にどう違うんでしょうか?
inputboxメソッドといわれるものはアプリケーションオブジェクト(エクセルというオブジェクト)
の関数(メソット)ですよね。じゃーもう一つのinputbox関数そしてその他の
msgboxや、range関数はなんのメソッドなのでしょうか?何か上のオブジェクト
はあるんでしょうか?なんか見当違いの質問だったらすいません。
639 :
デフォルトの名無しさん:2013/01/24(木) 15:29:37.47
>>637 ここのスレタイも読めない白痴か、お前は
最近の質問者ってパイパン臭がする。
違うのかもしれないけどw
たあにはこういう和気藹々したのも悪くないわな
>>639 スレ違いか否かと、くだらないか否かは別問題だよ
なのに、なんでくだらないということにしたいの?
そして質問には総スルー
流石だな
644 :
デフォルトの名無しさん:2013/01/24(木) 16:53:15.89
>>638 そんな長い文章書く前に、どうしてググらないのかなぁ。
「VBA input 関数 メソッド」で、一番上のリンクに答えがあるのに。
648 :
デフォルトの名無しさん:2013/01/24(木) 17:17:11.16
>>646 それは638への適切な答えではないと思う。
あそこに書いてあるのは使い方の違いであって
そもそも関数とメソッドの違いってなんだ?という質問への答えではない
>>638 Application.InputBoxメソッド
Applicationのメソッド、つまりエクセルの組み込み機能
InputBox関数
VBAに組み込みの関数
MsgBox
VBAに組み込みの関数
Range
Rangeは関数じゃない。エクセル組み込みの「何か」のメソッド
何かを指定しない場合はActiveSheetだと思っといてよい(本当は違うけど)
関数とメソッドとプロパティがわかりづらいよな
>>648 そもそもの質問は関数とメソッドの違いについてではない
まあ質問者がその違いを把握してるとは思えないが
広義な関数は、0個以上の引数を与えて1個または0個の値を返すのが関数
そういう意味ではメソッドも関数
狭義な関数はVBAで定義された関数でいいんじゃないかな
>>649ではそういう意味でRangeは関数ではないと言ってる
もとの質問はInputBoxは2種類あるけど、どこで定義されててどう違うんだ?
MsgBoxやRangeはどこで定義されてるんだ?って質問
InputBoxが関数かメソッドかは大した違いではない
プロパティも広義の意味じゃ関数と言えるし
>>652 プロパティは変数のほうがしっくりくるけど。
654 :
648:2013/01/24(木) 17:51:19.95
VBや.NET系のプロパティは代入できるからなぁ
あれは関数というより変数じゃないだろうか
>>654 その根本的な違いがメソッドか関数かだと思ってるならお前も解ってない
メソッドも広い意味では関数だからな
エクセルに組み込みの関数(メソッド)なのか、VBAに組み込みの関数なのかの差
VBAはエクセル専用の言語ではないって前提をまず理解しないと
つか、こっちの話の方がどうでもいいわ
くだらん
660 :
648:2013/01/24(木) 18:05:48.32
>>658 分かってないから俺は答えられなかったんだよ
>>657 Range型の変数相当だと思っていいんじゃね
まあ、プロパティは、
値をセットするメソッド(setter)
値を取得するメソッド(getter)
値を保存するフィールド
の三位一体だからな
ただ、プロパティにするかメソッドにするか考えたときに
値(状態)を保存するものはメソッドよりプロパティがふさわしいという原則を考えると
プロパティは変数のようなもの、と考えるのが妥当かと
>>661 > 単一のセルまたはセル範囲を表す Range オブジェクトを取得するには、Range(arg) プロパティを使用します。
> 引数 arg には範囲の名前を指定します。
変数って引数を与えるのか?
664 :
662:2013/01/24(木) 18:31:10.55
>>657 ってふと思ったんだが
Rangeプロパティってどっかにあるか?
あったとしたら、RangeメソッドかRange型の間違いじゃないか
665 :
662:2013/01/24(木) 18:49:06.31
>>663 確かにプロパティになってるな(この辺は大昔にすったもんだあった気がしたが)
Range(arg)はRange._Default(arg)の省略
変数が直接引数をとってるわけではない。デフォルトプロパティが引数をとってるだけ
Dim r As Range
Set r = Range("A1:D4")
MsgBox r(1, 1).Value
ちゃんと動くだろ。でもrが引数をとってるわけじゃない
666 :
初心者:2013/01/24(木) 19:39:52.32
遅レススマソ
>>654 正解です。グーグルである程度調べました。
しかし中地半端にオブジェクト指向型言語ををしっている僕としては
その明確にどのように動作しているか?仕組みというものが気になったんで
す。
>>649 あ、なるほど。
・・・つまり、applicationメソッドということはそのエクセルのソフトに
依存して、エクセルソフトの機能も使って実現してるということですね?
VBAの組み込みはVBの派生みたいな感じで?あくまでVB側の関数を派生
したということで。(簡単にいうと)ですよね?
>>651 どうもありがとうございます。
そういう質問ですね。
よく僕の質問は意図しない答えが返ってこない場合が多々ありますが。
(現実にも)
>>666 とりあえずオブジェクトブラウザの使い方を覚えろ
F2で立ち上がる
それで調べれば何のメンバかはすぐわかる
668 :
初心者:2013/01/24(木) 19:52:28.91
>>667 ほんとだ。こんなところに色々でてるんですね。
調べてみます。
ありがとうございます。
Private Sub MovSearch() '動画ファイルの検索
Dim hFso As FileSystemObject
On Error GoTo ErrorHandler
ReDim strPathArrey(0)
strFilePath = "D:\動画\"
strKeyWord = Left(UserForm2.TextBox1, 7) 'UserForm2より図番を取得
Set hFso = New FileSystemObject
m_FileIdx = 0
Call fncmovFileSearch(hFso.GetFolder(strFilePath), True)
For m_FileIdx = 1 To UBound(strPathArrey)
Mov(m_FileIdx) = strPathArrey(m_FileIdx) 'FilePathを格納
Next m_FileIdx
' Mov(m_FileIdx) = strPathArrey(m_FileIdx)
ErrorHandler:
If Err.Number = 76 Then
MsgBox "動画写真が見つかりませんでした。" & Chr(13) & "動画を撮影し、所定フォルダに登録して下さい。", 48, "動画未登録"
Else
Resume Next
End If
Set hFso = Nothing
End Sub
Private Function fncmovFileSearch(ByVal p_Folder As Folder, ByVal p_SubFolder As Boolean) As Boolean
Dim hFile As File
Dim hSubFolder As Folder
For Each hFile In p_Folder.Files
With hFile
If LCase$(.Name) Like "*wmv" Then
If InStr(.Name, strKeyWord) > 0 Then
m_FileIdx = m_FileIdx + 1
ReDim Preserve strPathArrey(m_FileIdx)
strPathArrey(m_FileIdx) = .Path
End If
End If
End With
Next hFile
If p_SubFolder Then
With p_Folder
If .SubFolders.Count > 0 Then
For Each hSubFolder In .SubFolders
DoEvents
Call fncmovFileSearch(hSubFolder, p_SubFolder)
Next
End If
End With
End If
Set hSubFolder = Nothing
End Function
Private Sub CommandButton2_Click() '動画ボタンClick
Call MovSearch
UserForm3.WindowsMediaPlayer1.URL = Mov(0)
UserForm3.WindowsMediaPlayer1.Height = 290
UserForm3.WindowsMediaPlayer1.Width = 330
UserForm3.Show (0 - vbModeless)
End Sub
長いですがコードの一部です。
ユーザーフォームではなく普通のWindowsMediaPlayerで再生できることは確認したの?
後入れしたMPCとかGOMとかRealPlayerではなく、Win標準のWindowsMediaPlayerで
>>673 確認しています。
元々Windousに入ってたSumple動画で試しました。
こういう書き込みがあると元の質問がネタかと思ってしまう…
676 :
669:2013/01/24(木) 22:17:47.79
誤字だらけですみません
>元々Windowsに入ってたサンプルムービーで試しました。
が正解です。
そもそもその動画ファイルはMediaPlayerで再生できるのか?
とりあえず動作しないミニマムコード作ってから質問してくれ
678 :
桃白白:2013/01/24(木) 23:05:25.55
>>676 すくなくとも提示されたコードではMovの0番目にURLがセットされないっすよ。
なんか動かんと思ったらみんなグローバル変数かよ…
まさかと思うけど、URLセットしたあとちゃんと「再生」してる?
Call UserForm3.WindowsMediaPlayer1.Controls.Play
680 :
669:2013/01/24(木) 23:16:49.98
>>678 すみません
UserForm3.WindowsMediaPlayer1.URL = Mov(0)
を
UserForm3.WindowsMediaPlayer1.URL = Mov(1)
に変えたら出来ました。
初歩的なミスでおはずかしい
∧∧
ヽ(・ω・)/ ズコー
\(.\ ノ
、ハ,,、  ̄
683 :
669:2013/01/24(木) 23:39:32.76
質問ついでにもうひとつ教えて下さい。
動画をフォームのサイズに合わせて表示する方法はないでしょうか?
画像でしたらPictureSizeModeで設定できるのですが、動画では
UserForm3.WindowsMediaPlayer1.stretchToFit = True
でもできませんでした。
なにか設定項目があるのでしょうか?
まずはまんこをさらけ出せよ
話はそれからだ
試してないし良くわからんが
メディアプレイヤーコントロールのサイズをフォームのサイズに合わせるだけじゃないの?
>>683 stretchToFitは動画をプレイヤーに合わせる
プレイヤーをウィンドウに合わせるにはResizeイベントの中で自分で幅と高さを設定する
質問でうs、
数独(ナンプレ)の回答を導き出すExcel VBAプログラムを作るとしたら、
多次元配列などを駆使ししてコードだけでやりますか?
Excel のセルを利用しますか?
>>687 セルは問題の入力と答えの表示だけに使う
処理は配列の中だけでやる
解いていく過程も見せたいならセルでやるかもしれんなぁ
>>686 具体的にどう記述したらいいですか?
色々試しましたがぴんときません
>>690 回答者がお前がやったことを回答してきたらどうするんでしょw
割り込みすみません。ご存じの方対処方法をご教授ください。
○環境:WinXP(SP3) + Excel2010Personal
○やりたいこと:
セルを右クリックしたときに、標準のポップアップメニューに独自のメニュー項目を追加してる。
セルの位置や値などの条件から、メニュー項目の追加・削除を制御している。
セルを右クリックしたときに呼び出されるプロシージャが2つあり、どちらも呼び出される。これは問題ない。
オブジェクト:WorkSheet
プロシージャ:BeforeRightClick
関数名:Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
オブジェクト:WorkBook
プロシージャ:SheetBeforeRightClick
関数名:Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
しかし、「アプリケーションキー」をクリックしたとき、どちらの関数も呼び出されない。
よって、ポップアップメニューの項目の制御ができない
(正確には、直前に右クリックしたときのメニュー項目となる)
「アプリケーションキー」をクリック後、どちらかのプロシージャを呼び出す手順をご教授ください。
なお「アプリケーションキー」クリックしてポップアップメニューの項目を選択する「マクロの記録」も実行しましたが、
作成されたマクロ関数は処理が無くてコメントだけでした。
693 :
桃白白:2013/01/25(金) 13:30:56.33
>>692 関数を用意してアプリケーションキーが押されたときにその関数が呼ばれるようにして
その関数でWorksheet_BeforeRightClickで行われる処理が呼ばれるようにしちゃうのはどう?
Declare Function GetAsyncKeyState Lib "User32.dll" (ByVal vKey As Long) As Long
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Const VK_APPS = &H5D
Sub Test()
Do
If GetAsyncKeyState(VK_APPS) <> 0 Then
Call APPS_KeyDown
End If
Sleep 32
DoEvents
Loop
End Sub
Sub APPS_KeyDown()
RightClickProcess
End Sub
Sub RightClickProcess()
MsgBox "taopaipai"
End Sub
バグwww
>>693 今推されてるキーがアプリケーションキーかどうかを調べる方法がわからないんじゃなくて、
アプリケーションキー入力をトリガーとする方法がわからないのが問題なんだよ。
Excelの機能の範囲では、Worksheet_SelectionChange()で毎回変更するくらいしか思いつかないけど、
そうするとカーソル移動なんかが重くなるのかな。
まあ、「アプリケーションキー入力での動的メニュー変更には対応しない」という仕様であるということに
するのが、一番良いような気がする。
696 :
桃白白:2013/01/25(金) 13:43:23.97
>>695 ____
/ \
/ _ノ ヽ、_ \ そんなこと言われても
/ (●) (●) \ どうすりゃいいのさ
| (__人__) |
\ ` ⌒´ /
/´ `\
/ / l l .
__l l_.[] _____/_/__
\, ´-'ヽ
ヾ_ノ
|
|
|__ コロ・・・・
_____\ コロ・・・・
()__)」
桃白白が好きになってきたw
onkeyでアプリケーションキー取れればそっちで対応できるけど、onkeyってアプリキー非対応みたいだね
あとはサブクラス化ってVBAでも出来たっけ?
まあVB6でも鬼門なくらいだから、出来たとしてもやらない方がいいとは思うけど
常にループさせとけって
キーフック出来るから
節子、それフック違う
フックだチンだ
標準でない機能はAPIを呼ぶしかない
onkeyでSHIFT-F10トラップしたらいけるんじゃね
ホントだ
onkeyではアプリキー指定できないけど、Shift+F10トラップすると
アプリキーも拾ってくれるんだね
これで解決か
705 :
デフォルトの名無しさん:2013/01/25(金) 21:42:29.00
セルやシートやブックを対象に何かするときに
アクティベートしている状態でないといけないか、それともアクティベートしなくてもいいか、
その基準みたいなものはありますか?
そういうことへの回答は、不正利用を助長することに成りうるし
操作方法とかではなく仕様についてはメーカーに聞くのが基本なので
MSに問い合わせてください
>>705 セルやシートやブックを対象に何かを行うときはアクティベートしなくても行える。
基準なんて聞いたことがない。
???
アクティベートしてないと30回しか起動できないんだっけ
最近のバージョンのことは知らん
それはアクティベーション
711 :
デフォルトの名無しさん:2013/01/25(金) 22:50:29.92
変数宣言
Dim 〜
は、どこでするのが吉ですか?
プロシージャ内で使うローカル変数なら
その変数を初めて使用する直前?
それともプロシージャの先頭?
プロシージャの先頭
コードが冗長になるようなら、変数を使用するときに再度コメントで説明すると吉
713 :
桃白白:2013/01/25(金) 23:05:28.38
>>711 桃白白はバラバラかな。関数の最初のところでまとめて宣言するときもあるし
必要になった段階で宣言するときもある。
VBAの作法としてはプロシジャの先頭でまとめて宣言するのが薦められてたような
プロシジャより狭いスコープの変数宣言は出来ないので、使う直前とか止めた方が良いというのが俺の意見
見通しが悪くなるような長いモジュールは作らない方がいい
だから先頭で一括が推奨される
716 :
桃白白:2013/01/26(土) 00:21:39.05
>>714 でもさ、見た目が気になるときってあるじゃん。これあとのほうで
使う変数なんだけどみたいな。ほかのところで使われたらおかしいんだけどみたいな。
最初のところで全部宣言しちゃったらそこんとこわかりづらくなるんだけどみたいな。
そんなときってあるじゃん?だからさ、ケースバイケースの桃白白方式が大吉だと思うんだよね。
カプセル化して呼び出すのが理想
引数が面倒・・・
まずはまんこをいじりまくれ
>>716 変数の宣言が先頭にあったり、途中にあったりすると書き方の統一性が取れていない。
こういうのがあると他の部分も統一取れていないグチャグチャのコードなのか?と疑う。
精神的に無駄に疲れる分よくないな。
単純に行数節約を目的に先頭がさ、俺は好きだよ。
>>716 その「後の方」って表現が出るほど、一つのプロシージャにだらだらとコード書かずに
細かくプロシージャ分けて、読解性、視認性、メンテナンス性を上げていこうって話だよ
まあそういうのは大規模なプロジェクトでより活きてくるから、桃白白にはまだ
理解の及ばない域かもしれないけど覚えて置いた方がいい
722 :
桃白白:2013/01/26(土) 09:18:14.70
>>721 なんなの!?性を連呼して、変態。
関数は分ければいいってもんでもないしあえて一つの関数に書くときもあるっしょ。
あっち見てこっち見てさせるよりは一箇所に記述したほうがいいときもあるっしょ。
そんなとき、そんなときなんですよ、変数、関数の最初に宣言しないほうがいいっす。
,j;;;;;j,. ---一、 ` ―--‐、_ l;;;;;;
{;;;;;;ゝ T辷iフ i f'辷jァ !i;;;;; 変数、関数の最初に宣言しないほうがいい・・・
ヾ;;;ハ ノ .::!lリ;;r゛
`Z;i 〈.,_..,. ノ;;;;;;;;> そんなふうに考えていた時期が
,;ぇハ、 、_,.ー-、_',. ,f゛: Y;;f. 俺にもありました
~''戈ヽ `二´ r'´:::. `!
この流れ多いよね
白濁が納得する理屈や表現を示してあげるまで続きます的な流れ
白濁のどや顔な比喩表現とか面白くなくて逆に面白いから別にいいけどさ
725 :
桃白白:2013/01/26(土) 09:35:58.80
>>723 あのころの自分を思い出せ、変数は関数の最初に宣言しないほうがいいんだ。
726 :
桃白白:2013/01/26(土) 09:40:26.59
>>724 3回読んだら白濁が桃白白のことなんじゃないかと疑問に思えてきたんだけど、
桃白白のことじゃない、問題ない、桃白白はまだやれる。
だからそう思ってたってばてば
後にデメリットの方が大きく過ちだったと気付いたが、両方経験してる俺には君の主張も理解できるが
未だ変数冒頭宣言の有意さに気付いてない君には、一方の利点しか見えていないわけだ
728 :
桃白白:2013/01/26(土) 09:48:08.09
>>727 そのおっきいデメリットってなあに?桃白白はケースバイケースという立場だから
立場としてそんなにかわらないと思うけどおっきいデメリットは思いつかない。
質問です。野暮な質問ですが教えてください。
エクセルのブイビーエーな質問スレで話さないといけないんですか?他にふさわしいスレッドはないのですか?
2chは初めてか?
とりあえず肩の力抜けよ
>>729 パイパンは面白おかしく書いてるが他の人はまじめに書いてるし
エクセルVBAに役に立つ話題だからここでして欲しい
と思う俺は先頭で宣言する派
ってか、途中で宣言するぐらいならそこは別プロシージャにしろと
732 :
桃白白:2013/01/26(土) 10:15:36.93
>>731 桃白白超まじめなんだけどー。
関数は変数の宣言場所とは関係なく機能でわけるべきっすよ。
変数を関数の先頭で宣言しないおっきいデメリットって結局なんなの?
よくわかんなかった。
733 :
731:2013/01/26(土) 10:26:26.73
>>732 >関数は変数の宣言場所とは関係なく機能でわけるべきっすよ。
その機能というものをひとつのプロシージャあたりひとつに絞って、
それらを組み合わせて全体のプログラムにするってのが
オブジェクト指向の基本的考え方なんじゃない?
デメリットっていうか、
スコープの範囲内で見通せる規模のプロシージャなら
先頭で宣言してなんの問題もないわけで、
途中で宣言しないと分からなくなるような構造って
もっと整理してコンパクトにまとめるべきだと思うんだ。
まぁおれは
>>727さんじゃないから
この考えで合ってるかどうか分からないけど
734 :
桃白白:2013/01/26(土) 10:34:54.59
>>733 オブジェクト指向はオブジェクト作っちゃいましょってやつだから
関数を定義してそれを呼んじゃいましょというのは構造化プログラミングだろうけど、
わからなくなるかどうかで判断したら開発するときと保守するときで
変わってきちゃうじゃない。開発するときはわかったんだけどーみたいに
なっちゃわない?だから変数の宣言場所と関数の分割単位はわけて考えないとまずいっしょ。
735 :
おんなのこ:2013/01/26(土) 10:36:33.56
>>718 きもちょくなってきたゎ
つぎはどぅするの?
736 :
731:2013/01/26(土) 10:41:08.19
>>734 >開発するときはわかったんだけどーみたいに
なっちゃわない?
それ多分、途中で宣言するようなプロシージャでこそ起こりうる問題だと思う。
だらだら長いコード書いて最初に宣言した変数が訳わからなくなるのは
宣言した場所が拙いんじゃなくて、そんな長いコード書くのが悪いって考え方なのよ
おれは。
737 :
桃白白:2013/01/26(土) 10:57:21.91
>>736 それは長いコードがだめだって話ね。
変数を途中で宣言するとコードが長くなるって思ってるわけね?ああわかった。
じゃあコードが長くならなければ変数を途中で宣言してもデメリットはないってことでいいわけね。
長いというよりも、複数の機能的処理が混在しているのが良くない
739 :
桃白白:2013/01/26(土) 11:01:25.55
>>738 桃白白は関数を機能で分割するべきだって立場だからそれはそうだと思う。
740 :
デフォルトの名無しさん:2013/01/26(土) 11:03:51.62
WordのVBAを
Excelの個人ファイルみたいなところに保存して
どのWordファイルに対しても実行できるようにしておきたいんですが
Normalに書いたコードが保存できません。
どうすればいいですか?
741 :
731:2013/01/26(土) 11:51:47.92
>>737 >変数を途中で宣言するとコードが長くなるって思ってるわけね?ああわかった。
違う、順番が逆
コードが長いから変数を途中で宣言したくなるんだと思ってるの
>じゃあコードが長くならなければ変数を途中で宣言してもデメリットはないってことでいいわけね。
メリット・デメリット って事は俺が言ってるわけじゃないんで
俺に聞かれても答えようが無いけど、
じゃあ逆に変数を途中で宣言するメリットってなんだろうと考えると
多分その変数で処理を行う部分の近くで宣言した方が
その処理の動作が分かりやすい
ってことなんだと思うのね。(違ってたらごめん)
で、最初に戻るわけなんだけど、処理内容が見通せないような複雑なものだったら
それはさらに分割してより単純な処理を組み合わせたもので実現しよう
という考え方を称して「短いコード」とか「長いコード」と言ってるわけですよ。
だからそういうコードならはじめに変数をまとめて宣言しておくことに
なんのデメリットもないし途中で宣言することにもメリットが無いってことです。
なかなか上手くまとめてくれたが、はてさて桃白白の頭で理解に及ぶだろうか?
743 :
桃白白:2013/01/26(土) 12:35:21.22
>>741 機能で関数をくくっていくと関数を分割しても見通しが悪くなるだけの
ときっていうのはあるわけっすよ。そういうときは変数を途中で宣言しちゃったら
いいじゃんっていうのが
>>722。関数を短くすればいいだろって言いたいだろうけど、
あっち見てこっち見てとさせるより一箇所に記述しちゃったほうがいいときもあるでしょってわけ。
関数を細分化してコードが短いから関数の最初でもいんだってのにも反対。
たとえばこう書いたとき関数はじゅうぶんに短いけど、fugaの値がおかしいという
例外に対処するときにfugaの宣言位置が使用されるところから離れていると
適切な位置の情報がなくなっちゃうわけ。Elseブロックの中で宣言されていれば
それより前のところで使われてたら記述ミスだって気づけるっしょ。
Function Hoge(arg1, arg2)
If arg1.Condition Then
Set Hoge = Fizz(value, arg2)
Else
Dim fuga
Set fuga = Buzz(arg1, arg2)
Set Hoge = Fizz(value, fuga)
End If
End Function
これは酷い
ここまでレベル低かったとはw
もうちょっと解ってる奴だと思ってたのに・・・
でも余計に可愛いかもw
>>743 俺だったらそういう時はfuga単体でファンクションプロシージャ作るよ
もうさ、変数は
dim hensuu() as variant
で宣言して、使うときに増やしてけばいいじゃん
それでいいじゃん
747 :
デフォルトの名無しさん:2013/01/26(土) 13:00:02.74
>>746 変数が管理できない上に動作も遅くてメモリも浪費する
良いことなんもない
748 :
桃白白:2013/01/26(土) 13:01:47.96
>>745 どう書くのよ?書いてみてよ。書いてごらんなさいよ。
書いて桃白白に教えてくれちゃったらいいじゃんよ。
>>747 どんな化石PC使ってるんだ
ってのと
じゃあエクセル使うなよ
っていう2つのツッコミを思いついた
PC性能なんて年々上がるんだから、エクセルで作る程度のシステムでメモリ気にするなんてほぼ無意味だし
動作なんてよっぽどじゃない限り考える必要ない
そもそも配列で動作重くなるって何よ
コードが複雑になるとかなら判るんだけど
メモリ上一括領域を確保するんだから、早くなるんじゃないの?
>>746 それに近いと思うんだけどさ
各基本型の変数は3つずつぐらい最初から用意しておいて欲しい
参照渡し用の一時変数を先頭に宣言しても見づらいだけ
あとメソッド細分化のデメリットは
あるメソッドの引数追加で呼び出し元が10個あって修正が大変な事がある
>>750 > 呼び出し元が10個
ってほど多用する処理なら、むしろ細分化せずに10カ所に
同じようなコード書いてる場合の方が修正大変だろw
細分化してあれば修正忘れがあってもエラー出るから分かるが
あちこちに点在させてると、修正忘れがあった場合に、
エラー出ずに想定外(修正前)の動作するからややこしいことこの上ない
もうちょっと深く考えてから書かないと恥かくだけだぞ
>>750 そういう時の為にユーザー定義型があるのだが。
2箇所から呼ばれてて呼び出し階層の上から下までで5個とかだったかな
まぁ何事も程々にね
メソッドは前提条件と役割(何をどこまでやるのか)をきっちり定義して作ってかないと
細分化は結果だから下手にやろうとすると俺みたいになっちゃうよ
初心者は無理にやる必要は無いが結論
自分以外が手をいれる環境でもやらない方がいい
>>752 それこそメンドクサイ
データ項目ならいいというか最初からそうするよ
制御用のなんたらフラグだったら?
FugaArgument型に作るの?
オーバーロードの無い言語であんまり無理しちゃダメだよ
>>754 別にフラグでも問題ないし。
プロシージャ用にユーザー定義するのも有りだと思う。
勿論そのプロシージャはきちんと機能別に分けられている必要があるけど。
この機能のパラメータという意味でのユーザー定義型だからデータ項目と何ら変わらない。
しかもパラメータが増えても引数が増えるわけではないしね。
普通に変数使うのが一番楽だっていうのにお前ら・・・
759 :
桃白白:2013/01/26(土) 14:50:12.75
>>758 その満載の突っ込みどころを披露しちゃいなよ。
できればコードという形が望ましいけれども、
それがめんどうなら文だけでもいいからさ。いっちゃいなユー。パイパイがそれ聞いちゃうからさ。
>>755-756 一人でそんな事してたら職場で浮いてしまう
>>755先輩のコードなんかすごいけど修正しずらいよな
なんて影で言われてないか?
パイなんとかって自分のこと名前で呼ぶんだねそういえば
極端な例を一つ思いついた
機能的に細分化してさ、3つの関数を順番に呼ぶ時
(例1)
intC = funcC(funcB(funcA(paramA), paramB), paramC)
(例2)
intA = funcA(paramA)
intB = funcB(intA, paramB)
intC = funcC(intB, paramC)
どっちの書き方が見やすいかな
引数がもっと多いと、結果を一時変数に入れた方が見た目はスッキリするよね
しかも、intAとintBはここで1回しか使わない
VBAじゃなくてワークシートで関数を書いてる時、入れ子の入れ子でわけわかんなくなってくることがよくある
763 :
桃白白:2013/01/26(土) 15:56:27.10
>>762 桃白白は2番だな。2番のほうがいかしてる。
1番は引数のどれとどれが対応するのかわかりづらいし
呼ばれる順番もぱっと見てわかりづらい。行数を減らすことは
できるけれど行数減ってもあまりうれしくない。
764 :
758:2013/01/26(土) 16:36:46.21
>>759 こんなふうに書くのがあっさりしてる。
直すところはもっとあるけど。
Function Hoge(arg1, arg2)
Dim fuga
Set fuga = arg2
If Not arg1.Condition Then
Set fuga = Buzz(arg1, arg2)
End If
Set Hoge = Fizz(value, fuga)
End Function
>>759 で、こっちがツッコミ。
サンプルコードだから、それなりに省略しているという背景は抜きにした話。
・引数が値渡しか参照渡しか明示されていないので、
引数を書き換えていいという意図があるのか単に記載漏れなのか判断できない。
ようは設計者の意図が伝わってこない。
・Hogeプロシージャの型が省略されているので何型で返してもいいという判断になる。
プロシージャのコール元で期待している型と違う型が返ってくる可能性が十分にある。
コール元でValiant型の変数で受けて型を特定して変更するのは面倒。
そもそもどんな型が返るのかわからない設計ってまともに設計できてるのか?
・valueの宣言が無い。
・fugaの値のチェックが無い。
fugaの値がおかしいかどうかこの時点で想定できるのならチェックが必要。
fugaの型がわからないからこその例外が発生しそう。
・Ifステートメントの後で処理が追加された場合、処理の修正が増える。
今回の場合は
Set Hoge = Fizz・・・
をIfステートメントの外に出す必要が出てくる。
>>765 > サンプルコードだから、それなりに省略しているという背景は抜きにした話。
そんな突込みして、楽しい?
>>765 その指摘はそれだけ見れば間違ってはないが
もはや議論の中心が何かを見失ってるとしか思えん
そろそろ別の場所でやってくれ
>>765 コンパイラさん?擬人化するなら幼女でお願いします
>>765 >・fugaの値のチェックが無い。
arg1, arg2 のチェックは要らんのか?
突っ込むならもっとちゃんと突っ込めよ…
>>605 おれ、今の会社辞める前に Ctrl + H で片っ端から変数を
Local_Variable_Integer_Temporary_Counter_Level001
系に書き直してから去ることにするわ。
有益な情報をありがとう。
772 :
765:2013/01/26(土) 17:54:40.39
>>771 そんなに悔しかったの?
つーか無職が「今の会社」って・・・w
>>773 誰と勘違いしてんの?
こんなスレあると知らんかったから興味深く読んで、
で、この発想おもしれーなと思ったから書き込んでみただけです。
性格の悪い先輩の洗礼を受けたということで、
大目に見てあげるよ。
カマ掛けに反応してくれてありがとう
(無)自宅警備をいよいよ辞めるんだな
感じわり〜
>>778 いや、771=774もだが、
それに粘着してるお前も感じ悪いよ
カマ掛けに反応してくれてありがとう(ドヤァ
無職(ドヤァ
絶対友達いない
普通無職がエクセルVBA使わないと思うんだがどうか
781 :
桃白白:2013/01/26(土) 19:35:27.55
>>479 処理直前にDimしてるぅ!プークスクス
まあ、読みやすいっちゃ読みやすい。
まんこにちんこ突っ込むと気持ちいい?
兄貴のケツ穴のほうが気持ちいい
786 :
デフォルトの名無しさん:2013/01/27(日) 14:39:13.30
ちんこにまんこ突っ込むほうが気持ちいい
尿道に綿棒突っ込むと気持ちいい
まんこはみんなのもの
誤ってスレを閉じていたらしくてスレの伸び具合に驚いている
最近のスレの出来事を三行でおなしゃす
>>789 別に
知らなくても
なんの影響もない雑談
変数は関数の先頭でまとめて宣言する派が多いけど、俺は必要になったその場で宣言する派。
これは、そう書ける言語ならいつでもそうする。
そうしない派も、
Dim var as Long = 100
とか、
Dim obj as Class1 = new Class1("abc")
とか書けるなら、必要なときに定義しようと思うんじゃ無いかな。
それ出来る言語も使ってるけど、そっちでも先頭宣言だな
逐一宣言の方が書いてる時は書きやすいから、使い捨てのVBSとかだと
プロシージャ分けもせず、先頭からズラズラ書いて必要な時に宣言したりもするけど
更新やメンテナンスしながら使うものだと、安直な書きやすさより
後々のメンテナンス性を考慮したいからなぁ
793 :
桃白白:2013/01/28(月) 12:41:32.00
>>792 関数の最初に変数を宣言することでえられる保守しやすい性質て具体的にどういうものなの?
桃白白はそんなものないと思ってるの。
まだそれが理解できるレベルに到達してないんだね
頑張れ桃白白!、負けるな桃白白!、闘え僕らの桃白白っ!!
795 :
桃白白:2013/01/28(月) 12:54:40.20
>>794 うん、桃白白はその境地にたっしてないけど、お前がそれを説明できるレベルにたっしてるのであれば
それを教えちゃってよ。桃白白にささやいてくれてよ。叫んでくれてもかまわない。桃白白のすてきな
形の耳で聞いちゃうからさ。いっちゃいなよ。聞いちゃうからさ。
パイパイ卑猥
>>792 > 逐一宣言の方が書いてる時は書きやすいから
先頭宣言方式は、書きやすいと言うこともなく、宣言と使用する場所が離れて読みやすいということもなく、
コードを数行追加するときに新たに変数が必要になったときなどに、離れた場所に追加しなくてはならず、
コードの一部分をリファクタリングするとき、変数を削除し忘れて「unused variable」になったりする。
さらに初心者は、長い大きな関数を書きがちで、関数先頭に10個20個の変数がずらずら並んでたりする。
逐一宣言方式のデメリットってなんかある?
そもそも、オブジェクト指向言語では、Newしない場合は宣言と定義が同一行となり、
メソッド先頭にまとめてやるなんてことができないはずだが。
なんか逐一宣言がいいって言ってるやつを見てると
昔の自分を見ているようで微笑ましい
奇怪語とバイナリだな
802 :
799:2013/01/28(月) 13:39:35.33
日本語
しょ、小学生だー!
なでしこっていいよね
ばいなら
806 :
桃白白:2013/01/28(月) 14:10:56.10
>>805 たぶん読んでない。読んだとしてもかんぜんに忘れてる。1ミリも覚えてない。
リンク先を読んでみるわ。
だから最初から言ってるじゃん
言い方を変えると、「途中で変数を宣言したくなる場所」ってのは、「そこでモジュールを分割すべき場所」なんだよって
>>807 途中で変数を宣言したくなる場所はどこかって話じゃ無くて、変数を宣言する場所をどこにするのが
良いのかって話なんだが。
810 :
565:2013/01/28(月) 15:07:07.41
判ればどこでもいい
トップに変数やコードの目次と説明書いて
変数宣言行を自動追加すりゃいいじゃん
じゃん
名前ミスった
タオパイじゃないからね
理解してないのか
815 :
692:2013/01/28(月) 15:43:53.34
喧々諤々のところ失礼します。692です。
皆様のアドバイスにより、対処できましたことを報告します。
ご助力ありがとうございました。
対処方法は、ご指摘にありましたとおり、アプリケーションキー(Shift+F10)をOnKeyでフックして、
そのフックされたプロシージャでは、メニュー項目を制御した後、ポップアップメニューを表示する手段を採りました。
○ThisWorkbook
Private Sub Workbook_Open()
Application.OnKey "+{F10}", "Module1.HogeHoge"
End Sub
○Module1
Public Sub HogeHoge()
'追加したポップアップメニュー項目を制御する処理
xxx
'ポップアップメニューを表示する
CommandBar.CommandBars("Cell").ShowPopup
End Sub
Private Sub Auto_Close()
Application.OnKey "+{F10}"
End Sub
いろいろとご助力いただき勉強になりました。ありがとうございました。
>>814 ほのめかしだけじゃ会話は続かないよ。
何を理解していないといいたいの?
関数の先頭で、まとめて変数宣言したいが為に、する必要も無い関数分割をするのは本末転倒
とんちネタのつもりで言ってるの?
まさか本気じゃないよね?
>>797 たとえばコードを追加すような場合
新しい変数を宣言して使いたいときに、そのプロシジャ全てをチェックする必要がある
宣言をまとめておけば、そこをチェックするだけでその変数が使われてるかどうか解る
とりあえずより狭いスコープで変数が定義できる別の言語の話と一緒にはするな
変数のスコープが見通せるような範囲で納められるなら、その場で宣言で良いさ
むせる
さよならは
822 :
デフォルトの名無しさん:2013/01/29(火) 00:08:04.45
>>819 まあそこまで大きなプロシージャを作らないこったな
理想論ではあるが
桃白白は童貞の無職
Dim D: Set D = CreateObject("Scripting.Dictionary")
みたいな涙ぐましい書き方する人おらんのー?
とりあえず無職とか童貞とか言ってる奴、人間としてどうよ。
例えば職場の人に、自分の書き込みばれたとこ想像してみ?
え?あの人が?!って驚かれるの?
それとも、あーやっぱりwwwってなるの?w
もうそんな低レベルな煽りをする年齢でもないだろ。
お前と同じ年で子どもいる奴だっているのに。
その性格悪そうな嫌味ったらしい書き込みの方が、リアルでバレたらどん引きされる件について
>>819 VBA以外で使ってる言語と、その言語で関数/メソッド先頭に固めて変数宣言/定義してるか教えてくれ。
最近の言語であれば、大抵の人は変数を逐次宣言/定義する派だと思うが、宣言をまとめたいとは思ってないと思うよ。
> とりあえずより狭いスコープで変数が定義できる別の言語の話と一緒にはするな
何と何を一緒にするなと?
より狭いスコープで変数が定義できる別の言語って何?
変数を先頭にまとめようとして行が増えすぎて、
Dim i, j as Long
とかやっちゃう人
???
先頭に移動しても行は増えないだろ?
コピーじゃなくて移動なんだからさ
あ、悔し紛れのネガキャンかw
ide によって利便性や可視化、メンテ効率まったく異なるからなあ
>>833 変数宣言行が増えるってことだよ
で、10行20行と増えちゃって、
>>832みたいにやっちゃう初心者が出てくる
2つの変数を1行にまとめるのと、宣言を先頭にまとめるのは全然関係ないじゃん
なんで無関係の話を持ってきてややこしくするの
頭が悪いかネガキャンかのどちらかだろ
838 :
桃白白:2013/01/29(火) 12:49:45.25
>>832 Option Strictがあればいんだけどな。
Javaとかだとint i, jでどっちもintになるから
じゃあi, j As IntegerでどっちもIntegerにしてくれても
いいじゃんと思っちゃう。
C99で変数宣言がブロック途中でもOKになったのは、そういう要求があったから。
最初からブロック途中で変数宣言OKなVBAなのに、その機能を使わないのはもったいない。
>>831 俺もVBAとJavaScript以外はその場宣言する方が多い
他の言語ってのはたとえばVB.Net 例をあげると
If 条件1 Then
Dim hoge As Integer
hoge = func1()
End If
'
'ここに上下見通せないぐらいのコード
'
If 条件2 Then
Dim hoge As Integer
hoge = func2()
End If
VB.NetではOKだけどVBAではNGな例
他人のプログラム修正で下のIfのとこ追加したことを考えてくれ
ぶっちゃけ最初から最後まで一人で保守するならどっちでもいい
そうじゃないならVBAなら後から見る人のためにも宣言はまとめとけと思うのさ
>>838 Option Strictあっても、ObjectにInteger代入ではエラーにならなかったような
そう言うやつが多いから今のVB.NetではそれでどっちもIntegerになるようになった
>>840 宣言が重複したらすぐにエラーになるから、
If 条件2 Then
Dim fuga As Integer
fuga = func2()
End If
って書き換えればいいよ。
> そうじゃないならVBAなら後から見る人のためにも宣言はまとめとけと思うのさ
後から見る人のために、宣言と使用箇所の距離を短く、変数の有効範囲を狭くしましょうというのが、
Code Completeなんかで説明されてること。
一行宣言ってバグ起きるからやりたくないんだが
タナカでも頻繁にやってた気がするけど
Dim l,m as long って宣言したら
mはlongだけどlはvariantになる
俺の環境だけか?
>>843 lもlongのつもりで使えばバグは起きないよ
変数宣言の意味がないなそれ
エクセルじゃまずやらんけど、メモリアドレス直接弄ったりダンプしたりするとき、変数の型データが違うと全部ずれることがある
バグ起きないんじゃなくて、想定しなきゃいけないエラー原因無視してるだけだからなー
>>846 代入も評価もlongの文脈で使えばバグは起きないよ
暗黙の型変換を期待するコードを書くとバグるかもしれないけど
Cだと、スコープを狭めるために無名ブロックとかdo while(0)とかのバッドノウハウがはやったりもしたよなぁ
>>832 もしかしてこれiはlongにならないの…?
>>843 当たり前の話だが...
Dimは「変数を宣言する」事を宣言するステートメントだ
その変数がなんなのかを宣言しているのは「as」の後ろだぞ
君の言う「Dim l, m as long」は「Dim m as long, l」と等しいんだぞ
つまり、「mはlongである」と宣言しているが、「lは変数である」としか宣言されていない
>>850 全てわかった上で「当たり前の話」とか言われても・・・
いや、でも気にしたこと無かったわ
言われてみればそうだな
>>840 > 俺もVBAとJavaScript以外はその場宣言する方が多い
VBAとJavascript以外の言語では、何のためにその場宣言をするの?
>>851 「当たり前の話」を「当たり前として放置」しているから、「当たり前の話」をしたんだけどな
VBAで型が書いてない変数はVariant型になる
両方ともIntegerにしたいなら
Dim i As Integer, j As Integer
のように全部の変数に型を指定しなきゃいけない
DimとAsの間を全部As以降の型として宣言できる、という言語仕様でもよかったよね
つまり、何が当たり前かなんかどうでもいいこと
>>856 それはどうかな?
VB系の場合は、変数をVariant型で利用するのが「当たり前」なんだと思うよ
どうしても「as」が必要な場面って、関数の引数だけじゃないかな?
>>856 なんでそうしなかったんだろうねぇ
Dim i, j, k As Integer
で、iもjもkもIntegerで宣言されるってのが「普通じゃない」と思う人多数ってことなのか
>>857 > VB系の場合は、変数をVariant型で利用するのが「当たり前」なんだと思うよ
じゃ、Option Explicitなしでいいんじゃね?
>>857 > どうしても「as」が必要な場面って、関数の引数だけじゃないかな?
仮引数を型付きで定義するんなら、実引数側も型を明示した方が良いという思考にはならないかな。
vbsからの流れを見るに858なんだろうな
無しで良かったから、追加機能としてつけられたんであろう859
Code CompleteではVariant推奨だったが、その点だけは同意できなかったよ。
>>859 何を言っているのか理解が出来ない...
Option Explicitは、「変数を利用する場合に、変数の宣言を強制する」ステートメントであって、「宣言する変数に型を強制する」ステートメントでは無いぞ
>>857 そして、システムハンガリアンの登場ですね
>>844 なんてコードみみせてんだ、きたねえw
機能を分離して関数として分別しとけよ。
>>896 単なるVBはそうかもしれんが、VBAじゃ型明示&アーリーバインド推奨
>>867 dim w as worksheet
dim r as range
ってやらずに、
dim w as object
dim r as object
とか
dim w as variant
dim r as variant
とか
dim w
dim r
とかやってんの?
なんたる苦行
>>868 型を宣言しても、宣言しなくても、setしなきゃ使えないんじゃないの?
>>869 もちろんsetするけど、それと型明示と何か関係が?
>>870 質問の意味がわからん
>>868は、
Dim w, r
と宣言するのは
Dim w as worksheet, r as range
と宣言するよりも苦行だと言うから
結局、setするなら、どっちも一緒だろって言いたいのだが
>>871 あれ?あなた
>>857なんじゃないの?
> VB系の場合は、変数をVariant型で利用するのが「当たり前」なんだと思うよ
っていうから、じゃworksheetとかrangeの場合も変数宣言時に型明示しないの?それって苦行だよねってことなんだけど。
>>872 だから、変数宣言時に型を宣言しても、なんも意味無いじゃん
>>873 VBAでプログラミングしたことほとんどないんでしょ?
白状しちゃいなよ。
>>874 まっ、基本的にVBScriptしか使わないけどな
取りあえず、俺にわかるように、型宣言する意味を教えてちょーだい
とりあえず、グローバルで変数使うとか馬鹿な事は言うなよ...
>>842 「宣言と使用箇所の距離」じゃなくて「初期化と使用箇所の距離」でしょ。
宣言は初期化じゃないw
>>877 君は、説明も出来ないのに「明示的に型を宣言すべき」と言うのかい?
>>875 > 取りあえず、俺にわかるように、型宣言する意味を教えてちょーだい
・型違いに起因するバグを減らせる
・読み手に与える情報を増やせる
・インテリセンス
>>876 宣言も近い方が良いって書かれてるよ。
>>805のリンク先読んで。
>>879 ・無駄に大きな関数を作らない限り、型の違いによるバグは起きない
・判りやすい変数名をつけるだけで対応可能
結局、問題点はインテリセンスが効かないだけじゃん
>>880 > ・無駄に大きな関数を作らない限り、型の違いによるバグは起きない
> ・判りやすい変数名をつけるだけで対応可能
だったら、Option Explicitもいらないよね。
>>881 馬鹿じゃね?
Option Explicitは要るだろw
>842
すぐって、少なくとも実行もしくはコンパイルするまではエラーにならないけど
書き換えたfugaもどっかで使ってたらまたエラーになるわけで
実行するまでエラーかどうかわからんようなコーディングするのかお前は
>変数の有効範囲を狭く
VBAではこれができないから言ってんだよ
VBAの変数はプロシジャ内のどこで宣言されようがそのプロシジャ全体のスコープ
VB.Netの例のようにIfブロック内でスコープ閉じるならそこで宣言すればいい
>>880 VBAのベストプラクティス/Good Partsをどうしようかって話だから、個人の資質で防げることを超えた物を考えようよ。
> Dim w as worksheet
このwの活性範囲が十分に狭いなら、w一文字でもいいよね。
わざわざDim myWorkSheetとかしなくてもいい。
無駄に大きな関数を作らないのも、わかりやすい変数名にするのもGood Partsだけど、それに加えて
変数宣言時に型を明示しましょうというのもGood Partsだよねという話。
型明示するだけでさまざまなメリットを享受できるのに、なんで型明示したくないの?
880
あのさあ
エラー起きないように努力するのとは当然だし
エラー起きたときの復旧、メンテ労力下げるように用意するのも当たり前
見えない、見ない、見なかったことにしてるだけじゃん
バグとエラー使い分けられないの見ても判るよ
見えなきゃ不具合は存在しないとでも思ってるんじゃないか
>>883 > >変数の有効範囲を狭く
> VBAではこれができないから言ってんだよ
> VBAの変数はプロシジャ内のどこで宣言されようがそのプロシジャ全体のスコープ
何かの言語とごっちゃになってるよ。
VBAでは、変数宣言するまでは、同一スコープではその変数は使えないよ。
ぷ……Public
今VB6でも確かめたけど、VB6も変数を宣言するまでは、その変数は使えない。
>>884 ふぅ、Dimのみで見れば
Dim w as worksheet
と
Dim w
では違うように見えるが...
結局は、setでワークシートオブジェクトを関連付けなければならないのだから、活性範囲が十分に狭いという条件では、明示的に型を宣言しようがしまいがどちらも同じだろ
メリットとしてあるのは、インテリセンスが効くか効かないかだけ
その唯一残ったメリットも、COM経由でEXCELを利用する時には意味はなくなるし
>>889 いろいろごっちゃにしないでくれるかな。
> 活性範囲が十分に狭いという条件では、明示的に型を宣言しようがしまいがどちらも同じだろ
活性範囲が十分に狭ければ、通常はお勧めできない一文字変数でも良い場合もあるということ。
setを使うかどうかは関係無い。
> メリットとしてあるのは、インテリセンスが効くか効かないかだけ
・型違いに起因するバグを減らせる
・読み手に与える情報を増やせる
は無視ですか。
> その唯一残ったメリットも、COM経由でEXCELを利用する時には意味はなくなるし
まぁ、Excel使い以外はどうでもいいことでしょうね。
>>885 メンテw
関数やサブルーチンの引数には、型宣言は必要だと言ってるのですがw
ところで、
>>805のリンク先のCode Completeの内容にも全然共感できないということなの?
>>886 それは変数の寿命の問題
(変数名の)有効範囲の問題じゃない
> VBAではこれができないから言ってんだよ
あー、これはやっちゃいましたね。
ド素人丸出しw
>>893 Public Sub Foo()
Dim w as worksheet
(・・・十行・・・)
dim r as range
(・・・十行・・・)
End Sub
このrの有効範囲は、下十行に限定される。
関数先頭で宣言するより、必要になった場所で宣言しましょうってことだよ。
>>895 >このrの有効範囲は、下十行に限定される。
されない。dim rより上でもrを宣言できない=下のdimと同一スコープ内だから2重宣言
限定するようにプログラミングするべきではあるが、言語仕様として限定されない
変数を使用する直前で宣言して、使用したあとすぐにスコープから外れるんなら
変数の宣言を直前にやってもいいと思う。
ただし、使用後に処理が続く場合は意味ないんだけどw
>>842のようにIfステートメント内で変数宣言してもIfステートメント抜けてもfugaは使えるわけで。
誰かがメンテナンスの時にその変数使ってしまうことも考えられるわけで。
使用する直前に初期化するのは理解できるけど、使用する直前に宣言するメリットがわからない。
>>897 > 使用する直前に初期化するのは理解できるけど、使用する直前に宣言するメリットがわからない。
宣言と初期化を同一行で書ける言語(定義できる言語)はそうした方がいいし、
できない場合でも、宣言はできるだけ使用する直前でやった方が良い。
・・・というのがCode Completeや
>>898のリンク先で書かれてること。
>>890 型違いに起因するバグが何故起きるのかの説明が必要だな
次に、変数が何をするものなのかは、変数の初期化によって明らかにするべきであって、変数の宣言で行う事ではない
VB系の言語の場合、変数の型宣言は型宣言が必要な場合にのみ行うように作られているってのを忘れてはならない
だから、それらの考え方の基本はなるべくスコープを狭く、だ
たとえばそこには、変数はループの内側に入れること って言うのがある
これはループ内で宣言した変数がループ内のみでしか使えないって前提なんだよ
だがVBAではどこで宣言しようが、そのプロシジャ全てでその名前が有効になるんだよ
(使えるのは宣言より後ろだとしても)
つまりループの後でループ内宣言の変数を使える
それではループ内で宣言する意義がうすいんだよ
>>900 > 次に、変数が何をするものなのかは、変数の初期化によって明らかにするべきであって、変数の宣言で行う事ではない
型を明示すれば、何をするかはわからずとも、何を扱うかは明確になるよね。
> VB系の言語の場合、変数の型宣言は型宣言が必要な場合にのみ行うように作られているってのを忘れてはならない
Option Explicitなしでもいいけど、Option Explicitで変数宣言を強制して、なおかつ型を明示するのが
ベストプラクティスだよって話なんだが。
で、なんで型を明示したくないの?
>>901 > (使えるのは宣言より後ろだとしても)
それが重要なんだけど。
declarationするまでは、その変数は使いませんというプログラマの意図の明示。
二重定義に関しては、C99でも同じだよ。
同一スコープでは二重定義できないけど、やっぱり宣言(定義)以降じゃ無いと使えないのはVBAと同じ。
そういう制限があるから、K&Rみたく関数の先頭で全部宣言しましょうとはならない。
というか、そうしたくないからC99でスコープの途中で宣言できるようになった。
>>903 そんな話初めて聞いたしw
完全に後出し。
いい加減にしろ。
>>904 Option Explicit書かなかったら使えるでしょ。
途中でバグる可能性あるけどw
なんか議論にもなってないんだけど
変数の宣言
dim 変数
変数の型宣言
変数 as 型
一行での変数の宣言および型宣言
dim 変数 as 型
で,変数の宣言は明示すべきだ!って人と,変数の型宣言は明示すべきだ!ってのがごっちゃになってる人いないか?
>>888 いまさら突っ込むけど,変数宣言の強制が初期設定で行われるのはdotNetからな
VBもVBAも自分で変数宣言強制オプション指定する必要がある
・・・確かそんな気がした
>>891 ・・・ごめん,君がなに言ってるのかちょっとわかんない
いや,
>>891自体は理解できるんだけど,なんで
>>891のレスになってるのかが理解できない
会話はキャッチボールしようぜ,なんで一人でゴルフしてんだよ,連続性がないww
>>905 > そんな話初めて聞いたしw
> 完全に後出し。
>>805のリンク先を読んで貰えればわかると思ったんだが、わかってなかったんならそれはすまない。
さて、それがわかったところで、変数宣言は使用箇所の直前でやったほうが良いということには賛成?反対?
>>904 C99のスコープはプロシジャ単位ですか?
ブロック中で宣言された変数はブロックを抜けたあとでも有効ですか?
ブロック内でスコープ閉じる言語なら先頭でまとめて宣言しろなんて言わんわ
>>907 > いまさら突っ込むけど,変数宣言の強制が初期設定で行われるのはdotNetからな
> VBもVBAも自分で変数宣言強制オプション指定する必要がある
> ・・・確かそんな気がした
これも明確にしてなかったけど、Option Explicitは当然としての話ね。
変数宣言が強制されるとして、さて、変数宣言はどこで行うのがいいのかねって話。
・・・で
誰がパイパイで誰がパイパンなの?
いい加減自演くさい
残念。ここまで俺の自演
>>909 > C99のスコープはプロシジャ単位ですか?
C99の話は、変数宣言箇所以前でも、同一スコープ内では同名の変数は宣言できないよってことの例。
> ブロック内でスコープ閉じる言語なら先頭でまとめて宣言しろなんて言わんわ
>>895のコードは、Sub内がすべて同一スコープだけど、それでもrはあの位置で行いましょうねってこと。
変数の宣言と、型の宣言が区別できず
スコープの意味が判ってない奴が、大声で喚き散らしているからどうにもならん
・変数の宣言は必要だが、型の宣言は必ずしも必要ではない
・VB系の言語でスコープを使い分けたい場合は、一々関数かサブルーチンとして別ける必要がある
> ・変数の宣言は必要だが、型の宣言は必ずしも必要ではない
それはその通りだが、型を明示した方がいいよって話を延々としてるんですが。
型を明示することに大いなるデメリットがあるなら「それはするな」と言うし。
>>914 > ・VB系の言語でスコープを使い分けたい場合は、一々関数かサブルーチンとして別ける必要がある
スコープを使い分ける話をしたいわけではなく、同一スコープ内のどこでも変数を宣言できるVBAでは
(正確には、使用する前までだが)、どこで宣言しましょうねって話だよ。
>>915 そこを論点にしてるのはお前だけだ
型を明示しない方が良いって言ってるやつは多分一人だけだ
大多数は変数の宣言と宣言時の型指定については納得してる
論点は宣言(と初期化)のタイミング
まあ、ほとんど宗教論。コーディングスタイルの違い
>>840のIf 条件2ブロックが、その外側と別スコープにならないのはその通り。
だからといって、じゃあ変数は関数の先頭でまとめてやるのが良いかというと、それは別の話だよね。
>>917 > そこを論点にしてるのはお前だけだ
> 型を明示しない方が良いって言ってるやつは多分一人だけだ
> 大多数は変数の宣言と宣言時の型指定については納得してる
あ、そうなの?
複数人を相手してるのに気づかなかったよ。
> 論点は宣言(と初期化)のタイミング
> まあ、ほとんど宗教論。コーディングスタイルの違い
俺の意見は、宗教論ではなく明確な理由でよりよい方というのが選択できるというもの。
それはCode Completeなんかで詳しく説明されてる。
わかったわかった,俺がまとめてやるよ
・うんこするのだけが必要で他はまったくいらない派
うんこするのと,うんこした後紙で拭くことを区別できないやついるよな
うんこは必要だけど,うんこした後紙で拭くのは必ずしも必要ないだろjk
・うんこするのは当然必要だけど,おしり拭いたほうがいいよ派
うんこが必要なのはそうだけど,うんこした後紙で拭いたほうがいいよ
紙で拭いたら死ぬとかならしょうがないけどさ
・うんこするのは当然必要だけど,おしりのことも考えてやれよ派
うんこした後ふくのはいいんだけどさ,紙でふくんじゃなくて,ウォッシュレット使ってから紙で拭けばいいんじゃね?
二度手間になるけど清潔じゃん!
・うんこしないよ派
うんこするって冒頭で宣言しなけりゃいいじゃん
よし。俺の指針
変数はスコープの最初で宣言する
だたし、スコープが充分狭い場合は使用(初期化)する直前でもよい
初期化は使用する直前に行う
異論は認める
>>898のリンク先の説明を引用すると
(以下のこのスタイルというのは、K&Rで関数先頭に固めて変数定義する方法)
> その一方、このスタイルにはいくつものマイナス面があります。まず、変数の宣言と変数の使用が
> 切り離されるため、コードを追うのが少し大変になります。さらに、1 つのローカル変数が、おそらく
> 無意識に異なる用途で再利用される可能性がかなり高くなります。この場合、変数にそのまま値が
> 残され、その値がコードの期待していた値でなければ、予期せぬバグが発生してしまいます。この
> ような変数の再利用と、C での短く不可解な変数名という傾向を併せて考えれば、大惨事の原因と
>なることは明白です。
>
> Java 言語では (そして C の最近のバージョンでも)、変数は最初にそれを使用する箇所、あるいは
> その近くで宣言することができます。この宣言方法を実践して Java コードを作成すれば、コードは
> より安全になり、バグが発生しにくくなり、そして読みやすくなります。
というのに完全に同意できるんだよね。
Code Completeでも同じようなことが書かれてるんだけど、これに同意できない人が何故同意できないのか
その理由が知りたいんだよ。
>>921 スコープが長い時の方が使用する直前で宣言するメリットがでかいだろ
>>923 ここはム板でかつ「Excel」VBAスレだから
マ板いけ
だから、ブロックスコープ可能な言語とそうじゃない言語をいっしょくたにされてもなぁ
むせる
逃げたw
>>923 >Java 言語では (そして C の最近のバージョンでも)、
VBAはJava言語でも最新のCでもないから
>変数は最初にそれを使用する箇所、あるいは
> その近くで宣言することができます。
には該当しないのですね。わかりました
こんな本職プログラマがうろついているようなスレに居られるか!
俺は一人でマ板に帰るぞ!
Dim i
For i = 0 to 10
'何かの処理1
Next
Dim i
For i = 0 to 10
'何かの処理2
Next
これが通るかどうかを考えれば、変数の宣言位置は決まるだろ?
934 :
デフォルトの名無しさん:2013/01/29(火) 20:14:53.71
9時から5時までの間に書き込んでいる連中は無職
ここは無職のたまり場
935 :
桃白白:2013/01/29(火) 20:18:38.92
938 :
デフォルトの名無しさん:2013/01/29(火) 20:32:29.91
>>935 gdgdになってるようだけど結局どうなのよ?
940 :
デフォルトの名無しさん:2013/01/29(火) 20:51:56.84
カマでかけるとか嫌アッらしい・・・
ニートの俺は逆に9時5時には書かないけどな
このスレは
まるで不毛な
会議室
そろそろ次スレ
建てていいかも
デバッグコンソールの召還!!
Ctrl + g !!
チュウィンッッ
Dim CountA As Interger: Dim CountB As Integer: Dim CountC As Integer
Dim WorkS As String: Dim WorkV As Variant: Dim WorkO As Object
946 :
デフォルトの名無しさん:2013/01/30(水) 00:01:43.82
職場でVBAを使いまくってたら
Excelがものすごく重くなるんですけど
これの原因と対策はなんでしょうか?
もちろん朝AM9に来てすぐにExcelは起動し、ずっと帰宅のPM6までExcelは起動しっぱなしです。
>>946 原因は不明
対策はモニターを叩き割る
モニターを地面に叩き付けて踏み付けて
応援してる
VBEはインデントを勝手に詰めるのが嫌
>>945みたいにスペースを空けて揃えることができない
949 :
桃白白:2013/01/30(水) 04:15:54.92
>>946 VBAで変なことやってんじゃないの?まじめに仕事しろ。
You、メモリを解き放っちゃえよ(と言ってみたいだけ
Application.MemoryTotalでちろちろ確認してみなよ
エンジニアなら原因を一つ一つ検討して潰すことを面倒がるな
足りないのがメモリかCPUかはっきりさせること。
メモリが足りないならExcelが使える分を増やし、
CPUのパワーが足りないなら(あまり考えられない)上司にねだれ。
ワークシートのつくりを軽くすること、データをメモリ上で処理して
余計な操作や無駄なループをなくすこと。
自分のPCでどれだけのワークブックなら重くなるか
いっぺん実験してみればいいじゃん。
一枚目のシートにVBAで65536×256(2003までの場合)データを
ランダムに入れ、二枚目以降でデータをif文で評価する数式を敷き詰める。
シートの枚数増やすたびに再計算して、かかった時間をDebug.Print。
わざわざ型を宣言するってどんだけショボいプログラムだよ
もう少し勉強してからにしろよ
いつまでやってんだ
C#でcomつくってやるのと比較してどうなんでしょ。
素人さんに使ってもらう為に配布するにはかんたんだけどなあ。
>>953 終ってるどころか始まりもしなかったものに、いつまで固執してるんだ?w
ちんことまんこのドッキング
ちんことかまんことか言ってる奴って馬鹿なの?
だったら俺のまんこにドッキングしてみろよ
959 :
デフォルトの名無しさん:2013/01/31(木) 09:14:16.71
エクセルVBA初心者なので教えて下さい。
例えば10月15日を基準にして、10月1日〜15日で有給を1日消化、10月16日〜30日
までに有給を1日消化したと仮定した場合、
15日までの1日を10から引き、16日からの1日を4から引きたい場合、
どういうプログラムにしたらいいでしょうか。
何分初心者なので、宜しくお願い致します。
>>959 a = (10 - 1) + (4 - 1)
パイパンは日本語も得意だろ。
併せて教えてやれよ。
前半と後半で変数別に用意すりゃいい
日付が15以前なら前半から、それより後なら後半から
減算すれば
後で使うんだったら月ごとにデータ貯めて、最後に計算すりゃいい
>>959 プログラムってのはお前のやりたい事をコンピュータ向けの言語で書くことなんだが
お前のやりたいことはお前にしかわからないから、せめてやりたい事ぐらい伝わるように書け
お前が上げた日付や数字はどっからもってきて、最終的にどういう結果をどう出力したいんだ?
>>965 そもそも質問になっていない。
ただのつぶやきレベル。
比較してどうなんでしょって言うけど
何をどういう観点で比較したいの?
それは自分で比較できないことなの?
人としてもっとまともな会話をしようよ。
ガーン
>>966 ゆとり丸出しだな
何をどうやって比較しろと言われないと、何もできないのか
>>966はわかってないから評価も比較もできないんだよw
かんべんしてやってくれ(笑)
話題が無いんだ
かんべんしてやってくれ(笑)
>>971 そりゃそうだろ
C#でcom作ってどうたらという話が
VBAと何の関係があるのか、俺にはさっぱりわからん。
お前にはわかるのか?だったら答えてやれよ。
俺はわからん。お前もわからんよな?わからなくて当然だよな?
承認してくれ
承認してくれ
承認してくれ
承認してくれ
承認してくれ
>>975 C#でCOMを作ってVBAを拡張するのと、Excel-DNAを使ってコードを作るのとでは、いろんな面でどうなんでしょうねってことでしょ。
いろんな面というのは、開発効率とか、ユーザの利便性とか、メンテナンス性とか、将来性とか、セキュリティ面とか、いくらでもある。
その中で何かを語りたいなら語ればいいじゃんってことでしょ。
俺は興味無いけど。
ああ、あとはパフォーマンス的にどうなよのってのもあるわな。
あ、ちなみに俺はC++でDLLを作る派なんで。
>>983 ということにしたいんですね。
うざいわ、お前。
なんでcom作るん?
986 :
桃白白:2013/01/31(木) 16:29:35.22
うめ
>>985 com作るはcom使うの間違いじゃないかと思うんだが
>>980 俺の解釈ではC#でCOM経由でEXCELを拡張するのと、VBAでEXCELを拡張するのと
比較してどうだろう、って話じゃないかと
俺も興味ないけど
ちょっとややこしいことするなら、C# の方がライブラリが色々揃ってて樂なんだけど、
COM 使うには using とかでちゃんと解放 (Dispose) しないとはまるから、意外と気を使う。
なので、ちょっとした用途なら Excel VBA のほうが樂。
ていうか、Visual C# for Application 作ってくれよ… > MS
逆にC#でCOM作ってVBAから呼ぶとかもあるよ
>>993 以前、プリンタポートを汎用ポートとして使用できるDLLがトランジスタ技術の付録で付いてきていて、
VBAからそのDLLをコールして測定システムを組んだことがある。
実験結果の記録もVBAで出来るからかなり効率よく仕事ができた。
プリンタポートは衰退しました
プリンタポートなんてない。パラレルポートだ
セントロニクス、IEEE1284
セントロ