1 :
デフォルトの名無しさん :
2013/01/31(木) 13:45:36.82 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 質問スレ Part27
http://toro.2ch.net/test/read.cgi/tech/1353842387/
パイパンは前スレの変数定義の場所についてちゃんと答えようねw
桃白白は童貞
>>1 乙
白桃は★5を100回熟読するまでレスしちゃ駄目ね
9 :
デフォルトの名無しさん :2013/02/02(土) 09:01:42.69
ここにいる連中は無職なので、 このスレを読んだら無職菌が感染します。
まんこ大好き
>>1 糞スレ立ててんじゃねえよ カス
まんこぺろぺろ
おまんまんぺろぺろ
無職はフーゾク行けないね
omanko
For Each c In Range(Cells(1, 2), Cells(40, r)) If c = 10 Or 15 Then c.Interior.ColorIndex = 46 Next c これだとすべてのセルに色がついてしまうのですが 10か15なら色をつけるにはどうしたらいいですか
If c = 10 Or c = 15 Then c.Interior.ColorIndex = 46
ありがとうございます!
Windows Media Playerを起動させて動画を再生したいです。 strKeyWordに動画のフルパスを格納しています。 Shell ("C:\Program Files\Windows Media Player\wmplayer.exe & strKeyWord") でやるとMedia Playerは起動するが再生されません Shell ("C:\Program Files\Windows Media Player\wmplayer.exe/play & strKeyWord") でやると”実行時エラー 53" ファイルが見つかりません。になります。 どうしたらMedia PLayerの起動と同時に再生がはじまりますか?
>>20 mediaplayerとか全然しらんけど、最低でも
Shell ("C:\Program Files\Windows Media Player\wmplayer.exe /play " & strKeyWord)
とすることが必要だと思われる。
ひょっとしたら
Shell ("C:\Program Files\Windows Media Player\wmplayer.exe /play """ & strKeyWord & """")
とする必要があるかもしれない。
>>21 即レスありがとうございます。
どちらでも行けました。
23 :
デフォルトの名無しさん :2013/02/09(土) 06:27:11.90
いわゆるUsedRangeの長方形内で まったく値の入っていない行や列があれば そのEntireColumnやEntireRowをきれいさっぱり削除したいんですが 強引にやればコードは書けそうですが 一番キレいで清らかな美しいコードはどうなりますか?
パイパイン臭がする。
>>23 実行結果上問題なければ、あとの自己満足の上での最適化は自分でやれ
26 :
デフォルトの名無しさん :2013/02/09(土) 16:00:25.05
すみません、質問させてください。 今オートフィルのマクロを作ろうとしています。下コード Cells(1, 4).AutoFill Range(Cells(1, 4), Cells(50, 4)), xlFillSeries Cells(1, 5).AutoFill Range(Cells(1, 5), Cells(50, 5)), xlFillSeries Cells(1, 6).AutoFill Range(Cells(1, 6), Cells(50, 6)), xlFillSeries これをもっと簡潔にできる方法とかありますでしょうか。
>>26 for next で調べてみてくれや。
for j = 1 to 3
Cells(1, 3+j).AutoFill Range(Cells(1, 3+j), Cells(50, 3+j)), xlFillSeries
next
こんな感じでいいんじゃないかな?
半年ぶりVBAだから少し不安。素人です。
繰り返しの処理で for が盲点だったのか
プログラム的にはforで回せってのは間違ってないと思うが Range(Cells(1, 4), Cells(1, 6)).AutoFill Range(Cells(1, 4), Cells(50, 6)), xlFillSeries じゃダメなのかと
>>30 forは多様しているのにも関わらずです、、、
>>31-32 そうゆう形のを期待してました!
アドバイス有難うございます。
と思いきや、よく見たらそれは試していましたorz
実際は数字の50のところに変数を入れていて、
>>31 のだと50の所に変数を入れているのが原因らしく、エラーが出てしまいました。
分かりづらい質問の仕方ですみません。しばらくはforで代用しておくことにします。
>>34 変数かどうかは関係ない
可能性としては、その変数に0とかマイナスとか使えない数字が入ってる
36 :
ななし :2013/02/10(日) 02:49:08.50
>>34 col_start = 4
col_end = 6
row_start = 1
row_end = 50
Range(Cells(row_start, col_start), Cells(row_start, col_end)).AutoFill Range(Cells(row_start, col_start), Cells(row_end, col_end)), xlFillSeries
何の問題もない
37 :
23 :2013/02/10(日) 13:11:16.30
>>25 いえ自分ではまだコードは完成してなんです。
どなたか、いわゆるUsedRangeの長方形内で
まったく値の入っていない行や列があれば
そのEntireColumnやEntireRowをきれいさっぱり削除したいんですが
強引にやればコードは書けそうですが
一番キレいで清らかな美しいコードはどうなりますか?
38 :
デフォルトの名無しさん :2013/02/10(日) 13:43:29.92
>>34 r = "D1:F1"
n = 50
Range(r).AutoFill Range(r).Resize(n), xlFillSeries
>>37 まずはその強引なコードを作って見せてよ
一番きれいなコードは書けないけど
素人の書いた汚いコードの批判なら俺にも出来るからさwww
>>37 まずは「美しい」の定義を文章で書け
話はそれからだ
どんなプログラムを見せても批判するつもりなんだろうな
インデントの付け方が美しい、でもええんか? 文字の色が美しい、でもええんか?VBEでは文字色は変更できんけど
文字色変更できなかった? 変数は青とか種別ごとだけど
44 :
23 :2013/02/10(日) 15:04:05.17
わたしの強引なコード言葉で説明しましょう。 UsedRangeのRow x Columnを そのまま二次元配列にします。 その値は、セルに入ってる値の文字の長さ(Len関数)です。 そして各列、各行をうしろから見ていき その各列または各行の配列変数の絶対値の値が0ならばすべて空欄と判断し その行または列を削除します。
45 :
23 :2013/02/10(日) 15:04:41.76
誤 絶対値の値 正 絶対値の和
46 :
桃白白 :2013/02/10(日) 15:37:55.62
47 :
23 :2013/02/10(日) 15:43:28.62
>>46 カンニングする時点でキミは0点だ。
さらにそのコードは長すぎる。
長すぎるよ。
5行くらいか、あるいは長くても10行くらいで。
別にツウぶらなくてもいいんだよ。
さあやりなおし。
48 :
デフォルトの名無しさん :2013/02/10(日) 15:47:17.23
VBAでこんなことできませんか? まず普通のシートのある範囲を選択していてコピーしている状態。 それでフィルターがかかってる別シートのある1つのセルがActiveになってる ここでマクロ実行。 そしたら、普通のシートのコピーした範囲が、フィルターがかかったシートへ、値がコピペされるの。 もちろんコピペは非表示セルは無視するの。 これ通常の操作でコピペすると、Excelに慣れた人は「ああ、あのやっかいなやつか」とピンとくると思うけど、非表示セルに対してコピペされてしまう。
49 :
桃白白 :2013/02/10(日) 16:00:28.57
>>47 誰が何をカンニングなのかよくわかんないけど、いつから自分が採点者だって錯覚してた?
いいか、このスレでもっとも清純でくもりなきまなこを所有しているのは桃白白だ。
お前の濁った瞳で清濁を判別できると思ったらおおまちがいだ。だれもがこころ奪われる
美しい風景が眼前に広がっていたとしても、すりガラス越しにみたらとても白いです
という感想しかいえないだろ。お前の眼はそういう眼であるけれども、
桃白白のクリスタルアイを持ってすれば明確に青く澄んだ空の色を認識できるわけ。
つまり桃白白が返信した時点で採点する権利は桃白白に委譲されたわけ。
幼稚なコードでも、スレに貼らずにああいうところに投稿されると パッと見では良くできたコードに見えてしまうから不思議だ パッと見だけで、じっくり見れば結局幼稚なコードに違いないんだけどねw
51 :
桃白白 :2013/02/10(日) 17:56:16.96
>>50 ∩___∩
| ノ ヽ
/ ― ― べ、べつに桃白白じっくり見てもらえて書いたかいがあったなんて思ってないからな
| ////( _●_)ミ 幼稚といわれて怒り狂ってるからな
彡、 |∪| l テヘクマ
ヽ ヽノ /
/´ ヽ、r ̄
r ヽ、 )
ヽ、 ヽヽ
と二_ノ_ノ
最近、桃白白も弄られ慣れてきたな 以前は弄られるとキレてたが、自分の立ち位置を自覚し そのレベルでは弄られるのも仕方ないということにようやく気付いたか
パイパンのぱいぱいをいじるとかさあ・・・ VBAの話しようぜ・・・
54 :
桃白白 :2013/02/10(日) 18:23:19.63
1回しか使ってない変数がいくつもあるけど、まとめると読みにくくなるし とりあえず空行を詰めるだけならこんな感じでいける Sub Macro1() With ActiveSheet.UsedRange r1 = .Row c1 = .Column r2 = r1 + .Columns.Count - 1 c2 = c1 + .Rows.Count - 1 End With With Application.WorksheetFunction For i = r2 - 1 To r1 Step -1 If .CountA(Rows(i)) = 0 Then Rows(i).Delete Next For i = c2 - 1 To c1 Step -1 If .CountA(Columns(i)) = 0 Then Columns(i).Delete Next End With End Sub
バグというか、単純な書き間違い発見 r2 = r1 + .Rows.Count - 1 c2 = c1 + .Columns.Count - 1 Withを展開して無駄な代入を全部まとめれば6行になる
57 :
桃白白 :2013/02/10(日) 19:23:43.91
>>55 じゃあそっちを桃白白が書いたことにする?
>>48 クリップボードから非表示の行は飛ばして張りつける
Set dst = Application.Selection
Set dataobj = New DataObject
dataobj.GetFromClipboard
clipstr = dataobj.GetText(1)
row = 0
For Each clipline In Split(clipstr, vbCrLf)
Do While dst.Offset(row, 0).Rows(1).Hidden = True
row = row + 1
Loop
col = 0
For Each s In Split(clipline, vbTab)
dst.Offset(row, col).Value = s
col = col + 1
Next
row = row + 1
Next
いろいろチェックしないとダメだがまあこんな感じでどうだ
よく考えたら、大して行が長くなるわけでもないのでまとめた Sub Macro2() With ActiveSheet.UsedRange For i = .Row + .Rows.Count - 2 To .Row Step -1 If Application.WorksheetFunction.CountA(Rows(i)) = 0 Then Rows(i).Delete Next For i = .Column + .Columns.Count - w To .Column Step -1 If Application.WorksheetFunction.CountA(Columns(i)) = 0 Then Columns(i).Delete Next End With End Sub
またタイプミスしてるよ… orz Sub Macro2() With ActiveSheet.UsedRange For i = .Row + .Rows.Count - 2 To .Row Step -1 If Application.WorksheetFunction.CountA(Rows(i)) = 0 Then Rows(i).Delete Next For i = .Column + .Columns.Count - 2 To .Column Step -1 If Application.WorksheetFunction.CountA(Columns(i)) = 0 Then Columns(i).Delete Next End With End Sub
罫線とか塗りつぶしとか、何か書式設定されてるとゴミが1行分だけ残るから それを避けたいなら「- 2」の部分を「- 1」に変えてね
Forステートメントで計算させるのか?
ScreenUpdatingはFalseでやるべきだな UsedRangeが巨大だと再描画が大規模になるし
VBA初心者です。基本的なことで申し訳ないのですが、質問させてください。 今8枚目以降のシートを新規ブックに移動したく、選択する所まで以下のコードを作りました。 Dim i As Integer If ActiveWorkbook.Worksheets.Count < 8 Then Exit Sub For i = 8 To ActiveWorkbook.Worksheets.Count Worksheets(i).Select (False) Next i この後、選択移動をしたシートを移動するのですが、 色んなサイトを覗いては見たものの「Sheets(Array(1, 2, 3)).Move」等、 シート名やインデックス番号を指定するものばかりで、中々先に進めません。 選択しているシートを移動する、又は連続しているシートを移動する何か良いやり方はないでしょうか。
>>65 お陰様で出来ました!有難うございました。
67 :
デフォルトの名無しさん :2013/02/11(月) 16:44:25.93
ファイルの末尾の改行を削除したいのですが どうすれば良いでしょうか? AAA BBB [EOF] ↓ こーいう風に最終的にしたいです。 AAA BBB[EOF]
ファイルの末尾の改行が複数あったらどうするの? AAA [EOF] ↓ AAA [EOF] それとも AAA[EOF]
69 :
デフォルトの名無しさん :2013/02/11(月) 16:54:16.29
ファイルの末尾の改行は、2つだけです。 AAA BBB [EOF] というパターンはありえなくて、 AAA BBB [EOF] のみあり得ます。
1つだけじゃないの?
ループすりゃいいじゃない 正規表現つかって末尾から vbcrlfだったら一文字削除 それ以外の文字になるまで処理継続
72 :
桃白白 :2013/02/11(月) 18:13:09.76
>>69 最初から改行がない可能性は?
必ず最後は改行?
書き捨てスクリプトのようなものなら 多少の決め打ちはいいんでないかい
改行判定すりゃいいじゃ・・・
最後が改行で終わらないテキストファイルなんか窓から投げすててしまえ
桃白白って簡単な処理でも、とにかく冗長にコード組むのが好きだよね 冗長なコードしか書けないおバカさんなの? それともコードを複雑にすることで背伸びしてるつもりなの?
78 :
桃白白 :2013/02/11(月) 19:20:15.29
>>77 それは桃白白より優れたコード書いてからゆってよ。
手術の執刀医に腹をかっさばかれながらなんでこんなに
時間がかかるんだといってるようなもんだよ。病院の先生は
一生懸命全力尽くしてるんだよ。たとえ患者が名のあるお医者さん
だったとしても患者として病院のお世話になるんならおとなしく
麻酔にかかってるのが礼儀ってもんだと思うよ。桃白白よりきれいなコード書けるの?
それとも桃白白よりきれいなコード書けないの?
プログラマからすれば冗長なコードってのは褒め言葉なんだが・・・ パイパイ噛み付くところ間違ってる
80 :
桃白白 :2013/02/11(月) 19:32:51.13
>>79 冗長なコードしか書けないおバカさんなの?
それともコードを複雑にすることで背伸びしてるつもりなの?
お前はこう言われてうれしいのか?そうか。受け取り方はひとそれぞれだよな。
Sub TrimEndCrLf(ByVal filepath As String) Dim stream As ADODB.stream Set stream = New ADODB.stream stream.Type = ADODB.adTypeBinary Call stream.Open Call stream.LoadFromFile(filepath) If stream.Size >= 1 Then Dim b As Byte stream.Position = stream.Size - 1 b = stream.Read(1)(0) If b = 13 Or b = 10 Then If b = 13 Then stream.Position = stream.Position - 1 ElseIf b = 10 Then If stream.Size >= 2 Then stream.Position = stream.Position - 2 b = stream.Read(1)(0) If b = 13 Then stream.Position = stream.Position - 1 End If Else stream.Position = stream.Position - 1 End If End If Call stream.SetEOS Call stream.SaveToFile(filepath, ADODB.adSaveCreateOverWrite) End If End If Call stream.Close End Sub
Sub TrimEndCrLf(ByVal TextPath As String) Const NlCode = vbNewLine ' 改行の種類を設定 Dim Fso As New FileSystemObject Dim TextSrc As String Dim Lines() As String TextSrc = Fso.OpenTextFile(TextPath, ForReading).ReadAll Lines = Split(TextSrc, NlCode) If Lines(UBound(Lines)) = "" Then ReDim Preserve Lines(UBound(Lines) - 1) Fso.CreateTextFile(TextPath, True).Write Join(Lines, NlCode) End Sub
空ファイルもあり得るなら If FileLen(TextPath) = 0 Then Exit Sub を追加 まあ With Fso.OpenTextFile(TextPath, ForReading) If .AtEndOfLine Then Exit Sub TextSrc = .ReadAll End With でもいいけど
不特定多数が使うプログラムと、特定個人や組織がつかうプログラムじゃ設計が異なるよな
85 :
桃白白 :2013/02/11(月) 21:25:35.35
>>82 ところで、話変わるんだけどさ、FSOのReadAllて読み込む文字列に
ヌル文字が含まれてるとメモリが破壊されることない?物理的にて
ことじゃなくて読み込む文字列が変にならない?桃白白それが
いやでFSOはあまり使わないわ。
ヌル文字が入ってる段階でテキストとはいえない
そんなこと一度もないが、仮に有ったとしても 一般的にはプレーンテキストでヌル文字含むことの方が例外的なものなんだから ヌル文字含むテキストを扱う場合だけ対策すれば良いことだな というかFSOではなくVBAの文字列操作関数の中には、ヌル文字が含まれると 想定外の動作するものがあるが、それをFSOのせいと勘違いしてるんじゃね? ちゃんとデバッグして、ReadAllの時点で問題が発生してることを断定出来たの? 出来たなら、その断定方法を具体的に書いてみな
readline.vbs FileSystemObjectのReadLine()/ReadAll()関数には、 NUL文字に後続するデータがNUL文字に化けるという、重大障害があります。 そこで、ReadLine()/ReadAll()をRead()で代替します。 とあるな
まあバイナリ用じゃなくてテキスト用だからな
90 :
桃白白 :2013/02/12(火) 02:31:07.01
>>86 テキストと呼ばなくてもテキストにヌル文字が入る可能性はあるわけで、
それいやじゃない?
>>87 そんなの例外だ問題ないといっちゃうわけ。じゃあエルシャダイの称号はお前のものだ。
>>89 ReadメソッドやADODBのReadTextは問題ないわけで、いやじゃない?ADODBのほうがよくない?
桃白白て魅力的じゃない?
UTF16テキストならヌル入るでしょ
> テキストと呼ばなくてもテキストにヌル文字が入る可能性はあるわけで 「可能性」ではなく「ケース」だね 確かにタブ区切りテキストみたいなかんじでヌル区切りテキストとかもあるけど それはヌル区切りテキストなどの特殊なものを扱うケースにおいて考慮すれば良いことで 特殊な制御構造を持たない普通のテキストファイルに、不意にヌル文字が入る可能性は ファイルが破損しない限り無い 例えるなら、関東では雪が積もることがあるからと、8月に沖縄から東京に車で来るのに当って スタッドレスタイヤを付けてくるようなもの 確かに関東では雪が積もることは往々にしてあるが、それは冬、精々晩秋から初春というケースにおいてのみ 考慮すれば良いことで、8月にそれを考慮する必要性は全く無い その辺の「可能性」と「ケース」の違いを理解して組まないと、どんどん無駄で冗長なコードになってしまう
93 :
桃白白 :2013/02/12(火) 03:52:03.66
>>92 無駄で冗長になるからヌル文字を考慮すべきじゃないということなら
FSOをADODBに変えるだけで対処できるわけで、冗長にならないからADODBを使うべきだよ。
それが無駄じゃないとわかるときっていうのは動作不良におちいったときでしょ。
いうなれば防具つけてくだけでいんだよ。相手が素手でくるだろうから俺は丸裸で構わない、
身軽なほうがいいと言ってでかけていって武装した敵に襲撃を受けるのはいやじゃない?
そのタイヤの例はわかるんだけどさ、石橋を叩いて渡る桃白白てことだよ。
まだ桃白白には難しい話だったかな
95 :
桃白白 :2013/02/12(火) 04:48:39.44
>>94 >>92 は原発事故を経験してないから安全だと言ってるだけだよ。
それ安全神話状態だよ。
>>87 はそんなことは一度もないと言ってて、
そんなことは読み込む文字列がヌル文字を含んでいることなのか、そのときに
ReadAllが変な値になることがあることなのか、どのことを言ってるのかは不明だけれども、
すくなくともReadAllが変な値になることがあるのを知らないんでしょ。知らないのに大丈夫だ
と言ってるだけだよ。それってとっても危ないことなんだよ。桃白白が言ってることだから
反対したくなってるだけで桃白白が言ってることが正論だってことはうすうす気づいてるでしょ。
じゃあうすうす桃白白に賛同すればいいよ。
まあ桃白白が手を出す程度のプログラムなら、無駄なことやったって たかが知れてるんだから、好きなだけ無駄なことやらせておけばいいじゃん 5000万の予算、1年の開発期間で、1億の売り上げを目標にしていたものが 2億の経費、3年の開発期間が掛かり、他者に先を越されたことで価値も下がって 売り上げも3000万になり、利益無しどころか億単位の損益になるってんじゃ放っとけないけどさ
97 :
桃白白 :2013/02/12(火) 05:55:53.70
>>96 FSOあぶないよって話をしたかったの。もうやめようかお前が何の話をしてんのかよくわかんなくなってきた。
桃白白って最近"分"を弁えて素直になってきたが、相変わらず意地張り出すと止まらないなw 自分が間違ってたことに気付いても、きっと厨な性格が出てしまって引っ込みが付かないのだろう。
マクロを使ってシート見出しの名前で、シートの順番を並べ替えるようなことってできますか? A1X30101 A2X30115 B1X30210 のように文字数は9文字 末尾の数字は作成日2013/01/01から30101を生成 頭の2文字はデータソースの属性から決定(10種類程度) 3文字目のX部分はファイル毎に固定(同一ファイル内では同じ) 1ファイルに30以上のシートを保存している A1Xで時系列>A2Xで時系列>・・・みたいに並べ替えたい
ぜんぜんやり方が浮かばないです
>>99 配列に格納した文字列のソートくらいは解ってると想定して
(解って無くてもググればすぐ解ることだし)
シート名を配列に書き出したらソートして
あとは配列(0)のシートを.Move Before:=Worksheets(1)にした後は
1~最後までは配列(インデックス)のシートを.Move After:=Worksheets(インデックス)
にすれば良いだけだよ
データソースの種類と順番がわからないけど、単純にシート名の文字列順と見ていいの?
>>101 ワークシートを名前順に並べ直す
Sub Macro1()
For i = 1 To Sheets.Count - 1
flag = 0
For j = 2 To Sheets.Count
If Sheets(1).Name > Sheets(j).Name Then flag = j
Next
If flag > 0 Then Sheets(1).Move After:=Sheets(flag)
Next
End Sub
シートの順番を変える時ってScreenUpdatingは効果あるんだっけ?
105 :
桃白白 :2013/02/12(火) 12:59:37.59
106 :
桃白白 :2013/02/12(火) 13:02:39.54
>>98 技術的な話をしてるときにそういう印象操作的な人格批判をするやつって桃白白だいきらいだわ。
お前は桃白白にきらわれて絶望しろ。
桃白白も知識はそこそこ付いてきたようだけど、論理的思考能力がまだまだだな プログラムではこっちの方が重要なんだが勉強しても知識ほどの伸びは期待できないからなぁ
すでに解決してるみたいだけど、
>>104 はもうちょっと短くならないのかな
うまい方法がありそうな気がする
どう見ても桃白白の方が論理的なレスだな 桃白白さんすごいです。
いくら見方が居ないからって、それやっちゃ終わりだぞ
>>109 挿入ソート的にやってみた。これはMoveメソッドと相性が良いな。
Sub Macro1()
For i = 2 To Sheets.Count
For j = 1 To i - 1
If Sheets(i).Name < Sheets(j).Name Then
Sheets(i).Move Before:=Sheets(j)
Exit For
End If
Next
Next
End Sub
113 :
デフォルトの名無しさん :2013/02/13(水) 01:17:13.78
VBAでのIE操作関係を網羅してるサイトってないんですかね? ていうか、なんでこんなに説明が下手な人ばかりなんですか? 頭が悪い人って説明の仕方も下手ですよね。 相手に伝えなきゃ意味がないのに、自分しかわからないように説明するというか。 僕だったらもっと100%もっとうまく伝える自信があるんですけど。
114 :
デフォルトの名無しさん :2013/02/13(水) 01:21:29.13
例えばここのブログ?
http://billboardtop100.net/excel/vba-ie/ Set ObjIE = CreateObject("InternetExplorer.Application") 'IEを開く際のお約束
ObjIE.Visible = True 'IEを開く際のお約束
ObjIE.Navigate "
http://www.yahoo.co.jp/ " '開きたいサイトのURLを指定
Set ObjIE
CreateObject
ObjIE.Visible
ObjIE.Navigate
それぞれ何を意味するかって説明をしないと、初めての人は理解できないだろう。
どうして頭が悪い人間は相手に伝える説明ができないんだ。
それぞれがどういう意味を成していて、どうして何のために入力するのか
それを説明できなければ話にならないのに、なんで独りよがりに自分だけがわかる説明書いてドヤ顔しているんだ。
プログラムよりまず日本語を勉強したらいいのに。
115 :
デフォルトの名無しさん :2013/02/13(水) 01:27:02.12
例えば >Set ObjIE = CreateObject("InternetExplorer.Application") これ、ObjIEという文字列にCreateObject("InternetExplorer.Application")をセットする このプログラム内ではObjIEという文字列はCreateObject("InternetExplorer.Application")を意味するってことでしょ? じゃあさ Set XXXXXXXX = CreateObject("InternetExplorer.Application") XXXXXXXXはショートカットキーみたいなものです。自分が好きな文字列を入れてください。 こういう風に説明すればいいのに、どうして頭が悪い人はそれができないの? なぜ?なぜできない?どうしてそんなに頭が悪い? Set ObjIE こういう風に書いちゃうと、まるでこれを入力しなきゃいけないみたいに勘違いしちゃうだろうが。 なんで融通がきく説明ができないの?
116 :
デフォルトの名無しさん :2013/02/13(水) 01:32:55.89
>For Each Obj In ObjIE.document.getElementsByTagName("input") これとかさ、こんな風に書いちゃったら getElementsByTagName For Each Obj In ObjIE document が何が何を意味してどういう働きをするか、まったくわけがわかんねーじゃねーか For Each xxx In yyyyy.document.getElementsByTagName("mmmmm") mmmmmがyyyyyをxxxにする構文 みたいになんでこういう応用がきく説明ができないのかって話。 どうしてこんなに頭が悪いんだよ? IQどんだけ低いの?説明のセンスがないやつが説明しようとすんなよバカが。
[お約束]という言葉を使うヤツの言うことは聞くな そういうヤツは理解していない
定期的に沸く痛い人
119 :
デフォルトの名無しさん :2013/02/13(水) 02:03:01.38
例えばさ、英語習うときに This is a pen. = これはペンです こんな書き方したら、こう覚えちゃうだけでしょ? そうじゃなくて、 This is a pen こうやって分解してそれぞれどういう意味で、主語なのか述語なのか、どういう使い方をするのか そしてこの例文ではそれぞれどういう使い方をした結果、これはペンです という文になっているのか ここまでで初めて説明になるんだろうが バカなのかよ なんでこういう賢い説明の仕方がわからないんだろう? こんなバカな説明してたら、間違って覚えちゃって、余計わけわからなくなるだけなのに なんでこういう賢いことできないのかなぁ?苦笑
>>119 英語ネイティブな幼稚園児が主語とか述語(つか目的語な)とか意識してると思うか?
お前の頭が幼稚園児以下だから普通の人向けの説明が理解できなんだよ
万人にゼロから説明しようとするととんでもなく冗長なことになる だから説明する側としては相手にある程度のレベルを想定して説明する これはweb上だけのことじゃなく学校の授業とかでも同じだろ だから自分の理解を超える説明だなと思ったらもっと分かりやすいとこを探す これもリテラシーの一つだと思うよ
122 :
デフォルトの名無しさん :2013/02/13(水) 03:17:28.19
>>120 はい、言葉を使う人は皆意識してますね。
主語や述語がないと相手に言葉が伝わりませんから。
その証拠に、小学校で一番最初に習いますが?
おや?あなたの学校ではやらなかったのかな?教育制度が崩壊してたの?
あー、だから、説明の仕方もまともにままならないんですね?
そもそも主語や述語の使い方さえもわからないから?
123 :
デフォルトの名無しさん :2013/02/13(水) 03:20:59.14
>>121 はい?通常は学校の授業も何の授業もそうしていますが?
あ い う え お
1 2 3 4 5 6 7 8 9 0
の書き方や意味から始まりますが?
え?あなたの学校ではいきなり、足し算も教えないで条件付き確率とか関数問題とかやってたんですか?
124 :
デフォルトの名無しさん :2013/02/13(水) 03:29:49.15
おやおや、すごい人たちだなぁ、ここの皆さん^^ 生まれた時から、周りの同年代が「オギャー」って言ってる時に ニュートン力学や流体力学、宇宙物理や電磁気学の定理をペラペラペラペラ話してたんだ?^^ すごいねぇ^^さすが、なんでも知ってるマスター博士だね^^ 世の中はどんな天才でも知らない事の方が多いのに、ここのマスター博士の皆は、なんでも知ってるんだもんね^^ じゃあ全ての生物の呼吸器学のすべてを論にして述べてみてよ^^ よろしくね博士^^
「ママー」 「しっ!見ちゃいけません!」
>>116 こういう説明してくれてる市販本教えてくれ。三流くんのサイトは横道な文章が多すぎる
>>112 シートを移動対象にするのは時間が掛かりそう。
特にシートにデータがいっぱい格納されている場合とか。
シート名をセルに書き出してソートしてから移動するやり方の方が時間は掛からないような感じがするけど。
コードが短ければ処理が速いというものじゃないしね。
こんな感じかな。
・シート名格納用のシートを非表示で一枚目に作成しておく。
・シート名格納用のシートのデータをクリア。
・一番最初のシートにシート名をA列のセルに出力。
・シート名をソート
・シートをソート順に移動
確かにね。なぜかは知らないがプログラムに関する質問で、的確な答えがかえってきたことは今まで一度もない。 質問してもどっかしら何かおかしくて、結局自分で解決しちゃうっていうパターンだないつも。 むしろ教えてもらったことが間違ってたり説明がいい加減なせいで、余計わからなくなるくらいだな。
プログラミング関係者ってクセがある人が多いのかね? ・設定をこっちで用意してるのに、その設定を無視して勝手に設定を作ってプログラムを書いて答える人 ・質問を無視して、こうすればいいんじゃない?といらないアドバイスをして質問には答えない人 ・ヒントだけを与えて後は自分で考えろとドヤ顔で去っていく人 質問文を読まない人が多いのかな?
白桃の発言はまだマシなほうやったんや
昔はさ、ネットなんてなくてさ本だけが頼りで 隅から隅までじっくり読んで理解しようとしたものさ。 だが今はどうか。ネットで聞いたりぐぐったりできる。 だからどんどんバカになってるんだよ。
>>129 設定をこっちで用意していると言っても、その背景の説明がないから勝手に設定を作られるんでしょ。
で、よくあるのは回答の後にいや実はこんな背景があってとか後出しの条件を突きつけられる。
回答した人間にとっては貴重な時間を割いて回答しているわけで、
回答してもまた条件を後出しされるんでしょ?やってられないよということになる。
このスレは宿題スレじゃないんだし回答はアドバイスやヒントで充分。
そうじゃないと質問者が全く考えなくなるからね。
どうしても答えのコードが欲しいというのであれば宿題スレのようなスレを立てればいい。
>>129 は
>>1 のテンプレを読んでるのかな?
>>129 中と下は、質問者からしたら気に入らないこと、都合の悪いことかもしれないけど
一般常識的には間違った事じゃないよ
まず中だが、質問者は無知故に、不適切な手続きで処理を行おうとしているなら
より適した手続きで望む結果を出せる方法を紹介するのは普通のこと
そして下だが、これは
>>1 ★5にも書いてある通り、このスレの基本方針だし
そもそも無料の掲示板で丸投げ質問して、丸貼りして動くコードを作ってもらおうって方がおかしい
つまりプログラミング関係者の中でも、とくに初心者(質問者)にクセがあるというか
常識のない人が多いってことだなw
俺も昔ここ(Part1桁のころ)で質問したことあるし、今でも他言語スレでは質問することあるが
API名とか、関連記事が引っかかりそうな検索ワードなどのヒントだけ貰ったら、お礼言って後は自分で調べるし
要するに質問がクソだって事だな。 意に介すに値しない質問。 最初はよくあるしスルーしてもらえるが、 そのうち愚問として扱われるようになる。 かならないかは、あなたしだい。 パイパンのする質問は得てして愚問ではない気はする。
濃厚なパイパイ臭
Excelツールバーの罫線アイコン右の ①▼をクリックすると罫線メニュー窓が出ます ②メニュー上端をドラッグするとツールバーから独立させられる ③メニュー窓内に複数のコマンドボタンが配置されダイレクトに実行できる ④ダイレクト実行したコマンドがツールバー上のデフォルトコマンドになる ⑤メニュー上右端の×をクリックするとメニュー窓が消える メニュー窓内に自作のマクロボタンを配置して 上記①~④と同じことをさせるにはどうすればよいでしょうか? 但し、「新しいメニューコマンド」は使わない方法で
>>104 まともに動かないんだけど
こうでないか?
Sub Macro1()
For i = Sheets.Count - 1 To 1 Step -1
flag = 0
For j = 2 To Sheets.Count
If Sheets(i).Name > Sheets(j).Name Then flag = j
Next
If flag > 0 Then Sheets(i).Move After:=Sheets(flag)
Next
End Sub
>>127 問題はソートじゃなくて移動の方だよ
>>104 にしたって、シートがn枚の時、Moveメソッドが呼ばれる回数は最大でもn-1回だから
たとえばシートの初期状態が2-3-1となっていた場合、
先頭からチェックしてまず2を移動すると3-1-2になる。次に3を移動して1-2-3となって完了、だと2回Moveが必要だけど
いきなり1を先頭に移動すれば1回のMoveで並べ替えが完了する
どういう順番で動かすとMoveが最小になるか、見つけるのはけっこう大変。そういう意味での最適化が必要
たかがエクセルマクロなんだから動けばいいじゃないか 細かい事気にしてる間に手作業で済んでしまうぞ?
それが解ってない奴が結構多いんだよね 桃白白もそれ理解して無くて、この間グダグダ言ってたし バグが無いようにするのは大事だが、無駄な最適化や無駄な例外処理はやめようぜ
5分で書いて、実行時間十秒 1時間書けて華麗なコードを書いて、実行時間0.1秒 なんでもかんでも下を選ぶアホ大杉
>>141 実行時間は短い方がいいんじゃね?
書くのは一回だけど、使うのは頻繁なんだから
143 :
桃白白 :2013/02/13(水) 14:04:01.34
>>140 どの件?
いちいち桃白白の名前だされるのは桃白白迷惑に思ってる。
桃白白にトラウマでもあるの?やめて。技術論語れないやつは桃白白きらい。
>>142 55分かけて実行時間を9.9秒縮めた方がいい場合もあるのは当然のこと
いつでも
> 1時間書けて華麗なコードを書いて、実行時間0.1秒
がいいと思ってる奴大杉という話だ
初めて直面する課題なら頭を使う、時間もかける そうすれば経験値が上がって、次からはもっと効率化できる そういう積み重ねは大事
技術書執筆するときに全部丸々書くのか、ポイント絞って書くのかってことじゃね あと名前言われるの嫌なら匿名掲示板でコテ着けんなっていう なんでタオパイパイなの?
>>144 捨てコードとして書いたつもりが、いつの間にかスタンダードにされたり、
一部の人しか使用しないと思っていたらいろんな人に使われたりする。
捨てコードとして書くとリスクが大きすぎる。
本筋のところさえきちんと考えられていれば修正も少ない。
捨てコードにすると結局余計な時間がとられたりするもの。
捨てコードとして書いたんなら捨てろよってことだな
149 :
桃白白 :2013/02/13(水) 16:39:04.43
>>146 > 桃白白もそれ理解して無くて、この間グダグダ言ってたし
まともな話ならいんだけどやってることはこれだよ。こんな聞こえよがしの言い方で
桃白白の印象を悪くしようとしているだけの女々しいことしかできないぶんざいで
桃白白の名前を出すなってこと。
桃白白ってとても賢くてすごくかわいい人だと思うという文脈だったら
桃白白の名前を使ってくれてもかまわない。桃白白はそれをさまたげない。
パイパイ女なのか?
151 :
桃白白 :2013/02/13(水) 16:46:29.79
>>147 えっ?お前が書くコードは全部誰かに監視されてるのか?
捨てコードとして書いたんなら、捨てるか秘匿するかしとけよ
掲示板に貼るコードは誰かが再利用する危険性が常にあるから あんまりひどいコードを公開するのはなあ
154 :
桃白白 :2013/02/13(水) 16:55:23.93
>>153 別に問題ないだろ、利用するやつは2才児じゃあるまいし。
コード書くやつは利用するやつの保護者じゃあるまいし。
そんなことは知ったことじゃないだろ。
>>151 こんな自分の写真も出せないクセに、他人の画像使って印象を良くしようとしてるだけの
陰湿なキモオタなんてお呼びじゃないよ
誰だよ
総合すると、山口智子似のキモヲタか。 微妙だな
158 :
桃白白 :2013/02/13(水) 16:59:47.14
自分の写真出せない様な奴に、どうやって嫉妬したら良いのか教えてください 私にはどうやっても嫉妬できません
どうしても気になるから思いきって聞く やっぱり桃のようなオッパイだから桃白白なのか?
俺は白白きらいじゃないよ
162 :
デフォルトの名無しさん :2013/02/13(水) 21:32:25.03
変数とかみたいにこれをプログラムをショートカットする方法ってありますか? 自分が今書いてるプログラム文では何度も Do While ie.Busy Or (ie.ReadyState <> 4): Loop ie.ExecWB 17, 0 ie.ExecWB 12, 0 ActiveSheet.PasteSpecial Format:="HTML", Link:=False, DisplayAsIcon:= _ False, NoHTMLFormatting:=True ActiveCell.Offset(0, 15).Select これが出てきます。 というかこの繰り返しがほとんどです。 ちなみにこれはサイト全文をコピーして貼り付けるというものなんですけども こういうプログラム文をまるごと Set G とかで一文字にまとめたりできないんですかね? あと、後半物凄く処理が重くなってたまに詰まるんですけども、それはやっぱりプログラムが長いのが原因ですか? 軽くさせるコツや、プログラムってあります?
Sub G() それ End sub しといて Call G 変数は全部モジュールレベルで定義しとけ
164 :
デフォルトの名無しさん :2013/02/13(水) 22:18:00.40
>>163 ありがとうございます。
サブプロシージャってやつですか。
これってやっぱ利用すると軽くなりますか?
>>162 >変数とかみたいにこれをプログラムをショートカットする方法ってありますか?
ショートカットって?
>Set G とかで一文字にまとめたりできないんですかね?
関数で一文字にまとめることは可能。でも一文字はお薦めしない。
>あと、後半物凄く処理が重くなってたまに詰まるんですけども、それはやっぱりプログラムが長いのが原因ですか?
何に時間が取られているか判らないからなんとも言えない。
>軽くさせるコツや、プログラムってあります?
知らん。
そんな簡単に手に入るのなら俺も知りたい。
ならん 処理終わったらieのインスタンスをちまちま殺してるか? クリップボード処理も終わったら空にしてみたら
167 :
デフォルトの名無しさん :2013/02/13(水) 22:25:45.70
>>165 >でも一文字はお薦めしない。
なぜですか?
>>166 インスタンスをちまちま殺すってどういうことですか?
Exit~ってやつですか?
168 :
165 :2013/02/13(水) 22:31:14.80
>>167 例えばプロシージャの名前を「G」にしたとする。
どのような処理をするプロシージャなのか一発で理解or想像できる?
俺はわからない。
Gスポット
単語短いと予約語があったりするからねえ
予約語と被る名前付けるとかどこの素人だよ
>>168 プログラムの目的によっては分かるかもしれないけどね
例えば色を扱う場合は緑の要素を取得するのだと想像できる
いつも思うんだがこういうバカ(
>>168 )は絶対極端な例出すよな。
生存期間が数行とか文脈から使用目的が自明な変数にまで1文字数をダメという理由は?
>>173 流れよめてるか?
1文字変数が絶対ダメとか言ってないぞ
これが脊髄反射ってやつですか
175 :
桃白白 :2013/02/14(木) 01:05:27.36
お前らこんばんわーーーー!!!! バレンタインおめでとおおおお!!!!!! 旦旦旦旦旦旦旦旦旦旦旦/⌒ヽ旦旦旦旦旦旦旦旦旦 ⊂二二二二二二二二二二( ^ω^)二二二二二二二二⊃ お茶が入りましたおー | / ( ヽノ ノ>ノ 三 レレ ∩ ダシャーン ミ // ミ ⊂'ヽ ∩ // \ ミ \\\\_,,,,,,,,/ ∠ / \\\\ .,''.,':.',, .,':.',, .,': l .,':.',,|[]].,':..., ガッ ) \\ ).,':.',,:.',, []] .,':.',,.,':.',,.,日 .,':.',,.,':.',, / ⊿ ⊂二二二、___ヽ \_,,..ノ /[]].,':',,:',[]]/[]]\[]].,':.',,|[]].,':.',, _ .,':.',,]]/ 日.,':.',,.., . ..,,,;:[]]
>>174 おすすめしない理由を聞いてるんだが?
また気分かカス
それよりも、
>>162 がアホみたいなビジーループ回してることを
指摘してやる優しさは無いのかね。
むしろ漢字一文字で表現しろよ、日本人なら 外字作って無理矢理な名前にするとかお勧め
excel 2010のVBAで application.screenupdating = false で printout preview:=trueのプレビューでリボンが無反応になるバグ 直ったかな?
本当にバグならそういう報告や質問はMSにしろ なんで適材適所を弁えられないかねぇ、最近の子は
>>181 本当にバグだし、2013を使ってる人が
>>180 がFixされてるかどうか確認してるかもしれないでしょ
どうでもいい質問より、よっぽど有用だわ
質問スレなんだから知らないなら回答しないかせめて誘導URL張ればいいんじゃね そういう返しはヘイトためるだけだ 茶化すならよっぽどセンスあるレスを返すべきだろ ごくまれにいい揚げ足取りをするようなセンスを持つ人もいる そう、桃白白ならね
MS行けとかいうなら、それこそ大体の質問は「アビバ行け」で済むしな VBAエキスパートコースなるものがあるらしい(俺調べ)
>>178 俺もやるけど、何か拙いの?
正しいやり方があるなら教えて
>>183 そういうレスが嫌なら2chは向いてない。
煽りは挨拶程度のものw
でも自分が煽られたら嫌なんでしょw
190 :
188 :2013/02/14(木) 18:23:32.65
>>189 全然。
煽りをまともに受けてたら精神が逝っちゃうよw
煽ることを我慢できないのかねぇ、最近の子は
空気読め、馬鹿ども
変数の命名規則はフロアの人間だわ Dim Sasaki As String ' 佐々木部長 Dim Inoue As Range ' 井上さん(事務の方) Dim Watanabe As Variant ' 使いすtry派遣の渡辺さん
>使いすtry派遣の ケミストリィみたいな役職なのかと思ったらなんだその中途半端な省略はw
派遣がVariant型って…… 便利に使い回されてる感が現れてるな
>>186 Win32からSleepをインポートして、
DOループの中に入れる。
スリープしないと、VBAがCPU使ってしまって、
Webブラウザが使えるCPU時間が減るから、
時間がかかったり、タイムアウトしたりする。
最近なら大抵コアが2個以上あるから動きはするだろうけど。
>168 :165:2013/02/13(水) 22:31:14.80
>
>>167 >例えばプロシージャの名前を「G」にしたとする。
>どのような処理をするプロシージャなのか一発で理解or想像できる?
>俺はわからない。
プロシージャを1文字にするとか常識的にないような極端な例しか出せない無能
プロシージャって単語が1レスに3回以上出てくると、一読したとき脳内でジャブローって変換されるからこまる
199 :
桃白白 :2013/02/14(木) 23:15:35.15
>>197 ちょいと落ち着きなさいよあんた。質問者が1文字の関数にすることが
できるかと問うて回答者ができるけどやらんほうがええよと答えたわけっしょ。
そういうわけっしょ。ちょいと落ち着きなさいよあんた。桃白白超クール。
桃白白さんだ! でもクールだけど超クールではないかな・・・
>>197 だから流れ読めてるかって言ってるんだが
はいはい判った、俺が判定してやるよ
>>173 質問に答えてもらったんだからお礼いってさよならしような
はい、解散!
203 :
186 :2013/02/15(金) 05:06:14.32
>>196 回答ありがとうございます
つまり
>>162 で言えばこういう事ですか?
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Do While ie.Busy Or (ie.ReadyState <> 4)
Sleep 0
Loop
>>203 先に
>>196 じゃないことを断っておく。
Sleep 0じゃ意味ないでしょ。
ie.BusyがFalseになるかie.ReadyStateが4になってほしい時間を設定しないと。
どれくらいの時間Sleepする必要があるのかは設計者が決めることなんで回答は出来ない。
sleep 0はdoevents 扱いなんじゃねえの?
え、今なんて?
状態が真かどうか判定して、偽ならループかける処理 待機時間指定する必要ないじゃない? ループ処理中にマシンが他の動作出来るように、一瞬中断させてる タイムアウト時間の設定とは違うと思うよ 自分で設定しろってことだな
208 :
203 :2013/02/15(金) 11:28:39.14
特に間違ってるようには思えない その処理を基本にコード組んで良いかと
>>186 IEを操作する必要性が無いから調べる気全然無いけど、
Private WithEvents ie As InternetExplorer
って宣言して、
Set ie = New InternetExplorer
として、
Private Sub ie_BeforeNavigate2()
とかのイベントハンドラを使うのが正解かもよ。
211 :
208 :2013/02/15(金) 12:06:30.00
>>211 とっかかりは、そのページでいいと思う。
VBAの場合は、参照設定でMicrosoft Internet(だかなんだか)を指定して、CreateObject()ではなく
As InternetExplorer
として使わないと、イベントハンドラの追加とかが不便(できないことはないのかもしれない)。
あと、参照設定しないと、オブジェクトブラウザ(F2)で見れないのかもしれない。
なお、Sleep()を使用した待機方法で十分なら、イベントハンドラを扱う方法は知らなくてもいい。
214 :
211 :2013/02/15(金) 13:04:27.71
>>212-213 色々と教えてもらえてありがたいです。
参照設定はFileSystemObjectなどで過去にやったことがあるので大丈夫でした。
知らなくても困らない、というのもごもっともなのですが、
(実際、今まではスリープすらやらずに空ループで回してたわけですし)
多少なりとも向上心はあるというか、
知らないことを知るというのはそれ自体楽しい事ですね。
Sleep 0って勘違いしてたわ 一旦スタジオにお返ししまーす なイメージなのね
↑バカ
↑童貞
↓イケメン
照れるなぁ
↑自演乙
221 :
214 :2013/02/15(金) 21:00:56.43
桃白白はザーメン大好きの変態
お前パイパイに何した?
ぱいぱんってマンコとかチンコとか小学生並みの 下ネタしか言わないし変数定義すら間違ってる馬鹿だから ここにこないで欲しい
224 :
214 :2013/02/15(金) 21:15:21.44
>>221 成りすましは勘弁してください
私は無関係です。
桃白白は2chレベルで見れば並以上、中の上か、上の下くらいの頭持ってるぞ ただ、知識はまだまだだし、その割りに自意識過剰で自己顕示欲が強いのが難だが 性格はさておき、根本的な頭の出来は悪くない 数年後は、今では過剰な自意識に見合うだけの知識を身につけて 自己顕示欲からガンガン回答付ける中堅回答者くらいにはなってるかもしれない
しかし人間性とか言動とかキモい
変数定義が間違ってるって、変数の概念を間違って解釈してるって事?
おまんこ
SleepかWScript.Popupか。みたいな。
で結局 Do While ie.Busy Or (ie.ReadyState <> 4): Loop これはどう改善すればいいわけ? 答え教えてよ てゆか、
俺のVBAは例えば Sub sleeptest() Sleep(1000) End Sub って感じでSleep使うと コンパイル エラー: SubまたはFunction が定義されていません。 で出るんだけどなんで? アホなの?普通に定義されてるし
ああ忘れてた これか Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) で Private Sub Sleeptest() Sleep(1000) End Sub でいいのか >ie.BusyがFalseになるかie.ReadyStateが4になってほしい時間を設定しないと。 そんなの設定できんの? ようするに、Sleep(その設定した時間)にすりゃいいってことかい?
>>233 >ようするに、Sleep(その設定した時間)にすりゃいいってことかい?
いいと思う。
235 :
デフォルトの名無しさん :2013/02/16(土) 11:15:29.57
フリーズすんだろバカ
>ie.BusyがFalseになるかie.ReadyStateが4になってほしい時間を設定しないと。 これは Do While ie.Busy Or (ie.ReadyState <> 4) Sleep 0 Loop だよ わざわざ待機させる必要なんてない このループ構文の意味を理解してないだけだろ 強いてあげるなら、このループの中にタイムアウト設定入れるくらい
定義も何もまんこいじれば気持ちいいって事だろks
Sleep 100 が一般ダヨネ
omanko
Sleep 0ってwwwwwwwwwwwwwww ギャグ?
でー、結局何が正解なの? 知 ら な い な ら 別に答えなくていいよ 知 ら な い なら 知 ら な い で い い ん だ よ ? お前の知ったかぶりショーを見るために聞いてるんじゃないからね。 答えを聞きに来てるんだ。 こんなとこでお前の小さい見栄を張ったって仕方ないと思わないか? 答えを望まれているんだから、望まれた答えだけを述べろ。
あと、答えもしないで偉そうな態度をとるな。 望まれた答えも出さないお前などゴミ同然なんだぞ? 用もないし価値もない。 何を根拠にそんな偉そうな態度をとってるんだ? いつからお前が博士になったんだ? ネットで見栄をはりたいなら、正々堂々答えくらい出してみろよゴミクズ。 そしたらいくらでも感謝してやる。 答えも出さずに威張ってるだけのお前に頭を下げる理由などどこにもない。
てゆかさ、Sleepって Do While ie.Busy Or (ie.ReadyState <> 4) Loop この中に入れなきゃだめなの? Sleep(xxx) Do While ie.Busy Or (ie.ReadyState <> 4) Loop こっちの方よくね? もしxxx/1000秒たってもまだ待機状態ならループに回して、 もう待機状態終わってんならループに回す必要もないし いつまでも出し惜しみしてんじゃねーよ 別に答えて誰かが困るわけでもねーんだし
ループの中にDoEventsは必須 鯖や回線などの都合で無限ループに落ちるか、長時間戻ってこない可能性があるので タイムアウトの処理はブラウザなら秒単位になるだろうから、Sleepやループの回数で調整するんじゃなくて Application.OnTimeでフラグを立てる方式にする
煽ってるやつは何がわからんの? 恒常ループとかdoeventsとかsleep処理使ったことないから納得できないだけかね 何が判らないかも言わないと説明しようがないんだよね
俺わかったぜ 何がわからないかも自分で理解できないから、目に付いたレスに粘着するしか出来ないだけだぜ
>>248 煽ってる奴に説明とか、何か勘違いしてないかい?
普通にスルーしときなよ。
>>243-244 こういう煽ってる馬鹿は何が楽しいの?
なんか必死だな
おまえみたいな馬鹿には2chは無理だよ
つ 鏡 そういうことなんだろ > 何が楽しいの
分かって無いのにSleep代わりにDoEvent使ってると後で泣くぞ
おめこ
煽りにもなってないんだから暇つぶしだろ それに反応するお前らも暇つぶしだし俺も暇つぶし DoEventoってどんなメリット/デメリットがあるか端的に言うと?
単純にSleepとDoEventsが同じようなものだと勘違いしていて恥かいた、だと想像。
DoEventsは内部でSleep0呼び出してるくらいしか知らないな 普通に処理戻すのとは違うの?
くらいしかって、その辺も解ってないじゃんw
じゃあ全然知らないんだな んで、何が違うの?
DoEventsによってメッセージキューのメッセージがその場で処理されるじゃん? そうするとボタン2度押しが可能になったり、 text1.Textが処理の途中で変化したり マルチスレッド出来ないからそれっぽく動かすにはDoEvents使うしかないけど、 用法・用量を守って正しく使わないとダメよってこと 簡単なツールならSleepで充分
sleepだと画面更新がされないのか そういや用例みてもsleepの後にDoEventsやってるわな ありがと
画面更新もウィンドウクローズもメッセージだからされないよ 調子乗ってもっと言うと、 5秒以上メッセージしかとしてんのがOSにバレると応答なしのレッテルを貼られる また同じ領域にゴーストウィンドウが生成されて標準のウィンドウ操作は可能になるけど 消してたタイトルバーが見えちゃったりしてブサイクなんだよね ユーザーも時間かかるの分かってるだろうし長時間処理を宣言するAPIとかあったらいいのに
まんこでもいじってろよバカ
ワシはティンコを2本持っている 2本目はとっておきだ(´・ω・`)b
すべてのまんこに懺悔しな!!
よう まんこマン お前はまんこマンなwww
必死になって煽ってるバカは鏡とか言ってるバカと同一人物だろ スルーしとけよ
>>251 は煽る馬鹿を指摘しながら自分から煽って見せるって言う高度な自己言及レスなのに
自分で気付かずに今更必死になってレス返しってのもなかなかうまいな
なんかここ数日の・・・なんだ? 荒れ具合? すっごく自演っぽいんだけど、なんでこんなスレで遊んでるんだ
すべて自演だろ 書き込んでる奴って2人だろ 俺を合わせると3人だな
フッフフ・・・俺もいるぜ!
白桃が記名と無記名を使い分けてるだけだと思ってるから実質、白桃と俺の二人しかいない そうなんだろ?白桃
まんこあきた
ExecuteExcel4Macroメソッドで、別のブックのワークシートの チェックボックスの値を取得しようとしてるのですが。。。 ExecuteExcel4Macro("get.object(62,""Check Box 18"")") みたいにやっても、外部ワークシートの参照が指定できない。。。 対象のワークシートをactivateしててもダメだし、 こういう使い方はできないもんなんですかね。
できるよ ただ参照指定にmankoが抜けてるだけじゃん
つまんね
またパイパンかよ くだらねんだよ
駄目なようなのでCreateObjectします。。。
>>276 ,277
馬鹿なの?なんでスルーできないの?
お前ここにくるなハゲ
自演にマジレスw
ハゲvsパイパンvs俺
ここまですべてパイパンのまんこ
283 :
デフォルトの名無しさん :2013/02/20(水) 13:16:34.95
ぬるぽ
最近ExcelスレにVBAの質問が増えた
ぬるぽとか言ってるヤツ、寒いよ
286 :
デフォルトの名無しさん :2013/02/21(木) 06:22:06.12
ぬるぽ
287 :
デフォルトの名無しさん :2013/02/21(木) 11:22:31.99
ぬゐぽ
めゐぱ
まんこ
ぬるぬるまんこ
データを遡って5件抽出(空行は無視)し、B列とA列の差をとりその平均を 取ろうとしているのですが??な状態です。 表のデータからは答えが5で割った106になるはずなのに 83.3333~と6で割ってる値になってしまってます。 Option Base 0 Option Explicit Sub testAVe() Dim haba_array(5) As Long Dim i As Long, found As Integer Dim kbn As Integer i = 9 kbn = 1 found = 0 Do Until found = 5 i = i - 1 If Cells(i, 1) <> "" Then found = found + 1 If kbn = 1 Then haba_array(found - 1) = Cells(i, 2) - Cells(i, 1) End If End If Loop Cells(10, 4) = Application.WorksheetFunction.Average(haba_array) End Sub
292 :
291 :2013/02/22(金) 09:48:54.91
>>291 データを格納している配列変数haba_arrayが0~5の6個あるから
平均とると6で割ることになる
294 :
291 :2013/02/22(金) 10:19:24.04
>>293 一番基本的なことをすっとばしてしまった感じですか?^^;
確かにhaba_array(4)で合いました。
お騒がせすいません
データシートの内容が次の時 A B C D E F G H ・・・ 1 データ1(←集計対象の本体データ) 2 データ2(同上) 3 データ3(同上) ・・・・ 200 データ200(←集計対象の本体データはここまで、但しデータ数は適宜追加されて増えていく) 201 (ブランク) 202 (ブランク) 数行ブランク行を挟む ・・・ (ブランク) 210 データ210(←上記本体データと同じ構成だが、注記として表記) 211 データ211(同上) 212 データ212(同上) ・・・ 2XX データ2XX(同上) オートフィルターを設定 With Worksheets(ActiveSheet.Name) .Range("A1").AutoFilter _ Field:=6, Criteria1:=XXX End With F列(6番目)で抽出を掛けた場合 行は1からスタートして上記では、集計対象の本体データは200まで(適宜追加される) ところがオートフィルターを掛けると、ブランク行の下にあるデータ(210行~とか)も 一緒に抽出されてしまう 抽出範囲をブランク行がある前行まで(上記では1~200行、ただし行数は適宜増える) にするにはどうすれば良いでしょう
Range("A1").CurrentRegionじゃないの? 全然試してないけど。
298 :
297 :2013/02/22(金) 17:15:30.66
と思って今試してみたら、もともとオートフィルタってCurrentRegionが対象っぽいんだが、どうなのよ?
>>295 Rangeって何を意味するのか全くわからないのかな?
意味がわかれば、こういうことができるんじゃね?って推測できるし
テストコードで動作確認くらいできるだろ。
>>299 Rangeの意味について是非教えろください
302 :
297 :2013/02/22(金) 17:56:10.53
201~209行はホントに「データ無し」なのか? ブランクってスペースが入ってるとかじゃないだろうな。 A1でCtrl+Shift+*ってやってみ?それがA1のCurrentRegionだ。
304 :
デフォルトの名無しさん :2013/02/22(金) 20:44:07.67
>>301 299みたいな「仄めかし」のレスは誰にでも書けるんだよ
それこそRangeのこと理解して無くても書ける
それらしいことを言うだけ言って具体的なことは何も説明しないレスは
第3者が検証のしようもないただのゴミレス
305 :
301 :2013/02/22(金) 21:01:31.16
>>304 ほとんど答えを書いたんだけどなぁ。
直接答えを書くようなバカなことはしないよ。
CurrentRegionを使う方法もアリかもしれないけど俺だったらやらない。
>>302 のような懸念もあるわけだから。
オートフィルタをかける行の範囲が分かっているんだったら
どこをいじればいいのかだいたい察しがつくと思うけど。
だからそういうのを「仄めかし」というの 正解が一個じゃない以上、君の考えがそのうちのどれなのかも分からんし、 正解ではないかもしれない でもそういうかき方だと検証もしようがないでしょ ちなみに俺は質問者じゃないのでこの件が解決しなくても構わないが 思わせぶりな書きかたしてる人がどの程度のもんだか興味があるだけ。
なぜか2ちゃんでコーチングしてるつもりになってる奴いるんだよな
そうそう、たかがVBAでなにを得意げにっておもう
>>305 >オートフィルタをかける行の範囲が分かっているんだったら
>ただし行数は適宜増える
だから分かってないんだろ
>>295 試したところはブランクってのが全くの未入力なら
>>295 でうまくいくけど
そうじゃないなら自分でオートフィルタする範囲さがせ
>>307 えっ、質問スレで回答するのって
コーチングじゃないの?
311 :
デフォルトの名無しさん :2013/02/22(金) 21:52:31.04
>>310 えっ、質問スレで回答するのって
上から目線で偉そうにして優越感に浸りたいだけなんじゃないの?
質問です longlong型って構わず使っていいものですか? 控えた方がいいですか?
>>306 オートフィルタをかける範囲がわかればどこをいじればいいのか察しつかないの?
範囲がわからんというのはまた別個の話。
>>295 のこのコード。
With Worksheets(ActiveSheet.Name)
.Range("A1").AutoFilter _
Field:=6, Criteria1:=XXX
End With
こんなのテストコードでちょこちょこいじればすぐわかるだろ。
32bit環境で使わないならlonglong型使ってもいいんじゃね? 俺はそんなでかい数字扱うシチュエーション無いから使わないけど。
315 :
306 :2013/02/22(金) 22:11:35.80
>>313 ちょっと何言ってるか分からないwww
っつーか、俺が分かるかどうかの話じゃねーのよ
そーゆー「分かるやつには分かる」的な書き方自体が無価値だといってんの
俺はまず Worksheets(ActiveSheet.Name) に突っ込みたい
俺はまんこに突っ込みたい
>>309 一応、ブランク行の一つ前、データ行の最後を調べて抽出範囲を指定する方法を考えてみた
Dim AZ As Integer ' データ列の最終行(A列)
AZ = ActiveSheet.Range("A1").End(xlDown).Row
Dim rng As String ' オートフィルターを掛ける範囲
rng = "$A$1:$L$" & AZ
これで、範囲指定してフィルターを掛けてもやっぱりブランク行より下のデータも抽出されてしまう
因みに、データ列の最終行AZはブランク行の前の行番号になっているのだが
manko chinko manko chinko
320 :
デフォルトの名無しさん :2013/02/25(月) 10:30:59.52
"filesearch"でexcel2010のヘルプを見ると Microsoft Office XP (2000) 以降のオブジェクト モデルの変更 で、状態は非表示となっていて 非表示 メンバーは非推奨となっており、コードでの使用はお勧めできません。 ってでてくるけど、ファイルの検索には代わりに何を使えばいいんでしょ? dir関数のループで?
そこでまんこ
別にDirを直接使ってもいいし、Dirをラップした自作関数使ってもいいし FSO使ってもいいし、WinAPI使ってもいいし、.NET Frameworksの機能を拝借してもいい 非推奨だからって、使ったところで逮捕されるわけでもPCが爆発するわけでもないから 使いたければFileSearch使ったって構わない どうぞ、お好きなように
そんなもんなんでもええやろks
FSO使っとけば間違いない
シートに開発タブからボタンを2つ貼り付けて MsgBox Application.Caller で見ると、 ボタン1 ボタン2 ってそれぞれでてくるけど、これ名前を設定することは 出来ないんですか? フォームに貼り付ける奴ならプロパティのところで 例えばbtn~とかってするじゃないですか。
>>325 こいつばかwwwwww
ここで聞いたのが間違いだった
型を宣言するメリットって何ですか?
ちょと、早く、なる
暗黙の型変換によるトラブルを防げるかもしれない
インテリセンスが働くようになるので 入力の省力化と、スペルミス防止になる
変数のサイズもちょっと減るでしょ。
うんこして来る
335 :
デフォルトの名無しさん :2013/03/03(日) 21:08:07.97
336 :
デフォルトの名無しさん :2013/03/04(月) 09:16:43.52
337 :
デフォルトの名無しさん :2013/03/04(月) 18:39:34.65
officeで連携してVBAを組むのを学ぶ本を教えてくだされ 「Officeの達人」という本があるが、古い、高い(中古で)、臭い、のため利用は遠慮してます。
>officeで連携してVBAを組む の意味が良くわからん。
もしかして、昔のOffice Developerでやってたアレか? いまさらそれを学んでも意味無い気がするけど
340 :
デフォルトの名無しさん :2013/03/04(月) 21:53:45.02
excel単体だけでなくwordやpowerpointなどもvbaで動かしたいってことでしょ 俺も興味はあるけど
wordでもExcelと同じようにマクロの記録とかできるし、 クリックしたら文字の大きさや色を変えるとか、文章を勝手に改変とか一応はなんでも可能だけど 今ひとつ使い道が思いつかない
生データの蓄積と一次加工はAccess データの二次加工はExcel グラフィカルなアウトプットはPowerpoint とか?
そんな使い分けを想定できる頭の有る奴が あんな意味不明な質問の仕方すると思うか?
そんなこといわれても・・
初心者ですが、選択中の図形の名前を変数に代入する式を教えてください。
あ、できた
347 :
デフォルトの名無しさん :2013/03/06(水) 20:36:04.31
textbox1とtextbox2、ボタン1があります。 ボタン1を押した時、textbox1に入ってるテキストを2にコピーしたいのですが、 やり方を教えて下さい。
>>347 それをコードに落とせばいいだけじゃん。
何がわからないの?
349 :
デフォルトの名無しさん :2013/03/06(水) 21:02:36.70
>>348 レスありがとうございます。
どういう風に書けばいいかわからないです
フォームの編集でボタンをダブルクリックを押して
クリックした時のイベントになにか入力することはわかるんですが・・・
↓こんな風な記述を書けばいいんですか?正しい書き方がわかりません。。。
textbox1.text.copy.textbox2.text
350 :
348 :2013/03/06(水) 21:09:34.91
>>349 それくらい「vba テキストボックス」ググれば腐るほどヒットするよ。
351 :
デフォルトの名無しさん :2013/03/06(水) 21:39:46.39
Private Sub CommandButton1_Click() TextBox1.Text = TextBox2.Text End Sub これでもできません。。。。
352 :
デフォルトの名無しさん :2013/03/06(水) 21:57:43.51
Private Sub CommandButton1_Click() TextBox2.Value = TextBox1.Value End Sub
>>351 ん?これってTextBox2.TextをTextBox1.Textに代入する意味なんだけど。
TextBox2に文字列入力しても駄目ってこと?
因みに俺の環境Win7 ExcelXPではTextBox2に文字列入力すれば動作するよ。
代入が右から左に行くタイプの言語の欠点だよな。 データの流れが人間の感性に反している。 やはりCOBOLに勝るデータ処理言語はないと確信する。
コボルのおばちゃま まだ生きてんのかな
356 :
デフォルトの名無しさん :2013/03/06(水) 23:40:25.54
4教科くらいならそれでいいと思うよ
>>356 Range("D3") = IIf(chkKokugo, txtKokugo, "")
>>358 は、すでに入ってるデータが消えちゃう
Range("D3") = IIf(chkKokugo, txtKokugo, Range("D3"))
If End Ifくらい書けばいいじゃないか、何を躊躇う必要があるのか
End If を使わない書き方もあるけど If chkKokugo Then Range("D3") = txtKokugo
4つくらいなら普通にIfブロックを個数分書けばいいと思うけどね もっと多いなら、クラス使ってコントロールを配列にしちゃうが
364 :
デフォルトの名無しさん :2013/03/07(木) 08:56:35.42
For Each ABC In ie.document.getElementsByTagName("input") If ABC.getAttribute("value") = "確認する" Then ABC.Click Exit For End If Next Do While ie.Busy Or (ie.ReadyState <> 4) Sleep (10) Loop Sleep (1000) For Each ABC In ie.document.getElementsByTagName("input") If ABC.getAttribute("value") = "OK" Then ABC.Click Exit For End If Next
365 :
デフォルトの名無しさん :2013/03/07(木) 08:58:01.78
>>364 なんだけど
なんかいっつも
実行時エラー'70':
書き込みできません。
って出るんだけど何が原因なのこれ?
上手くいくときはうまくいくのに、
なぜかたまにこのエラーが出るの。
なんでうまくいくときがあるのにエラーが出るんだよ
ほんとゴミ。
If ABC.getAttribute("value") = "OK" Then
の部分がいっつも黄色になるんだけど
何が悪いのこれ
本当に頭にくるね
順序通りに書いてんだから順序通りに行動しろよこのゴミクズツールめ
この人は面倒そうだから釣られない
取得する前に、その要素が存在するかの確認をするのが基本 オマエがやってることは空き巣や強盗と一緒 普通は呼び鈴鳴らして、「鍵は開いてるのでどうぞ」と声が掛かってから部屋に入るのに いきなり入ろうとして「鍵掛かってて入れなかった」「入ったはいいが見つかって逮捕された」って文句言ってるレベル
>>365 お前がゴミクズのコードを書いているという見方はできないのねw
ボタンをクリックした時、 チェックボックスを全選択したいんだけど Checkbox1=true Checkbox2=true Checkbox3=true Checkbox1=false Checkbox2=false Checkbox3=false みたいにしてボタン2つ作ったほうがいいかな? 例えばcheckbox2だけがチェックしてある時、ボタン押した時 1と3がチェックされるべきなのか 2がチェック外れるべきなのかとか 考えながらやるのめんどくさいし・・・
お前の作りたいように作れよ
>>369 自分の作り方だと、全てチェックされている時のみ全解除で、
それ以外は全選択状態にするようなトグル動作をさせる。
すまんが教えろ下さい。
誤爆った。 Windows8 / Office 2010 Excelの条件付き書式を A1 : A5000 (セルの数5000以上ならOK) に対して手動で設定(条件は何でもよい) 保存して閉じる。そのファイルを開く問題ない。 上記作業をVBAで設定 保存して閉じる。そのファイルを開く→開かない。 なぜか知っている奴はおらんかー
excel.exeが終わってないとか
すまん。追加 ブックはxlsmだと問題ないんだけど そのファイルをxlsやxlsxで別名保存すると駄目なんです。
まずはコードを全部貼れ それが嫌なら、さようなら
>>374 ありがと。だがそうではなさそうだ。
>>376 そうだね。すまん。
下記をoffice2010でxlsかxlsxのブックで実行する。
ファイル保存→一旦閉じる。再度開く。→開けない。
ちなみにxlsのブックはoffice2003だと開くことが出来た。
Sub TEST()
Dim i As Integer
Application.ScreenUpdating = False
For i = 1 To 5000
ActiveSheet.Cells(i, 1).Select
With Selection
.Value = i
.FormatConditions.Delete
.FormatConditions.Add Type:=xlCellValue, Operator:=xlGreaterEqual, Formula1:="=10"
.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
With .FormatConditions(1).Interior
.PatternColorIndex = xlAutomatic
.Color = 65535
.TintAndShade = 0
End With
.FormatConditions(1).StopIfTrue = True
End With
Next i
Application.ScreenUpdating = True
End Sub
連投すまん。 こっちのコードでもNGだし、手動で設定した条件付き書式のセルを FOR文ループでコピーして貼り付けたりしても駄目だす。 Sub TEST2() Dim i As Integer Application.ScreenUpdating = False For i = 1 To 5000 ActiveSheet.Cells(i, 2).Select With Selection .Value = i .FormatConditions.Delete .FormatConditions.Add Type:=xlCellValue, Operator:=xlGreaterEqual, Formula1:="10" .FormatConditions(1).Interior.ColorIndex = 6 End With Next i Application.ScreenUpdating = True End Sub
最近まんこいじってないなあ
>>378 手元にExcel2007以降のものが無いから確認は出来ないけど
マクロ含んだブックだから拡張子がxlsmじゃなきゃダメなんじゃないか?
保存するときにfileformat=xlwrkbooknormalを指定して拡張子xlsで保存したらどうなる?
Workbook.SaveAs Filename:="hoge.xls",Fileformat:=xlworkbooknormal
xlworkbooknormalじゃなくてxlExcel8だったかもしれん
>>375 > ブックはxlsmだと問題ないんだけど
> そのファイルをxlsやxlsxで別名保存すると駄目なんです。
当たり前だろw
拡張子をxlsmにしないとマクロが保存されないんだっつのw
目的は条件付き書式を設定することなんだし、 それが済んだ後はマクロが保存される必要は無いんじゃないの?
>>373 64bit版Win8+32bit版Excel2013で
>>377 を使って試してみた。
xlsx形式は問題無く開けるけど、xls形式だと開くのに二分近くかかるな。
385 :
384 :2013/03/08(金) 22:13:04.84
xlsx形式の中身をバラいたら、同じスタイルが5000個定義されてた。 これは酷いw
VBA初心者ですが 同じセルにWindowsのクリップボードに記憶されている文字情報をペーストする命令を書いたのですが 高速で繰り返し行っているとなんかのタイミングでセルの中のカーソルが点滅を始め そうなると文字をペーストしなくなるのですが 手作業ならエスケープを押すと点滅しなくなりますがVBAで同じ事をやるにはどうすれば良いのでしょうか?
388 :
387 :2013/03/09(土) 19:55:10.29
>>387 Sub Macro1()
Range("A3").Select
ActiveSheet.Paste
Calculate
End Sub
このような超単純なコードです。ショートカットキーを割り当ててキーボードマクロのソフトで他のアプリと連携して連打させています。
処理が完了しない状態で次の処理を始めようとしてたり、手順に無理があるんじゃないの
>>389 おっしゃるとおりでした
マクロ連打速度の調節で解決出来ました。ありがとうございました。
なにげにエスケープキーのコマンドはVBAに無いのですね、、VBAですぐ終わらす作業のはずが奇問を踏んでしまったようでわかるまでに変に時間をとられてしまいました
VBAド初心者ですが 表の選択で Range("A1:F9").Select となっているところを 表の大きさが変化してもいいように 1セル選択した後に Control+Aのようなコマンドは無いのでしょうか? 宜しくお願い致します。
>>391 UsedRangeかCurrentRegion
UsedRangeはそのシートの使用範囲
下図ならA1:E5
CurrentRegionは空白の行列で囲われた表範囲
下図において、Range("A1").CurrentRegionならA1:B3
Range("D3").CurrentRegionならD3:E5
但し、右下のいろは表がC3:D5で、C列のような空白列の区切りが無ければ
Range("A1").CurrentRegionは右下のいろは表も含むA1:D5
A B C D E
┌─┬─┐
.1│あ│ 1.│
├─┼─┤
.2│い│ 2.│
├─┼─┤ ┌─┬─┐
.3│う │ 3.│ │い│ 5.│
└─┴─┘ ├─┼─┤
4. │ろ.│ 6.│
├─┼─┤
5. │は│ 7.│
└─┴─┘
393 :
391 :2013/03/10(日) 01:56:52.24
>>391 少々乱暴ですが1シートに1つの表であったため
Cells.Select
でとりあえずは解決できました。
>>391 RangeオブジェクトのCurrentRegionプロパティ
395 :
391 :2013/03/10(日) 01:59:12.07
>>392 おおおおお!これは素晴らしいですね!!!
ありがとうございます!
>>393 ニアミスでした。
396 :
391 :2013/03/10(日) 02:02:43.70
ななみの64に、excel2010を過日仕込みました。 すると、vista君では正常動作していたUserFormの移行(Unload と Show) が不安定になり、excelがハングして終了します。 Unloadが次FormのShowの後だと実行時エラー'2147417848(80010108)' オートメーションエラー、オブジェクトはクライアントから切断と 逆に次Formのshowが先でその後Unloadするとモーダルエラーです、 いずれのFormもモードレスで、vista&2007では正常でしたが 解決はさておき、同様のエラーって他の人にもあるのでしょうか
VBAs初心者ですが GOTO文のラベルの一部を変数にする事は出来ないのでしょうか? GoTo end 『変数1.2.3・・』 ↓ end1: 命令1・・ end2: 命令2・・ end3: 命令3・・ ・ ・ 間違った使い方かもしれませんが 実験的にこのようなコードを書こうとしています。 宜しくお願い致します。
>>392 通りすがりだけど、CurrentRegion なんてプロパティがあるんだな。
メモっておこう。
>>398 On 変数 Goto Sub1, Sub2, Sub3 ... でいいと思うけど、
どっちかと言うと
Select Case 変数
Case 1:
MsgBox "Sub1"
Case 2:
MsgBox "Sub2"
...
Case Else
MsgBox "???"
End Select
の方がいいと思う。
401 :
398 :2013/03/10(日) 18:23:47.89
>>400 Select Caseこちらが最適ですね、、
勉強不足でした・・ありがとうございました。
>>369 コマンドボタンじゃなくてチエックボックスにすればええやん
>>377 だけど
意見くれた人ありがとう。返事遅くなってすません。
>>380 元のxlsmのマクロシートで作成したものを、マクロを含まないシートに出力(xls/xlsx)して
配布するのが目的だったので提案の方法をしていたところ今回のことが発覚しました。
別名保存してもマクロを含まない新規ブックにコピーして渡してあげても駄目でした。
>>382 >>383 が意見してくれていますがそういうことです。
>>384 >>385 >>386 開けないと言ったが、厳密に言うと開くのに時間が掛かってしまうというのが正しいですね。
エクセルが40%くらいで止まってしまう。
対象セルを1000~2000にすると時間掛かるが開けるようになるのでPCのメモリも影響して
るのかも。
結果
>>386 の内容が影響してそうですね。解決方法はあるのだろうか。。
開けない、と、開きにくい、の間には埋めることのできない隔たりがあるんよ 情報は正確に伝えないといかんよ
>>404 申し訳ないです。次から質問するときは気をつけます。
今回の質問に関しては自分でもう少し調べてから出直してきます。
うんちが漏れそうなのと、うんちが漏れたのとを比較すればイメージしやすいと思う。
お、おぅ
1行ずつスタイル指定するんじゃなくて、まとめて条件書式設定すれば良いだけの気がするが
罫線で迷路を作るプログラムを教えて
思い出したけど 昔、「頭の体操」か何かで見た単純迷路がまさにそんな感じで 初めて見たときは感動したが いまはVBAで簡単に出来るんだな
罫線の迷路を解くプログラムを教えて!!!
まず3方向に罫線があるセルを調べ4方向目に罫線を引いてセルを四角く囲う そのセルを判りやすいように罫線と同じ色を塗る これを繰り返せば、色を塗られてないセルがスタートからゴールへの道になる。
>>413 そういうアルゴリズムがパッと浮かぶの凄いよな
単純にそのまま作ったらスゲー遅かった
行き止まり見つけたら逆順にたどって塗りつぶして行くようにしたら早くなった
Excel2010、オートフィルタで複数列をORで抽出する方法ってあるか? ApplyFilterの引数を見ても、1列のフィルタ適用のみで、1列内の複数値をAndやORや 複数値選択ができるのは分かるんだが。 よい知恵を貸して欲しい。無理ならあきらめる。
馬鹿には無理
つーか、Excelのオートフィルタは簡単だけど融通利かなすぎなので
俺は個人用マクロブックに、自作のフィルタクラスを作ってある
>>415 もVBA始めたなら、既存の機能を呼び出すだけの初心者レベルは卒業して
自分で新規機能を作っていけるようになろうよ
>>417 新規機能っていってもそれは既存機能の組み合わせだろうに。
初心者レベルの基準がアレだなw
Excelオブジェクトが提供するメソッド使うか VB構文が提供する関数などを使うかってことじゃね?
420 :
デフォルトの名無しさん :2013/03/14(木) 12:47:15.12
Windows7、Excel2010です 改行位置に太い罫線を挿入するマクロが欲しいのですが ググったら以下のマクロが出ました Sub TEST() Dim hpb As HPageBreak ActiveWindow.View = xlPageBreakPreview For Each hpb In ActiveSheet.HPageBreaks Range(hpb.Location.Address).Resize(, 8). Borders(xlEdgeTop).Weight = xlThick Next ActiveWindow.View = xlNormalView End Sub これを使ってみたところページの上側に罫線が入ります ページの下側に罫線を入れるにはどのようにしたら良いでしょう? セルの下側に罫線を入れるのはBordersにxlEdgeBottomを入れればよいのはわかりました あとは範囲の指定なのでRange(hpb.Location.Address)の所をだと思うのですが どうしたら良いか全くわかりません よろしくお願いします
421 :
デフォルトの名無しさん :2013/03/14(木) 13:22:38.18
Sleep(720000) (12分) にすると、この12分間VBAは操作できなくなるし、なんか若干重くなるんだけど この12分間VBAも止めさせる方法ってないの? Exit Subで一回退去させてからの12分後復活みたいなことってできないの?
>>415 VBA関係ないのでよそで聞いてください
>>420 Range(hpb.Location.Address).Offset(-1, 0).
>>421 そもそもVBAにSleepなんてないが何の事を言っているんだ
指定時間でプロシジャー実行したいならApplication.OnTime使え
423 :
デフォルトの名無しさん :2013/03/15(金) 10:29:06.63
会社のWebシステム(たぶんイントラと言うのだろう)に (1)ログインして (2)テキストボックスにあるキーワードで検索して (3)出てきたデータがあります。 これをExcelのシートにコピペみたいな感じでインポートするのを 全自動で行うことはVBAで可能ですか? もし可能なら一般的にどういうコード、どういうステートメントを使うか教えていただきたいですが。
それやるんだったら、直接DBにADOで接続してSQLでデータ取ってきたほうが楽じゃね? システムがどうなってんのかは知らんけどさ
425 :
423 :2013/03/15(金) 11:08:29.25
>>424 レスありがとうございます。
ADOって何ですか?
ActiveX Database Object
つーかイントラネットでのことは、社内のシス管に聞けよ マクロやプログラムによるログインの自動化とか禁止している場合もあるし 勝手にやると懲戒処分&損害賠償まで発展しかねない話だからな
IEをVBSで操作するれば簡単にできそうだけど
ここで問題になるのは、 技術的に実現出来るかどうか、 と、 それを実行して良いかどうか、 の違いだよね
で、それを両方解決できるのが社内のシス管 そして少なくともここでは、後者については何も言えない
ここでは技術的なことを語ればおk
そうだね 特定社内の規則に関わることを話しても仕方ないから そういうのが関わる案件は無視して そういうのが関わらない案件について、技術的なことを語ればおk
俺が思うにXMLで返してもらえばいいと思う
フォームに入力、ボタンをクリック、ブラウザやダイアログに表示された文字列を取得、 技術的にはどれもVBAで可能だけど、状況によってはちょっと面倒なことになる場合もある あと、その手のプログラムは絶対に自分だけで使うこと わかってない他人に使わせると、絶対にトラブルを起こす
REST APIを作ってもらえば楽
CreateObject("InternetExplorer.Application")でいいじゃん
437 :
デフォルトの名無しさん :2013/03/16(土) 05:39:11.89
VBAを学べる初心者用の良いサイト教えてください
438 :
デフォルトの名無しさん :2013/03/16(土) 06:11:10.24
>>438 ありがとうございます
残念ながら私は全くの初心者です
一から学べるサイトはありませんか?
>>439 「excel VBA 入門」くらいググれよクソが!
ネットで済まそうとせずに素直に入門書本屋で適当に見繕って買えよ…
442 :
デフォルトの名無しさん :2013/03/16(土) 10:15:10.06
直接DBにADOで接続するには どんな手段でやりますか? なにかソフトウェア使いますか? それともVBAでできますか?
だからここは知恵袋じゃねーって何度も言ってんだろーが!
VBAでも出来るかもしれないし出来ないかもしれないし VBA以外でも出来るかもしれないし出来ないかもしれない
いいか? 俺が先週まだ行ったことないラーメン屋に行ったときの話だ。 メニューに写真もなかったのでそこの店員にラーメンを注文しようとした時に何ベースのラーメンなんですか?と聞いたら店員はこう答えたよ。 『スープは企業秘密なんで教えられません』と。 俺は苦笑いで、そうですかと答えたよ。 まぁそういうことだ。
448 :
442 :2013/03/16(土) 12:22:29.74
>>445 物をつくってください
>>446 為せば成る
為さねば成らぬ何事も
成らぬは人の為さぬなりけり
各データベース用のODBCドライバをインスコせよ。 以上終了
450 :
デフォルトの名無しさん :2013/03/16(土) 14:03:56.38
成せば成る成さねば成らぬ何事も それがロボットロボ根性 ロボコンロボット世界一
VBA初心者ですが Excel起動時に毎回VBEを開くのは手間なのですが自動で両方立ち上がるようにする事は出来ないのでしょうか?
452 :
デフォルトの名無しさん :2013/03/16(土) 14:17:25.07
451の母です。 わたしも知りたいです。 いままでAlt+F11でやってましたがもっといい方法あるのかな。 娘を助けてあげてください。
454 :
451の母 :2013/03/16(土) 14:24:27.81
>>453 Sub Auto_Open()のセクションに書くんだろうけど
なんて書くの?
VBEを開くコードなんてあるの?
だから、それを調べろって 間違いなく出来る(検証済み)から まあ女のフリしてゴネてれば、そのうちバカが釣られて 回答してくれるかもしれないけどなw
456 :
デフォルトの名無しさん :2013/03/16(土) 16:01:13.60
馬鹿発見
在日発見
御託はいいからさっさと VBEを自動で立ち上げる方法を解説したページのURLを貼れば良いんだよ!
一体いつまで待たせる気だ!!!!!!!!!!!!!
朝鮮人は気が短い
462 :
デフォルトの名無しさん :2013/03/16(土) 18:40:24.30
>>423 あー、よく使ってるよ。
末端ユーザーでも、システムの機能をお手軽に追加できるのがよいとこ
だよね。
ホントは、この方法だと、自動とはいえ、抽出に時間かかるから、DBから直
接とってきたいとこだけど、そのDBの構造がブラックボックスの場合は、
これしか手段がない。
やり方は、ネット検索すれば、いろいろでてくると思う。
463 :
デフォルトの名無しさん :2013/03/16(土) 18:47:42.47
機能追加やDB抽出お願いしても、SEに「時間がない」だの「技術的に難しい」 だの、言われたときの事務屋の最終手段がVBAによるWebシステム自動操作。 おかげでそこらの保守SEより、コードをいっぱい書いてる気がする。
464 :
デフォルトの名無しさん :2013/03/16(土) 20:44:11.05
>>463 どうやってやるのかヒントでも教えていただけないでしょぅか?
馬鹿には無理
InternetExplorer.Application DOM操作 スクレイピング
467 :
デフォルトの名無しさん :2013/03/17(日) 00:38:40.63
>>464 >>1 ★3に抵触しているような気もするけど、ヒントなら。
「IE」と「VBA」で、ググれば、サンプルコードはいっぱいある。
あとは、Webシステムのhtmlコードから、各ボタンの名前を読み取る。
コードを読ませないよう右クリック禁止のシステムは多いけど、それこそ
VBAによって、すり抜ける方法はある。
末端ユーザーかな?なら、テスト環境もないだろうから、本番でイキナリ
試すしかないけど、照会ならともかく、登録やるときは、慎重にね。
VBAの解説サイトで●●を多用すると大変になるとか書かれているのを目にする事がよくありますが 目的の結果が得られるかどうかが大事であって大変かどうかはプログラミングを組む上で 思考の妨げになるだけではないかと思うのですが一体何なのでしょうか?
469 :
デフォルトの名無しさん :2013/03/17(日) 01:18:19.96
なお、htmlコードが読み取れず、各ボタンや、テキストボックスの名前が 分からなくとも、その見たまんまの名称や、何番目に出てくる要素なのか を探れば自動操作は可能。 が、多少めんどい。
自分のコードも書いて3日経てば他人のコードっつってな、 自分で書いたコードもちょっと経ってから見ると分かり辛いんだよ 目的の結果が得られる事が最重要ではあるけど、それだけじゃ全然駄目
変数名に日本語も使いだしたら後のメンテナンスが楽になった
変数宣言の必要の無い言語で日本語使うと 表記揺れが原因でエンバグしそう
473 :
デフォルトの名無しさん :2013/03/17(日) 02:05:51.09
Access 2.0のAccess Basicで変数名とかに 全角のスラッシュを使ってるシステムがあって バージョンアップのとき大変なことになったなー
VBは文法がプログラミングを組む上で 思考の妨げになるのでははないかと思う
未来の自分が他人なら遠慮する必要は無いな
まあ相手が顧客じゃなく自分なら、遠慮は「必ず要する」わけではないけど 遠慮しておかないと泣くのも自分だからなw 俺も初心者の頃、とにかく早く完成させることだけを目指して、何の配慮もせずにコード書きまくって あとでちょっとした機能追加しようとした時にもわけわからん状態で泣いたことが何度有ったことかw
>>471 ああ、自分もオブジェクト名・変数名は日本語だわ。
英字だと、コードを開くたびに、この変数は何だっけとなってしまう。
やはり俺は日本人なんだな。
未来の他人が自分なら遠慮しといた方が良い
479 :
デフォルトの名無しさん :2013/03/17(日) 09:31:20.25
このスレって、もしかしてシステム会社の職業SEが多いのか? VBならともかく、VBAは、事務屋がよく使うもんだと思っていたのだけど。
おれは前者だよ 本体の周辺ツールとしてEXCELが絡んでるから
昔の社内SE w ホストからデータ落としたのをExcelで帳票にしてくれ~なんて依頼多かったよ w 今はその時に覚えたVBAで自分の趣味のものをちょこちょこ作ったりしてる
482 :
デフォルトの名無しさん :2013/03/17(日) 10:11:06.05
社内SEなら、VBAを必要とするのも分かる。 ウチは、社内SEがいないから、事務屋の自分がやるしかない。 契約している別会社の保守SEはいるし、データ抽出やデータ登録も契約に含 まれているはずなのだが、頼んでも、時間的にムリとか、難しいからムリ とかよく言われる。 なら、自分で作るからデータベースの仕様書よこせ と、いえないところが、 パッケージシステムの哀しいところ。 何千件もの手動登録は論外なので、しょうがないから、自分でWebシステム を自動で動かすコード作って、エクセルにコピペしたデータをシステムに 流し込んでる。
EXCELはDBとしても使えます(キリッ)
俺は業務課だぜ。
みんな苦労してるね。自分も事務部門だ。 不況で外注予算が大きくカットされちゃって データ加工程度の目的だと自分でやるしかないの…シクシク 自分でやってバグを出すと大変なことになるから 自分の実力と結果検証の容易性との兼ね合いを測りながら 仕様決め・開発するのに凄く神経を使う。 ユーザー開発に手当が出ないのは理不尽だ。
Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, Formula1:="=cells(1,1)" 条件付書式で値をセルで指定するにはどのようにしたらよいでしょうか。
487 :
デフォルトの名無しさん :2013/03/17(日) 11:15:04.05
フィルター済みで非表示の行が多いシートに 他シートの長方形の領域のデータをそのままコピペするためのコードは どうなりますかな?
>>486 質問の意味がよくわからん
やりたいのはこういうこと?
Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, Formula1:="=" & Cells(1, 1)
489 :
デフォルトの名無しさん :2013/03/17(日) 11:15:26.45
馬鹿には無理
>>486 どうやるか分からないときは、マクロの記録をとってみるといいよ。
>>487 簡単にやる方法はないので、1行ずつループして、Visibleを調べながらコピー
俺には無理 おまえにも無理
みんなやさしいなあ
>>487 特定の条件の行にデータを入れたいならコピーじゃなくてVLOOKUPあたりで代用できそうな気がする
496 :
486 :2013/03/17(日) 11:27:06.90
>>488 ありがとうございます。これでできました。
>>485 事務系の人もちゃんとバグのリスクとか検討してるんだね
セル範囲のコピーについてですが、 転記先.Cells(2, 1).Select だと、正常に選択できるのですが、 lRow = 転記元.Cells(Rows.Count, 1).End(xlUp).Row 転記元.Range(Cells(4, 2), Cells(lRow, 8)).Copy Destination:=転記先.Cells(2, 1) でコピーしようとすると実行時エラー1004が出ます 転記先と転記元は別のブックになっています なぜエラーになるのでしょうか?
こうしたらうごくの? lRow = 転記元.Cells(転記元.Rows.Count, 1).End(xlUp).Row 転記元.Range(転記元.Cells(4, 2), 転記元.Cells(lRow, 8)).Copy Destination:=転記先.Cells(2, 1)
>>499 ありがとうございました
うごきました
転記元.Range(Cells(4, 2), Cells(lRow, 8)).Select
では正常にSelectされたので見落としてました
501 :
デフォルトの名無しさん :2013/03/17(日) 17:32:46.66
>>497 事務系だと、管理者権限や、データベースの仕様書、テスト環境すらないからねえ。
かといって、手動による気のめいる登録作業なんかで残業はしたくないから、
自分でやるしかない。
特にWebシステム自動操作による登録作業は、バッチを流すに等しい作業な
わけで、とても気を使う。
というか、システム部門が不甲斐なさすぎる。
銀行の統廃合により、何千件もある銀行コードを手動で修正しろとか、
言われた日には、シメたくなった。
さすがにこんなんまで、コード作成してやってられないから、
(簡単にできることはできるが、アホらしくて、意地でもしたくない)
担当者に、手動はありえんだろうといって、考え直させた。
>>500 >転記元.Range(Cells(4, 2), Cells(lRow, 8)).Select
>では正常にSelectされたので見落としてました
「転記元」シートがアクティブならいいけど
違うシートがアクティブだったならエラーになるはず
仕事なのに何甘えてんだよ つべこべ言わずにやれよ
504 :
桃白白 :2013/03/17(日) 20:46:31.65
>>501 桃白白を雇え。銀行コードを入力するだけなら桃白白にまかせろ。
お、桃白白もsage覚えたのか? それとも偽物か? まあ仮に偽物だとしても「本物だ」って言うんだろうけど
506 :
デフォルトの名無しさん :2013/03/17(日) 22:14:06.32
SEの権限なら簡単なSQLで片付くとわかっているのに、なんで手動で何千件も 登録しなきゃいけないんだよ。 自分だけならSQLの実行権限なくとも、VBAで簡単にすませられるけど、それが できないヨソの事務職が大迷惑なんだと、マジレスしてみる。 いや、無駄な残業代で稼ぎたいっていうなら、手動でやってもいいかもだけど。
VBA初心者ですが ' をつけてコメントをつけられるようですがこは沢山書きすぎると処理が遅くなったりするのでしょうか? 速くするために最終的には消した方がより速くなるのでしょうか?
遅くなるよ ここ数年くらいのパソコンだと、コメントを1000000行書いて 0.001秒遅くなるかどうかってくらいだけど つまり、厳密に言えば遅くなるけど、非常識なほど多くのコメントを書いても 体感できない程度の差なので気にする必要なし
自分で時間測ればいいじゃん、処理開始前と処理開始後の経過時間の差分でわかるでしょ
ワロタ
バカみたいな手作業でも給料くれるんなら、俺そんな会社で残業したいわ こっそりVBA回しながらスマホで2ちゃんねるとyoutube見てればいいんだから 手作業のスピードが出るように For ~ Replace ~ Sleep 5000 Next とかやればいいんだろ?
つか、なんで残業とかいう話になるかわからん 今日で終わらなかったら、明日やれよ そんだけ時間がかかるんだろ?
本当に違いが出るか調べてみた
使ったのは2010の64bit版、Win7、メモリ8GBのマシン
まずはジャブ、1万行のコメントをテキストエディタのマクロでサクっと作ってVBEにコピペ
結果、コピペ前と実行時間変わらず、誤差以下で測定できず
次に本番、百万行のコメントを以下略、
結果、貼り付けた瞬間VBEが落ちて計測不能でした
というわけで
>>508 は嘘ということが判明しました
コメントは1000000行書けません
VBEのコードサイズの制限ってどこかに書いてあったっけ?
516 :
508 :2013/03/18(月) 02:19:25.98
×コメントは1000000行書けません ○コメントは1000000行分貼れません だろ。やっても無い事書くなクズ。
1行3バイトとして100万行だと30メガバイトのソースになるけど、 VBEって1モジュール64Kぐらいが限界だと勝手に思い込んでた
>>508 は100万行のソースで遅くなるかどうかをいっぺん自分で確かめてみるといいよ
たぶん予想外の結果になるから
>>514 その締め切りではできませんってなんで言えないの?
無理な締め切りでもやっちゃう馬鹿がいるから、次も無理な締め切り押し付けるんだよ
ちょっとは考えろ
>>519 動かせない締め切りというのが世の中にはありまして
>>520 何が言いたいんだお前は。
時間が足りないのなら人増やさせるか、別の手段を考えさせろよ。
ブラックvsホワイト
正論振りかざすのは気持ちいいだろうけど 世の中強者ばかりじゃないのに・・・
相手を叩けば、自分が偉くなると勘違いしてる奴が多いからな、2chには と嘆いてみる
バイトでもできる仕事で給料貰えて、しかも残業代までゲットできる方が強者ですね、わかります
つか、嫌な仕事させられてかわいそうだねーとか 君の上司って無能だよねーとか、そんなこと言って欲しいの? ガキかよ
>>521 公務員増やすと国民の声がうるさいんです。
いや、周りの事務職連中は無能だが、俺はVBAでちゃちゃっとかたずけられるぜっていう自慢をしたいんでしょ。
うわ、なんかこいつ腹立つわ。 公務員だから、生産性あげる努力なんかしませんってことかよ。
公務員は予算を使い切り、次年度の予算を増やすのが仕事です。
万が一にも生産性を上げて予算を余らせるようなことになると、出世が危うくなるのです。
これはまた、でかい釣り針ですな
>>482 > なら、自分で作るからデータベースの仕様書よこせ と、いえないところが、
> パッケージシステムの哀しいところ。
システム担当者以外に仕様をあかしたり、データベース操作権限を与えたりする方が怖いんじゃないの?
>>482 その場合は契約違反を通報するところから始めるのが筋では?
まずは上司に
データ抽出を結局やってもらえなかったとしても、うまく交渉すれば保守費を値切れる可能性も出てくる
上のような書き込みを見ると、喩え社内向けWebアプリケーションでも、CSRF対策なんかを きちんとやる必要があるなぁと思うね。
そんなのあたりまえでしょ
537 :
デフォルトの名無しさん :2013/03/18(月) 22:43:31.05
なんか知らんうちに、他の人がどんどん回答してる・・・。
釣られないようにね。
>>533 建前上はそう。でも、結果的に何千件もの手動作業が発生するようでは、
本末転倒。システム担当者以外に仕様があかせないのは、まあ当然なので、
ユーザーとしては、それをすり抜ける方法を探すしかない。
>>534 軽微なデータ抽出はするという文言なので、何が軽微かを決めるのは、
SEになる。こちらが軽微だろうと思ってても、SEの裁量で断られる。
数十万程度の保守費なら、まあそれでも納得するけど、そんなレベル
じゃあないから、納得いかない。
>>535 正規の権限でログインしている場合に、その対策は効果あるのか?
>>537 >なんか知らんうちに、他の人がどんどん回答してる・・・。
>釣られないようにね。
誰だよおまえ
539 :
デフォルトの名無しさん :2013/03/18(月) 23:31:45.63
あ
540 :
デフォルトの名無しさん :2013/03/18(月) 23:35:31.76
↑ 書き込み出来なかったのでおかしなの入れてしまいました。 質問です。 1 satou 2 satou 3 satou 4 yamada 5 yamada 6 satou 7 yamada ↑ 上記を 1-3,6 satou 4,5,7 yamada と置き換えるにはどのようにすれば良いでしょうか。 1個ずつIFで確認? また上記の逆も出来れば嬉しいです。
541 :
桃白白 :2013/03/18(月) 23:42:51.58
>>540 ナイスクエスチョンだ。そうだな、桃白白なら一個ずつIfで確認してDictionaryか
何かに放り込む。
VBA初心者ですが VBAを駆使して何もかもが自動で計算処理される無人の会社を作ることは可能なのでしょうか?
はい
544 :
桃白白 :2013/03/19(火) 03:23:49.61
電話応対もVBAで出来るのでしょうか?
546 :
桃白白 :2013/03/19(火) 03:54:57.95
>>545 ACCESSで通話時間を管理するシステムなら見たことある。
何時何分に何番から電話がかかってきて通話時間がこんだけだったってのを
データベースに追加していくやつ。
547 :
420 :2013/03/19(火) 08:42:16.94
>>422 思うとおりに動きました!ありがとうございました。
>>544 会心という割には微妙な気がする。
宿題スレならこれでいいと思うけど。
549 :
デフォルトの名無しさん :2013/03/19(火) 10:39:56.51
ドラクエの「かいしんのいちげき」は (a) 会心の一撃 (b) 快心の一撃 (c) <その他> のどれですか?
550 :
桃白白 :2013/03/19(火) 11:48:46.01
>>548 どこがよ?桃白白が全力を注いだ会心の作なんだよ。
心外、桃白白心外。そして絶妙。
会心の作=出来が良い ではないからな 初心者の会心の作は出来が悪いし ベテランの凡作は、初心者の会心の作より遙かに出来が良い 本人が会心の作というからには会心の作には違わず そしてそれが、そいつの実力の限界ってことだ
>>552 内容関係無いけど、revertってなんかニュアンス違う気がする。
展開っぽい単語使った方が好み。revertの元が無い場合もあるから。
お願いします。 A列に、「テニス」「野球」「ゴルフ」 B列に、「サッカー」「テニス」「ゴルフ」「スキー」 というデータがあり、 C列に、=IF(COUNTIF($A$1:$A$3,B1)=0,B1,"") という計算式を入れてます。 A列になくて、B列にある競技をC列に表示させる式のつもりなのですが、上手く動作しません。 ここでは、サッカーと、スキーだけをC列に表示させたいです。 C1のセルに=IF(COUNTIF($A$1:$A$3,B1)=0,B1,"") C2のセルに=IF(COUNTIF($A$1:$A$3,B2)=0,B2,"") C3のセルに=IF(COUNTIF($A$1:$A$3,B3)=0,B3,"") C4のセルに=IF(COUNTIF($A$1:$A$3,B4)=0,B4,"") というデータが入っているのですが、なぜかC1~C4すべてのセルにC1の値が入ってしまいます・・・ ここでは、「サッカー」が全てのセルに入るという感じです。 ちゃんと、C1にサッカー、C2に空白、C3に空白、C4にスキーが入るようになりませんでしょうか?
>>548 どこが微妙なの?いいと思うんだけど。後学のために教えて!
558 :
548 :2013/03/19(火) 20:06:14.33
>>555 >>550 細かいこと言っていたらキリがないのでポイントとなるところだけ。
・コメントが一切ない。
Matomeru()のローカル変数value1、value2、stateって何?
っていうかMatomeru()はどのように数値をまとめるのか概要がわからない。
・GetSouce()で"satou"、"yamada"しか設定していない。
>>540 の内容をそのままやってるだけ。
学校の宿題ならこれでいいと思うけど、やりたいことは同じ名前のものをまとめたいことだと思う。
"satou"、"yamada"しか纏められないツール作っても何も嬉しくない。
・マジックナンバーの多用
一番気になるのはMatomeru()の中のSelect Case ステートメント。
stateの値によって条件分岐してるけど、どういう状態なのか見ただけでは全くわからん。
前後のコードを解読しないと解らないというのは、メンテの面でよろしくない。
こういうのをコメントで対応するというのを見るけど、修正していくうちにコメントの修正を
忘れたりするからConstステートメントできちんと名称をつけておくと可読性が上がる。
559 :
桃白白 :2013/03/19(火) 20:26:48.44
560 :
桃白白 :2013/03/19(火) 20:31:29.11
___
/ \
/ \ 桃白白超怒られた
/:::::: ヽ
>>552 には勝てる気がしないしさ
|::::: i 空きれい
ヽ::: __/
/:::: \
|::: _)
|:::: i
\___、_____ ノ _)
counterの値で分岐するところ、Else IfじゃなくてCaseを使いたい
VBAでクラスの継承や、 Linq、ラムダ式等の.NetFreamworkの 機能を使える様にするには どうすれば良いですか?
564 :
デフォルトの名無しさん :2013/03/20(水) 06:09:06.84
コンボボックス(ActiveXコントロール)に項目(値と表示)を追加するにはどうしたら いいんでしょう? Worksheets(1).ComboBox1.AddItem あああ Worksheets(1).ComboBox1.AddItem いいい みたいな方法だと 値=表示 になってしまいますが、表示と値(コードとか)を別にしたいです。 (「あああ」を選ぶとValueが「1」、「いいい」を選ぶとValueが「2」) htmlで言うところの↓こんな感じです。 <select> <option value="1">あああ</option> <option value="2">いいい</option> </select>
馬鹿には無理
>>564 値=表示はなぜダメなのかな。
数値でやると何を選択したのかコードが解りにくくなると思うけど。
>>564 ItemDataプロパティ
但し、組み込みのActiveXコントロールはItemDataプロパティが無いタイプだったはず
でもフリーでItemDataプロパティ使える外部ActiveXコントロールのComboBoxあるからそれ使え
外部ActiveXコントロールの使い方はググれ
あるいは連想配列とかに値を格納しておく手もある
' 値の格納
ComboBox1.AddItem "あああ"
Collection1.Add 1, "あああ"
' 値の取得
変数 = Collection1(ComboBox1.Value)
更にそれを発展させて、ComboBoxクラスを作っても良し
Public Sub SetControl(TargetComboBox As MSForms.ComboBox)
で、対象のコンボボックスをクラスのモジュールレベル変数に参照代入して
Public Sub AddItem(Text As String, Value As Variant)
で上記のようにコンボボックスとコレクションにそれぞれ値を格納して、あとは
Public Property Get ItemData(Key As String) As Variant
ItemData = mCollection(Key)
End Property
Public Property Get SelectionItemData() As Variant
SelectionItemData = mCollection(mComboBox.Value)
End Property
で任意の値や選択中の値が取得できる
>>563 基本的に無理
ある程度は擬似的に実装できないことも無いが、擬似的な実装を途中まで組み上げてから
質問に来るならまだしも、全く手も付けずに質問に来るレベルの奴には無理だろう
>>564 ComboBoxで選択した行をListiIndexで取得
得られた値を元に表示したいものを選択する
質問です シート1に換算値データベースがあります シート2に比較用のデータがA列とB列にあります シート2のA列、B列のそれぞれのデータの換算値をシート1から取得し 換算値B'-A'の計算をFor文で回したいのですが それぞれの値を変数に格納する方法は思いついたのですが、 他に良い(動作が軽い)方法はないでしょうか?
>>589 とんでもない行数のプログラムにするとか画面遷移だらけとかにしない限り
体感速度は大して変わらんのでは
思ったとおり作ればいい
変数に格納するよりかシートから直接参照したらだめなん?
>>564 Sub 初期化()
Dim list(2, 1)
list(0, 0) = "あああ"
list(1, 0) = "いいい"
list(2, 0) = "ううう"
list(0, 1) = 1
list(1, 1) = 2
list(2, 1) = 3
ComboBox1.list = list
End Sub
Private Sub ComboBox1_Change()
If ComboBox1.ListIndex < 0 Then Exit Sub
MsgBox "選択した内容:" & ComboBox1.list(ComboBox1.ListIndex, 0) & " 値:" & ComboBox1.list(ComboBox1.ListIndex, 1)
End Sub
>>569 EXCELやめてACCESS使う
VBAやめてVLookupと計算式でシートで完結させる
どっちにしてもこのスレの範囲外だな
EXCELとVBAでやりたいなら、どっちのシートもまとめて2次元配列にぶちこんで
それを操作するのがたぶん一番早いかと
>>570 シートのデータ参照は遅いので、ある程度のデータ量だと結構な差がでるぞ
574 :
桃白白 :2013/03/20(水) 13:13:45.02
>>567 そうですか。ありがとうございます。
環境下に.Netインストールして.Net側で作ったクラスを呼び出せばいいだけなので別に
疑似的に作る必要性も感じないのでそこまではいいです。
VBA初心者ですが ふとサンプルコードを見ていて発見したのですが プロシージャの呼び出しで プロシージャ名を書いただけの場合は行ったきりで帰ってきませんが Callをつけて Call 名前 ・ ・ End Sub Private Sub 名前() ・ ・ にするとプライベートサブの命令が全部終わると元のプロシージャへ戻るようですが こんなルールは一体何の所何を見ればわかるのでしょうか!? これを知らなかったがためにえらい苦労しました・・w Excelを解説しているサイトを3つぐらい見ながら基礎を勉強しましたが この説明は書かれていませんでした 残念無念。
>>576 残念無念なのはお前の頭
Callを付けずにプロシージャ名だけで呼んでも戻ってくる
以下サンプル
Sub a()
Debug.Print "a1"
b
Debug.Print "a2"
Call b
Debug.Print "a3"
End Sub
Sub b()
Debug.Print "b"
End Sub
え?
はい? Callを付ける付けない、引数を括弧で括る括らないで、 引数が参照型になるか値型になるかに影響が出ることはあっても、 呼び出し元に戻らない事なんてあるんですか? 再帰呼び出しでもしているか、End SubのSub部分が抜けたりとかしていませんか?
こうすれば戻らないよ。 Sub a() Call a End Sub
>>569 シートをテーブルと見立ててSQLを投げる
>>581 戻らないけどスタックがオーバーフロー起こして落ちるよ
>>577 >>579 >>580 >>581 まだ経験が浅い物で
最初に作った物が相当入れ子になっている物でしたので
テストしたコードがまずかったようです。
プロしジャー名だけでも戻るなら簡単ですね
586 :
584 :2013/03/20(水) 23:23:35.91
帰ってこない原因がわかりました Dim Name As String Dim Number Name = Number & (Range("A7") + 1) Application.Run Name End Sub このように条件に応じてApplication.Run を使って次のプロシージャへ飛ばしていました この場合帰ってこないようです
>>576 それはルールというより構造化プログラミングの基礎じゃないかと。
VBA以前の話だから、サイトであまり詳しく記載していないと思う。
>>586 Nameは予約語だから変数で使っちゃダメ。
Nameは予約語じゃないぞ 子メンバとしてはよく使われる語句だけど 親オブジェクト.Nameで使われるだけなら Nameという名の変数とは全く干渉しない まあ変数で使わない方がいいのはその通りだが 予約語だからってのは間違いなので、一応突っ込んでおく
残念、問題ない
つーかVBE使ってるなら予約後はエラーで赤文字になるだろ。 そうならないものなら、使わない方が良いものはあっても使っちゃダメなものは基本的に無い。
GoSubとGoToの違いだな
595 :
デフォルトの名無しさん :2013/03/21(木) 00:26:46.17
>>586 いやApprication.Runでも戻ってくるよ。
>>593 たとえば、これは2行ともエラーになるけど
Sub aaa()
Dim If As Integer
Dim For As String
End Sub
こんなのはエラーにならないんだよな
Sub aaa()
Dim Range As Integer
Dim Cells As String
End Sub
じゃあ使ってもいいと思うか?誰だってやめろと言うと思うが
その前に変数名の頭文字が大文字なのは嫌い
変数名を既存のメソッドやプロパティと同じにするのは、GoToを使うなってのと同レベルの話 仕様上は可能でも「行儀が悪い」
行儀が悪いのと予約語かどうかは別問題だとは思うけど、 クラスやメソッド、プロパティの名前の付け方に ここまで無頓着なのは、旧VBやVBAだから許されるんだよな。 JavaやC#、今のVBでそんなこと話していたら周りから失笑されるレベル。
それと、Nameと言う名前を付けちゃいけないのかと言うと場合にもよるがそんなことはない。 例えば何かクラスを作ったとして、それに名前を持たせたい場合、Nameプロパティを持たせるのは ごく普通にある話。 他のクラスにもNameと言うプロパティを持たせておいて、同じ様に名前を取得する読み取り専用の プロパティにでもしておけば、インターフェース使えば別の型のクラスから同じコードでそのクラスの 名前を取得出来る。 て言うか、クラス扱うなら基本中の基本の話だから。 クラス単位で定義されているだけだから当然予約語ではないし、 その辺が理解出来ていないとこれ以上話しても意味がない。
質問させてください。 OS:XP Ver:2010 モジュール:firestorage.jp/download/2ea5a67d8415505695ea32e683aac76d6eabf535 実行すると、Function シート2の .Font.ThemeColor = xlThemeColorDark1 でエラーになります。エラー回避の方法を教えていただけますでしょうか?
>>601 On Error Resume Next
おお、ようやっと書き込みができた…。 601のモジュールは、firestorage.jp/download/453df87218741574c4c8c47d44f24c1c0a512c46 を起動させるとなぜか2番目のシートの演算がおかしくなる(E列以降の関数がすっ飛ぶ)ので、分割しました。 ファイルサイズが10MBほどあるため、再計算機能をデフォルトで切っている状態でマクロを動かしています。 1.601の問題解決 2.上記関数がすっ飛ぶエラーの回避 3.可能であれば、上記全体稼働時の高速化(3分以上かかっています) 良かったらお願いします。
>>600 変数名とプロパティ名を同列に語る男の人ってサイテー
>602 ありがとうございます。エラー回避できました。
>>603 めんどくせえ
専ブラからワンクリで飛べるようにしてこい
LVが足りなくてリンクが張れませんでした。 >606さん、ごめんなさい。
こんなサンプルでわざとスタックをオーバーフローさせてみた 何秒ぐらいかかるかと思ったら、F5を押したと同時にエラーが出た 意外だったのは落ちた時のlの値がマシンによって全然違ったこと てっきりVBAのスタックサイズは固定だと思ってた Dim l& Sub a() l = l + 1 a End Sub
610 :
桃白白 :2013/03/21(木) 04:14:51.44
>>603 Function シート2について。
ResizeのあとにSelectしないと追加されたFormatConditonオブジェクトと
色を設定するFormatConditionオブジェクトが異なることになるっすよ。
高速化について。
コードを書き換える前に時間がかかっているのはどの部分なのか見極めるのが大事だって
どっかのナイスガイがいってた。なのでまずは関数ごとに処理にかかる時間を測定しちゃいなよ。
関数がすっ飛ぶエラーについて。
ハ_ハ _
∩゚∀゚)ノ 飛べばいいよ!
) /
(_ノ_ノ
これしか思いつかない。どういうこと?
>>601 >>603 モジュールの何のプロシ-ジャを実行したの?
Function シート2って何?
どんなエラーがでたの?
E列以降の関数がすっ飛ぶってどういうこと?
モジュールをダウンロードしてみたけど、シート名が指定されているから全く動かん。
シートの環境をエスパーしろってことなのか?
少なくとも再現できないと回答なんかできないと思う。
高速化したいのなら、プロシージャの先頭や最後にDebug.Printでタイムスタンプを出力することで
場所を絞り込みながら特定するしかないと思うけど。
614 :
デフォルトの名無しさん :2013/03/21(木) 21:50:42.18
履いているやつが15歳以下だったら多分見ているやつが逮捕される
>>574 ついでと言っては何ですがこれの応用について教えて下さい
Sheet1のA1,B1,C1,D1,E1にそれぞれ大分類名があり、それぞれの
列に小分類がリストアップされています
Sheet2のD列に小分類が羅列してあるときにSheet1を検索して
Sheet2のE列に大分類を入力したいときに
同じようにできないでしょか?
自分でやる気ゼロかw
出来るか出来ないかという回答のみでOK!
馬鹿には無理
馬鹿にしないでください、ちょっと自分が可愛いだけなんです
621 :
デフォルトの名無しさん :2013/03/22(金) 12:02:48.05
馬鹿に無理だって事ぐらい馬鹿以外は既に分かってるから意味がない 馬鹿には言ったって理解できないからやっぱり意味がない 結局どちらにしても意味がないんだから そんな無駄な発言をするやつは馬鹿だってことになる
つまり、俺が馬鹿だ
>>622 君は馬と鹿の合いの子か
馬と鹿のどっちが父でどっちが母?
>>616 Excel関数をセルに埋め込めばできそうだけどVBAで殺るの?
offsetとかVlookupとかindirectとかaddressとかで
625 :
桃白白 :2013/03/22(金) 22:08:25.92
627 :
桃白白 :2013/03/23(土) 07:30:13.01
>>626 いんじゃないの?桃白白ひまだし。なんかまずいのか?
桃白白受身ぐらいとれるよ。
628 :
616 :2013/03/23(土) 07:53:18.17
>>627 ありがとう!
正直このレベルは自分では無理でした
色々試行錯誤したが全く思うようにならず・・・
桃白白のを参考に勉強してみます。
>>624 Excel関数も考えたのですが
今後の発展性を考慮してどうしても
VBAでやりたかったんです
>>628 > 正直このレベルは自分では無理でした
> 色々試行錯誤したが全く思うようにならず・・・
うそくせぇ。
自分がどの程度までやって何がわからなかったのか全く示してないし。
勉強しますと言ってるけど、また丸投げするんだろ。
で、それが勉強と。
> Excel関数も考えたのですが
どういう関数を考えたのかな?
後出しだったら何とでも言えるよ。
Set A=nothing ってやらなくても動くよね やらないと不具合あるの?
多分動くけどメモリの無駄遣いになる 普通はこまめに使ったインスタンス消す L1キャッシュをできるだけ利用する様にしたいから(で正しいよな?)
633 :
デフォルトの名無しさん :2013/03/23(土) 10:47:33.92
>>631 メモリを消費したままだから
Excelが重くなるのではないか?
>>631 基本的に問題ない
VBA含むVB言語は、参照切れると自動で破棄(=Nothingと同じ)されるから
参照したまま(メモリ食ったまま)ってことは無いからね
ただ、グローバル変数とかだと参照したままになるので、
まあグローバル変数使うのは大抵参照したままにしたくて使うわけだが
破棄した方が良いケースもあるので、そう言う時は明示的に破棄(=Nothing)してやる必要がある
あと、滅多にないが破棄イベント(クラスで言うところのClass_Terminate)を任意のタイミングで
発生させたい場合も、End Subなどで自動破棄されるのを待たずに、任意に=Nothingすることもある
という感じでVBAではプロシージャ内では問題ないが、他言語も使ってるか、今後使う予定があるなら
VBA上では無駄でしかなくても、毎回きちんと明示的に=Nothingするクセ付けた方がいい
>>634 みたいな馬鹿が、バッドノウハウをいつまでも信じて、
それが不要になるどころか有害になっても使ったりするんだろうなあ
この話題が出るたびに思うんだけど、やらなくても問題ない、じゃなくて、やっても問題ないというのが 正しいにんしきだよね。本質的には不要なことするんだから。 で、本当に必要な場面がどこかわからなくて、全部やっとけとかいう奴がでてくる。
あとで問題が出たときに問題が出てから探すと却って面倒なケースがある。 予め問題が出ないように対処しておくことは決して無駄ではない。
>>638 それってどこで本当に必要かわからんってことだよね?
原発事故が好例 津波対策は不要としてケチったために 結局事故を起こして多大な賠償をするハメになる 安物買いの銭失いとはこのこと
馬鹿丸出し
馬鹿発見
643 :
デフォルトの名無しさん :2013/03/23(土) 16:16:32.15
ちんちん丸出し
>>634 まぁ俺もNoting付ける癖は付けておいた方がいいと思うよ。
その方がよさげなケースが簡単に思いつくからね。
例えば再帰処理を行う、自分自身を呼び出す前に不要になった、生成したものは絶対Noting しておくべき。
そうしないと使わないエリアをどんどん掴まえたままにしてしまうからね。
Notingしておけば適当な所でガーベッジコレクションが働いてメモリ上のインスタンス自体を破棄してくれるから、
メモリリークの心配もなくなる。
=Nothingはおまじないとしてわりと広く使われているけど賛否あるから こういう場では書かない、見てもスルーするのが大人の対応だと思うよ この間VB6スレがNothing論争で大分荒れてたし
>>646 何でないと思えるんだろう。
Noting自体は参照するアドレスを解放だけで参照先のインスタンスを解放する訳ではないのに。
インタプリタだからインスタンスを開放し忘れてもメモリの圧迫度合いが少ないというのは あるんでしょか? クラスモジュールを標準モジュールから呼び出ししただけならば その呼び出したクラスモジュールに定義されている変数分だけはメモリ確保されるけど コードの部分はインタプリタだから都度解釈されて実行コードに変換される で、そのクラスを利用しているプロシジャを抜ければインスタンスも開放される。 まぁ、ワシのティンコはインタプリタというよりはコンパイラですけどね(´・ω・`)b
Notingつけないと循環参照のとき終わるよ
650 :
デフォルトの名無しさん :2013/03/23(土) 20:33:52.53
終わるとは?
仕事でそんなプログラムをくんだ あなたの人生
652 :
650 :2013/03/23(土) 20:46:13.41
シマラソね
要するに自分が書いたコードを理解してないだけじゃん
そんないい加減でもやってけるのが VBAの醍醐味じゃん
つーかどっちでもいいから NothingをNotingと書くのはいい加減やめてくれ
は?ノーティングしらねぇの?
>>644 誰も必要な時にまでNothing不要だなんて言ってないよ。
不要な時にまでNothingすべき言う奴が叩かれてるだけで。
要不要を確実に判断し、何時いかなるときも間違いの無いコードを書ける御方はそれでいいじゃない めんどくせぇから一律でNothingしとけばとりあえず安全なんじゃね、って考えも楽でいいじゃない
馬鹿丸出し
>>657 Nothingを書いたり書かなかったりするほうがデメリットが多いような気がする。
ぱっと見コードに統一性がないから、Nothingの記載漏れなのか意図的にNothingを記載していないのか判断できないし。
態々Nothingあるなしの理由をコメントするのもアレだしね。
>>647 Nothingを代入すれば、即座に参照は解放されるし、インスタンスなら破棄されるが。
いや、必要な時だけ書くというのと、 常に書くということで、 それぞれのルールさえ守っていれば、 それはそれで一貫性が保たれていると言える。
ルールの遵守にはコストが掛かる、一律Nothingした方が安上がり
>>660 VBと同じ感覚で物を言ってないか?
VBAではExcelのオブジェクトの参照を保持する変数を使うことが日常的にある。
SubとかFunctionとかを抜ける前に、いちいちNothingを代入するの?
そのsubなりfunction内で生成したものならnothingするかな
>>665 生成じゃなくて参照。
あと、その参照を保持する変数のNothing無しの上書きは当然許容しないんだよな?
>>661 そんなんでインスタンスが破棄されるかタコスケ。
他でそのインスタンス参照してたら使えなくなるじゃねーか。
インスタンスを参照している所が無くなった時にガーベジが働いて破棄されるんだよ。
とまあ、揚げ足取りくらいしかする事が無くなったようなので、 この話は終わりですね。
>>664 ちょっと何を言っているのかわかりませんね
質問です 重複データのあるセルに色を付けようとしているのですが 重複していても色が付きません どこを修正したらいいでしょうか? Dim RetRange As Range Dim i As Integer, r As Integer Dim lRow As Long, c As Long Worksheets("判定テーブル").Range("A1:E700").Select For r = 1 To 5 lRow = Worksheets("判定テーブル").Cells(Rows.Count, r).End(xlUp).Row For i = 1 To 20 Set RetRange = Selection.Find(What:=Worksheets("判定テーブル").Cells(i, r).value, _ After:=ActiveCell, LookIn:=xlFormulas, _ Lookat:=xlPart, SearchOrder:=xlByRows, _ SearchDirection:=xlNext) If Not RetRange Is Nothing Then If RetRange.Address <> Worksheets("判定テーブル").Cells(i, r).Address Then c = 1 RetRange.Interior.ColorIndex = c Cells(i, r).Interior.ColorIndex = c c = c + 1 End If End If Next Next
671 :
670 :2013/03/23(土) 23:54:44.30
すいません自己解決しました
VBは即時解放だったような
なんか違うらしいよ 参照カウントが0になった時にTerminateは発生するが、 インスタンスが使用していたメモリを解放するのはその後らしい でもそこまで行くとVBAの仕様を知ってる人は少なそう
俺は基本Nothingしないでメモリリークが問題になったら 必要そうなところにNothing入れていくというスタンス
VBAでNothingの代入をしないことによるメモリ「リーク」するコード書けるなら、ちょっと書いてみてくれ
VBA初心者です 入門書をかってその内容は一通り理解しました このあとどのように勉強していけばよいのでしょうか?
>>676 VBAを使う仕事に従事してひたすら実践あるのみ
>>675 Sub hoge()
Dim list As New Collection
Dim I As Long
For I = 1 To 100000000
Dim rng As Range
Call list.Add(rng)
'Set list = Nothing
Next
End Sub
679 :
桃白白 :2013/03/24(日) 07:54:14.50
>>675 Sub test()
Dim d As Dictionary
Set d = New Dictionary
Call d.Add(1, d)
Set d = Nothing
End Sub
>>678 のはメモリの解放が適切でないという意味のメモリリークで
桃白白のはメモリを解放できないという意味のメモリリーク
___
/::::::::::::::::\
/:::::─三三─\ メモリリークの意味には揺らぎがあるのです……。
/:::::::::<○>三<○>.\
/⌒)⌒)⌒.:::::::::: (__人__) :::::: \ /⌒)⌒)⌒)
| / / /.. ` ⌒´ | (⌒)/ / / /,,
| :::::::::::(⌒) / ゝ ::::::. .........._
| ノ \ /_ /´ ヽ
ヽ / ヽ / /0 .',
| | {o }
': /
ヽ、___,.,/
>>669 VBAはVBに比べてSetを使うことが格段に多く、そのほとんどはExcelオブジェクトの
参照の保持に使われるのだが、Nothing代入しろ派はそのことを忘れてVBと同じ感覚で
物を言ってないかいという意味。
わかんない?
>>680 その考え方はExcelに限らずオブジェクトを多く使った場合はNothingは面倒だからしないということだね。
かなり危険な考え方と思うけど。
VBAスレでメモリリークの話題が、そもそも無理があるね。
結局
>>654 が正論だった。
よけいな事考えんでいいから、不安定になったらエクセル再起動しろ。
>>681 どういう考え方だと思ったのか謎だわ。
VBAではVBと較べると、Nothingの代入が不要なSetが格段に増えるが、
とい表現にすればわかるか?
つか、参照を保持する変数を多用するだけで、多くのオブジェクトを使う場合の話じゃない。
>>678 コメント外したらループ2周目で落ちるよ?
>>680 わからないよ
そんなもん仕様次第だしVBAでExcelオブジェクトをリーク?
君の変数はExcelプロセスより生存期間が長いのかい?
>>680 いやぁ何を言っているのかさっぱり分かりませんね。
あなたはExcel のオブジェクトの参照にスコープも考えずにモジュールのパブリックな変数にでも
保持すると言っているのでしょうか。
それは使い終わった変数と呼べるのでしょうかねぇ。
その方法がExcelのVbaだからとか、Vbだからって何の関係があるんですか?
全く理解出来ません。
>>686 SubやFunction内でExcelオブジェクトの参照を保持する変数を使うことが
VBAには多いが、それらもいちいちNothingを代入するのかって話で、
どこがわからんのか、こっちこそさっぱりわからん。
で、代入するの?しないの?
ほら、もう
>>685 ,686みたいなおかしな奴しか出てこない
>>687 相変わらず何を言っているのか分かりません。
一度コードを書いて貰えますか?
ちょっと情報が少な過ぎて判断しかねます。
End SubやEnd Functionの直前でずらずらと不要なNothing代入文を書かなきゃ ならないとしたら、途中でExitするときもその時までに使った変数にNothingを 代入する必要が出てきて無様なことになる。
>>689 sub hoge()
set ws = worksheets("hoge")
set r = ws.range("a1").currentregion
...
for i = 1 to r.rows.count
set cell = ws.cells(i, 1)
...
next
...
end sub
ws, r, cellはNothingの代入が必要なのか?
>>690 あなたは普段いったいどんなコードを書いているんですか?
なんでズラズラとNothingをならべなければいけなんですか?
本当に言っている意味が分からなくなって来ました。
必要です。 ただし、1つでいいです。 Excelのオブジェクトを扱うクラスを生成しておいて、 そこでExcelの操作を行い、終わったらNothingで破棄してやればいいだけです。
>>692 普段は不要なNothing代入とか書かないようなコードを書いてるが。
>>693 それでNewとか使うからNothingが必要なんじゃないかって勘違いが発生するんだよ。
ちなみにそのケースでも、Nothingの代入は不要だろ。
>>696 rows.countが10000なら、1万個の参照をcellに代入するけど。
つか、君もどんな状況を想定してるのか、コード書いてよ。
>>696 >>697 それに関しては既に前に述べている人がいますね。
再帰処理や循環参照を行った時に、その間もずっと参照が保持され続け、
メモリリークやオーバーフローが発生する恐れがあるからです。
>>699 上のコードには再帰も循環参照も全くないけど、なんでNothingの代入が必要なんだ?
スタックオーバーフローが発生するほどの再起が必要な場合は、単純ループに書き換えるとか データ構造を見直すとか、データはシートに保持するようにするとか、そういう手当てが必要で、 Nothingの代入が常に必要論とは本質的な関係はないね。
>>699 再帰のケースはメモリリークではない。
場合によっては不要なメモリへの参照期間が長くなるが解放はされる。
循環参照のケースは、とりあえずNothingしておけばいいという問題ではなく
解放する順番やタイミングが大事。
したがって、本当はとりあえずNothingという考え方の方が危険。
>>700 本当に何にも想定していませんね。
例え循環参照していなくても、
大きなオブジェクトを立て続けに使えばメモリに対する負担はそれだけ増えるし、
場合によっては同じ様にメモリリークやオーバーフローが起こる事が何故分からないんですか?
関数が終わればPrivateな変数の参照が破棄されるとは言え、
同じ関数内で幾つかの大きなObjectを使う場合はどうなるんです?
>>703 ws, r, cellにNothingの代入が必要かどうかに、一体何の想定が必要なんだ?
ws, r, cellにNothingの代入が必要な理由を明確に書いてくれ。
あと、君が想定するコード早く書いてね。
705 :
デフォルトの名無しさん :2013/03/24(日) 10:21:08.60
いつまでやってんだ、アホンダラどもが どっか他でスレ立ててそこでやれや
多分相手にしてるのはVB6プログラマで、VBAはドシロウトだから相手にしない方がいいよ
>>703 俺は700じゃないけど、オーバーフローってスタックのか?
スタック不足とメモリリークを同列に語るとか頭大丈夫かお前?
俺はNothing不要派 どうしても必要なところがあればNothingする。
クラスモジュールがたくさん定義されていて 変数だけで数MB級になるようなコードだったら こまめにNothingしたほうが安心かなとは思う。 まぁ人それぞれってことで。
NotingではNothing
レガシーASPですらNothingしなくても問題なかったのに ExcelでNothingなんてアホらしい
>>678 俺の環境(VISTA 32bit Excel2007)では、
>>678 のコードがExcelごと落ちるな
そしてループ内でDoEventsかますと落ちない
ちょっとExcelの動作があやしいが、これのどこで何のメモリがリークして
それにNothingの代入がどう関係するんだ?
本当に必要なレアケースを持ち出して(そして、実はそれが間違いというオチつき)、それを 一般論にまで適用するという馬鹿さ加減。
そしてレアケースを起こしてクビになると
>>679 VBAにDictionaryなんてないが、まあそれは置いとくして
お前の定義では循環参照が解放されないのはメモリリークなんだな
その定義に従うなら
Nothingを適切に代入することにより、ある種のメモリリークが防げる
は正しい
でも、常にNothing代入すればそれが防げるというのは間違ってる
716 :
712 :2013/03/24(日) 11:03:41.15
訂正 DoEventsかましても落ちたわ でもこれ落ちた理由は大量にメモリを消費したからであって、リークしたからじゃないはずだが
Scripting.Dictionaryのことだろ? 俺は普通に参照設定して使うものと理解したけど。
なんでもかんでもNothingするのはアスペ
余計なコードは書かないのがプログラマの本懐。 Nothing入れろなんて、開発元のMSが言っていないことをする必要はない。 やるならば、個人の流儀として己の内にとどめておけばよい話。 掲示板で他人に向けて使うべきと主張するな。
>>717 まあ普通はそうだろうが、Scripting.Dictionaryがメモリリークしても、本来VBA関係ない
Scripting.Dictionaryの仕様か実装の問題
Nothing代入論争はVBAの仕様(と実装)の問題
まあ実際の現場ではその差はあんまり意味ないけど
Cで、sizeofとかreturnに()つけてて、なんでって聞いたら「念のため」って答えた奴思い出した コイツらは、単に要不用の区別が付かない自分を正当化したいだけだよ
>>722 いるいるww
まずは絶対にNothingを付けないようにして
Nothingが必要なところに入れる習慣をつけるべき。
俺の環境ではメモリ不足って出るな。 Nothingのコメント外したら出なくなったが・・・。
returnには()いらんけど sizeofには()つけてる
あれは、sizeof演算子だと頭では理解していても括弧を付けたくなる。 C#のsizeofを括弧必須にした奴は、きっと毎回少しイラッとしていたに違いないw
Nothingはいらないな 全くいらない なんであんな命令が残っているのか
nothingはis nothing判定する変数に使ってるお ループ内、public含め。
nothing以外のお話を誰か抽出して!
>>722 call ほげ( 引数 )
ほげ 引数
これもそれ系のお話しやん
話題はつきぬがすれ違いという哀しい現実ぅ
昔nothingという映画があってだな、
>>733 そういうケースはNothingいりません
735 :
桃白白 :2013/03/24(日) 22:45:15.64
>>712 メモリリークはメモリが確保されていて
プログラムが動作するうえで確保されているメモリが不必要なものであり
その時間が不適切に思えるほど長いときのこと
またはその量が不適切に思えるほど多いときのことである
メモリリークをそういうふうに定義すると
>>678 はメモリリークであると読めるっしょ
もしかするとお前はそれがメモリリークじゃないといいたいのかも
しれないけれども そうするとそれはもうNothingが必要か否かの話じゃなくて
メモリリークの定義とはという言葉の定義の話になる
言葉の意味の揺らぎを利用してお前がいってることは違うということは
簡単だけれども あまり建設的ではないわね
>>735 Nothingが必要な理由がメモリリークっていうのなら、メモリリークをちゃんと定義しとかないと話にならんのだが
>>678 が何を主張したいコードなのかわからんが、ただ大量のメモリを使ってるだけだぞ
お前の定義であれば
>>678 は大量のメモリを確保するのが目的のプログラムなんだから、
不必要なメモリを確保してない=メモリリークではないわけだが?
メモリリークって、C言語でポインタ計算を間違えた時に起きるやつじゃないの? VBAでは理論上は起きない、起こせないと思うんだけど
738 :
桃白白 :2013/03/24(日) 23:28:50.04
>>736 >>735 のようにメモリリークを定義すると
>>678 はメモリリークであるってことに筋がとおるっしょ
>>678 のコードの目的はメモリを大量に確保することだというふうに前提を置くと
>>678 のコードはメモリリークではないということになる
それは否定しないけど そうすると
>>678 はメモリリークじゃないものを
Nothingを代入しないとメモリリークする例としてあげた頭がおかしい人ということになる
書いた人間がおかしい人であるという方向に読む人が前提を置くことは
容易にできることだけれども そうすることにどれだけの意味があるのかなと桃白白は疑問に思います
739 :
デフォルトの名無しさん :2013/03/24(日) 23:36:25.53
Firefoxのメモリリークは半端ないよな
クライアントアプリでメモリリークなんて気にしてもな
Dim Hoge = "ほげぇ・・" As String が出来ない理由って何?
できるようになってないから
>>736 その例は解放すべき場所で解放しなかった為にメモリを大量に使ってしまった例。
だからNothingのコメント外すとなにも起きないでしょ?
メモリリークの意味を一度Wikiとかで見た方がいいと思うよ。
>>741 MSにやる気がないから
なぜやる気がないかは直接聞いてくれ
>>741 結果 0 が成り立つ修羅の言語だから
Option Explicit
:
If 1 = 0 Then
Dim x As Double
x = 12
End If
x = x / 3
Debug.Print x
747 :
桃白白 :2013/03/25(月) 07:07:20.13
>>741 桃白白がかわいいから
.∩___∩
/ \| なんつったりしてな!
| ● ● 丶
ミ (_●_ ) | ガハハハハハ!
ハハハ /´、 |∪| 、彡
∩_∩ ∬ ( <`\ ヽ/ __ 丶
( ´∀`) ∩ ∬ \_) | ▽(___)
(つ= つ▽ ,,,。,;;;。,,,// / / |
と_)_) ▼ ( ̄ ̄ ̄ ̄) (__(____)
ところで
Dim Hoge = "ほげぇ・・" As String
はどういうコードなの?
値"ほげぇ・・"がString型で変数HogeがVariant型てこと?
それとも
値"ほげぇ・・"が変数Hogeに代入されて変数HogeがString型てこと?
それとも
ほかのなにか?
普通 dim hoge as string = "hoge" だろ
だな。 .Net以降は出来る。
stringに代入してるみたいで気分悪い
751 :
桃白白 :2013/03/25(月) 08:03:54.50
>>750 それは宿命としかいいようがない気がするけどさ
データのあとにデータ型を書くようにすると変数のデータ型が
ないように見えてしまう それを回避するにはデータ型を変数の
前に書くしかない つまり桃白白が考える理想の次世代VB文法はこれ
Dim String As Hoge = "hoge"
何故に「As」を変えない? 単に入れ替えただけじゃStringという名前のHoge形変数に値を代入してるだけで 意味的には今と全く変わらず、Asの前が変数名で、Asの後ろが型名なので 文字列型の型名がHogeになって、Stringが予約後から外れることが理想と言ってるのと同じ あまりにも安直で思慮が浅すぎだ
そもそもDimってなんなん?
オレ言語作ればいいじゃん。 VBAとは関係ないだろ。
755 :
桃白白 :2013/03/25(月) 09:28:50.57
>>752 ちがうよ ぜんぜんちがうよ
Dim データ型 As 変数 = 値
という文法だよ
一昔前はさ変数が値を持つと言ったものだけど 昨今は値が変数を束縛する
なんてよくわからんこというじゃない じゃあ次世代のパラダイムとして
変数がデータ型を籠絡するなんて言い方するようになってもいいと思うの
深いっしょ?安直といったことを撤回してもらいたいよ
そんならDimとAsは省略可能にするのがええじゃろ 代入のLetみたいに もはや誰も使わん
お前らもうC#つかとけよ。DimもAsもいらないから
>>755 Dim hoge As String
と
Dim String As hoge = ""
と、両方許すの?
Dim String As hoge
は許すの、許さないの?
互換性はすてるの?
浅慮すぎるわ、お前
String Hoge = "はげ" あれ?
>>758 シンプルだな
ひょっとしておまい天才か?
>>753 VB作るとき、マイクロソフトの社員がディアマンテ欲しいなーってずっと考えている時、何となく付けてしまった。
決して配列などと言う意味ではない。
>>760 たまたま同じ結論に到達しただけ
よくあること
763 :
桃白白 :2013/03/26(火) 01:02:45.86
>>762 アヒルさんとガチョウさんが似てるようなものですね わかります 桃白白それわかります
ところでさ
For lngCounter = lngStart To lngEnd Step lngStep
Next
これの処理が終わったときにlngCounterがlngEnd + lngStepであることは
言語的に保証されてるんだってのをいつかどこかで誰かが誰かに言ってたような
気がするんだけど それを見つけられないんだよね 知らない? これについて書かれた
文書のありかを知らない? 教えてくれたら桃白白超うれしい
ループ内で lngCounter = lngEnd + lngStep + 1 しても? Exit Forしても? 何Exit Forて。breakにしてよ!
766 :
桃白白 :2013/03/26(火) 02:10:54.51
>>764 ご提示いただいたページを見ました 探していた情報が記載されていました
ありがとうございます 桃白白超うれしいです ありがとうございます
VB/VBAとは抽象化とは程遠い言語
768 :
桃白白 :2013/03/26(火) 04:52:54.83
みんな聞いて どうもこのコードでメモリリークするみたいなんだよね
Sub Test()
Dim elm As Variant
For Each elm In GetArray()
Next
End Sub
Function GetArray() As String()
Dim str As String
str = String(65536, "a")
Dim arr() As String
ReDim arr(2048)
Dim idx As Long
For idx = LBound(arr) To UBound(arr)
arr(idx) = str
Next
GetArray = arr
End Function
[VB6] UBound または LBound に配列の戻り値を渡すとメモリ リーク
http://support.microsoft.com/kb/197190/ja これの類型じゃないかと思うんだけど GetArrayの戻り値をVariantにしたらメモリリークが起こらない
桃白白はVariant最強説を唱えようと思うの
えー Variantも配列も嫌い
770 :
桃白白 :2013/03/26(火) 05:55:49.64
も、桃白白>_<
配列使うならコレクションやディクショナリの方が追加したとき一々サイズの変更しなくて済むからそっちの方が好き。 Variantはサイズでかいし、内部でどんな推論で型が決定されているのか よく分からないし、何て言うか得体が知れなくて気持ち悪い。 だったら根幹になってる型を使う方が好き。 どうせVariantは.netになったら使えないんだし。
773 :
デフォルトの名無しさん :2013/03/26(火) 07:26:08.00
そう言えばVariantって自前で作ったクラスのインスタンスって入れられるんだっけ?
Variant配列は、 変数 = Range(範囲).Value で、範囲の値を一括取得する時だけお世話になるな これだけはVariant配列様々だぜ
ADODBでバイナリストリーム作って Readするときに使うくらい。
>>768 そのページに例があるのに、何でわざわざ変えちゃうのさ。
そのせいで内容変わっちゃってるし。
それはあかんよパイパイ。
777 :
桃白白 :2013/03/26(火) 09:38:29.52
>>773 可能だよ コード補完できないからあんまやらんよね
>>763 そんな保障ねえだろ
For i = 1 To 5 Step 3
Next
MsgBox i
お前の環境じゃ8になるのか?
>>768 おまえそのKBの内容ちゃんと理解してるのか?
すくなくともそこのKBに書いてある内容と、お前のコードは合致しないんだが?
それほんとにメモリリークしてるのか?
ためしにTestを100万回ほど呼んでみたが、リークしてる様子はないぞ
>>772 >コレクションやディクショナリの方が追加したとき一々サイズの変更しなくて済む
コレクションやディクショナリは配列とは違いますよ
配列は本来事前にサイズがわかっているときに使うもので、追加するときに
いちいちサイズ変更するものではありません
>>内部でどんな推論で型が決定されているのか よく分からないし
VBAではどんな推論もされていませんが?
得体が知れないのではなくて単に知識が足りないだけです
781 :
デフォルトの名無しさん :2013/03/26(火) 11:54:12.63
うちの会社ではActiveDirectoryをつこてます。 ログインIDから、その人の名字、名前、電話、部署名などなどいろんな個人のデータをひっぱってきたいんですが どうすればいいですか?
782 :
781 :2013/03/26(火) 11:55:17.05
メールアドレスもひっぱってきたいです。 ひっぱってきたいデータはOutlookの個人のプロパティに載ってるやつです。
ADSIを使えば簡単
784 :
デフォルトの名無しさん :2013/03/26(火) 12:08:25.71
ADSIとはなんでしょうか? もしソフトなら、あいにくうちの会社はセキュリティレベルが最高級なので、インストールできないんです。
いや、くぐれよ
786 :
デフォルトの名無しさん :2013/03/26(火) 12:16:24.84
ぐぐれってなんですか? ククレカレー?
ぐぐれなどとは言っていない。くぐれと言ったのだ。
>>786 ククレなんて言ったら犯罪になっちゃうぜ
自殺強要でな
>>780 >>内部でどんな推論で型が決定されているのか よく分からないし
>VBAではどんな推論もされていませんが?
Sub hoge()
Dim var As Variant
var = "hoge"
var = 1
var = Range("A1:B2").Value
End Sub
varに値が代入されている所にブレークポイント付けてウォッチ式でも
ローカルウィンドウでもいいから型を確認して見ろ。内部型が表示されるだろ
それが推論されたものでなくてなんだと言うんだヴォケが
すい‐ろん【推論】 [名](スル)ある事実をもとにして、未知の事柄をおしはかり論じること。「実験の結果から―する」
型推論 かたすいろん (コンピュータ) Type inference. ML等の静的に強く型付けされた言語において,変数や関数の型をプログラマが明示しなくても,処理系が自動的に決定してくれる仕組みのこと.型理論の知見に基づく.
>>789 型はVariant型のままで、何の推論もされてませんが?
Variant型に対する理解が足りてないんじゃないですか
それか、.NETでObject型で宣言した変数に違う型を代入したら型推論だとでもいう気かな
>>792 まず.Netでobject型に代入出来るのは型ではない。インスタンス。
そう言いたかったんだと仮定して、Objectに代入したら型変換を行わないと
その継承先であるクラスのインスタンスのメソッドやプロパティは使えない。当たり前だよね。.Netなら。
VBAではString型などObject型を継承して作られている訳ではないので、代入すら出来ない。
.Netでは2008より、Dim value = "AAA" の様に型を指定しなかった場合、
valueは代入される値側から判断して、String型になる。これが型推論。
そしてVariantの内部処理形式もDim value As Variant、value = "AAA"を行うと
型を見てみるとVariant/Stringと表示される。String部分が内部処理形式と言われるもの。
これが
>>789 が言ってる内部型だね。様は型推論無しでどうやってStringと見なせたのかと言いたいんだろう。
それよりなんで突拍子もなく.NETのObject型の話がでてきたのかの方が気になるw
795 :
桃白白 :2013/03/27(水) 07:54:59.02
Variant型は.NETでのObject型みたいなもんだと言いたかったのでは
ここVBAスレだし.NETの話はあれなんだが、明らかな間違いぐらい指摘しとこう
>>793 >Objectに代入したら型変換を行わないと
>その継承先であるクラスのインスタンスのメソッドやプロパティは使えない
すくなくともVB.NETでは間違ってます。Option指定にもよるが、実行時バインドで使えます
型推論ってのは、明示的に型が指定されていない場合に型を決定する機能
Object型が違う型になったりしないし、推論で決定された型が変わることはない
>様は型推論無しでどうやってStringと見なせたのかと言いたいんだろう
Stringを代入したから、その実行段階でVariant/Stringになってるだけ
あくまでも型としてはVariantだから、そのあと違う型(の値またはインスタンス)も代入できるぞ
Variantの内部型は何の推論も決定もされてない。代入されたものの型になるだけ
まずVariant型に数値を代入する a = 1 変数aの値はメモリ上では&h0001とかになってるはず つぎに文字列として演算を行う b = a & "2" aの中身は&h0001から&h31,&h00に変換されてから、文字列として処理されるはず 変数bの値はメモリ上では&h31,&h32,&h00という文字列になってると思う さらに数値として演算を行う c = b * 3 変数bは&h31,&h32,&h00という文字列から&h000c(10進数で12)に変換されてから計算される cは&h0024(10進数で36)になる Variant型という高級言語的な概念でも結局のところはマシン語で処理してるんだから どこかで型を決めたり変換したりしてないとおかしい じゃあ、いつ、どういうアルゴリズムで決めてるんだ? っていう疑問じゃないの?
>>797 それ暗黙の型変換じゃないの?
つか、VBAに「型推論」機能なんて無いんだから、よそでやってくれない?
リテラルの代入→リテラルの型 Variant型変数からの代入→代入元の値の内部型情報 他の型の変数からの代入→代入元の変数の型 式の値の代入→式の値の型 VBAに型推論があるとは言わない、だけど、値に型情報を持ってないのだから Variant構造体の型情報を決めるのには、推論のような事が必要。
Variant型は値の型情報も持ってるぞ。VarTypeで調べられるぞ 代入したものの型で、実行時に変化するんで推論(して実行前に決定)する必要なんかないぞ
Variantと暗黙変換のせいで分かりにくいが、VBAは静的型付言語なんで 値があるのに型がないなんてことはないはずだよな
値に型があるのは動的型付け言語。 静的型付け言語は変数に型がある、つまり値に型情報はもっていない。 Variant型の場合も変数(=Variant構造体)に内部型情報をもっている。
どうでもいいけどVariantは構造体じゃないだろう
>>800 だから、その「変化」させる時に「何に」変えるのか、型を決定するプロセスが
プログラマからは見えないところで自動的に動いてるだろ、って話なんだけど
自動ではないよ
素直になれよみっともない
>>804 いやだから、代入したときに代入したものの型になるだけだろ
どこに不明な点があるんだ?
だめだこいつ
Sub hoge1() Dim v As Variant Dim b As Byte b = 1 v = v + 1 Debug.Print TypeName(v) Debug.Print v End Sub Sub hoge2() Dim v As Variant v = True v = v And 0 Debug.Print TypeName(v) Debug.Print v End Sub Sub hoge3() Dim v As Variant v = "0" v = v + 1 Debug.Print TypeName(v) Debug.Print v End Sub うーん・・・
810 :
桃白白 :2013/03/27(水) 22:12:13.12
おっと、hoge1は Sub hoge1() Dim v As Variant Dim b As Byte b = 1 v = b + 1 Debug.Print TypeName(v) Debug.Print v End Sub だった。
まず巷でいわれている型推論の定義を調べてからしてくれるかな
814 :
桃白白 :2013/03/27(水) 22:30:48.57
>>812 型推論はコンパイラがソースコードをコンパイルするときに
コンパイラが変数のデータ型を決めることだと思うの 桃白白はそう思うの
図で表すとこうなる
/ ̄\
| |
\_/
|
/  ̄  ̄ \
/ ::\:::/:: \
/ .<●>::::::<●> \ お前はガチョウさんだ
| (__人__) |
\ ` ⌒´ /
/,,― -ー 、 , -‐ 、
( , -‐ '" )
`;ー" ` ー-ー -ー'
l コンパイラ l
815 :
デフォルトの名無しさん :2013/03/27(水) 22:31:05.30
ひとりごとだろ
議論のやり方がど下手だな。 型推論の構成要件または必要十分条件を列挙し、全てVBAがクリアしてることを示せば VBAに型推論があることの証明終わり。 または、その条件のどれか一つを満たさないことを示せば、無いことの証明終わり。
そして、その条件を列挙出来ないなら、型推論の議論の参加資格なし。
>>809 それがなぜそうなるかわからないのか?
最後のDobuleだけわかりにくいけど、これは+演算子の仕様
Sub hoge1()
Dim v As Variant
Dim b As Byte
b = 1
v = b + CByte(1)
Debug.Print TypeName(v)
Debug.Print v
End Sub
Sub hoge2()
Dim v As Variant
v = True
v = v And CBool(0)
Debug.Print TypeName(v)
Debug.Print v
End Sub
Sub hoge3()
Dim v As Variant
v = "0"
v = v + CStr(1)
Debug.Print TypeName(v)
Debug.Print v
End Sub
それぞれこう書くべきものが間違ったコード書いてるだけだぞ
暗黙の変換によって思った型になってないだけだ
>>814 そのガチョウがダッグタイピングにかけてるなら
型推論されたらダッグタイピングにむかないって解ってるか?
Haskellの型推論みたいな話は最初からしてないのに、面倒な人たちだな。
Varyant型と暗黙の変換と演算子の仕様を理解してない人が暴れてるだけだろ
型推論を俺定義してる人が頑固なだけだね。
Varyantなんて型自体初めて聞いた聞いたけどな バッリーィアントって発音で合ってる?
アスペなのかな、この人
まあ、初めから型推論してるって言ってたんじゃなくて 俺が理解できない推論で型が決定されてる って言ってただけだが それを知識がたりないって指摘されたら >それが推論されたものでなくてなんだと言うんだヴォケが とか言い出した
>>826 単純なtypoにしか突っ込むとこなくなったのか?
830 :
桃白白 :2013/03/27(水) 23:47:49.32
>>823 言葉というのは一人歩きするものなのです
そのことは話が広がるという意味ではいいものだけれども 話が広がる方向が自分が
思っていたものと違うときはちょっといやだよな わかります 桃白白それわかります
最初の話は
>>772 あたりか
Variantは内部で型の推論が行われるもので それがどういうやり方で行われているのかわからない
それがいやって話だな
Variantが保持するデータ型は演算子と暗黙の型変換によって決まるものだよって流れか
つまりVariant最強説を唱えることにした桃白白は賢くてかわいい人だというのが結論
>>821 いや、そうなんだけどそうじゃないんだ。
例えば、Byte型の方がサイズとして小さいから、それを超える範疇でなければByte 型で行くかなぁって
思ったけどInteger型。
Boolean型のTrueをBit演算でFalseにしてやってもInteger型。
一番良く分からないのが文字列型で指定した数に数字をプラスしてやるとDobble型。何で暗黙の型変換でこうなるの?
型指定して入れてやったら内部ではその型になるのは分かり切ってて、これは値がどんな型で設定されるのか
試したことだから。
>>831 > 一番良く分からないのが文字列型で指定した数に数字をプラスしてやるとDobble型。
暗黙の型変換で文字列を数値にするのに、整数決め打ちじゃまずいだろ。
>>832 でもVariantを介すると出来ちゃう
桃白白が、話に全く付いて行けてないのに必死に参加しようとしているのが可愛い
B列とE列にデータがあります。 E列が空白のB列のデータの種類を取得したいのですが 自分なりに調べて WorksheetFunction.CountIf を使うとこまでは何となくわかったのですがここからどうしたらいいかわかりません できればこの種類がE列空白ですよとMsgBoxを出したいのですがどうしたらいいでしょうか?
MsgBox "E列空白ですよ"
>>834 最初、文字列として結合されるか、+1されるか、型違いで落ちるかのどれかだろうって思ってた。
結果として内部型(っていうの?)がStringのものに+1されたんだけど、
出来ちゃった、と言うよりそうなっちゃったものは仕方がないってことで、悩んでるのは何でDobble 型?ってところ。
型意識してプログラムした方が楽だし安全だろうが? って言ってみるテスト
>>838 "0" + 1の結果は数値になる、これは"+"演算子の仕様。
"0"が数値型に変換されてDouble型になる。ここが
>>832 で書いたこと。
Double型 + Integer型はDouble型になる。
だろ
841 :
桃白白 :2013/03/28(木) 00:44:11.85
>>831 Variantはデータ型がわかりにくいからいやだというのはわかった
それはわかったうえでなぜそうなるのかについて
これはじつは演算子の仕様なのよ
5.6.9.8 Logical Operators
http://msdn.microsoft.com/en-us/library/ee156946.aspx * Table 5.67 Effective Value Type of Unary Logical Operators
* Operand Value Type | Effective Value Type
* Boolean or Integer or Empty | Integer
5.6.9.3 Arithmetic Operators
http://msdn.microsoft.com/en-us/library/ee177477.aspx * Table 5.32 Declared Type of Binary Arithmetic Operators
* Left Operand Declared Type | Right Operand Declared Type | Operator Declared Type
* Double , String or String*length | Any integral or floating-point numeric type, String or String*length | Double
>>835 桃白白がかわいいだけ読んだ ほかのところは桃白白とは関係のない話だと思った
都合のいいフィルターかましてんじゃねえと桃白白をお叱りになりたいだろうけど
桃白白がそんなことで反省すると思ったら大間違い
この必死にお清まし気取った反応がたまらなく可愛い
>>631 >Byte型の方がサイズとして小さいから
サイズの小さい方に合わせると、あふれる可能性があるから、サイズが違うときは大きい方のサイズに合わせるのが基本
ヘルプにも
>演算結果 result のデータ型は、通常最も精度の高い式のデータ型と同じになります
って書いてある
>Boolean型のTrueをBit演算で
Bit演算は2進数の演算なので数値演算
まあVBAでは数値演算と論理演算の区別つきにくいけど
>文字列型で指定した数に数字をプラスしてやるとDobble型
文字列を数値に変換するときに浮動小数点形式になってるからだな
そしてSingle+LongがDoubleになる+演算子の仕様
>>838 文字列結合するか数値加算するかもちゃんとヘルプに書いてある
まずは一度ヘルプの+演算子のとこ見ろ
844 :
桃白白 :2013/03/28(木) 04:52:23.65
>>836 種類というのがよくわかんない
E列の空白の数じゃなくて?
どういうデータでどういう結果になるのか例を教えてもらえると桃白白うれしい
845 :
桃白白 :2013/03/28(木) 05:48:18.62
>>822 ダッグタイピングを検索した。
* 次の検索結果を表示しています: ダックタイピング
おのれGoogle!それじゃないわ!桃白白は怒り狂った そしてどっちでもいいと思った
しかしドナルドダックも北京ダックもダックだ Googleが正しい気がした しゃくにさわる
ダックタイピングは値の型が異なる複数のオブジェクトがあってそれぞれのオブジェクトに
同じメソッドがあったら値の型が異なる複数のオブジェクトを同じようにあつかっちゃいなよということだろ
だからそれはそうなんじゃないか ダックタイピングと型推論とが調和しないというのは
そうなんじゃないか お前がそう思うんだったら桃白白もそう思う
>>836 種類と言うのがよく分からないと言うのもあるけど、
E列が複数行空白だった場合は?全部出すとしたらメッセージボックスって
文字数制限あった気がしたけど大丈夫?
B列に同じ値が入っている行が複数有ったとして、その中でE列が空白でないものとそうでないものが
有った場合はどうするの?
>>845 Googleにおちょくられたかw
人を見るからなGoogle検索。
>>844 B列にたとえばA1234,B5687等のアルファベットと数字の組み合わせのIDが
何種類かあり、E列にその説明書きの文字列が入っています。
空白の数は
For i = 1 To 50
If Cells(i, 5).value = "" Then
Cells(i, 5).Select
s = s + 1
End If
Next
MsgBox s & "件未入力"
で取得できますが、E列に説明書きの入力されていない
B列のIDを MsgBoxで
A1565
D5698
の説明書きが未入力です。
と出したいのです
>>846 B列の値が同じ値なら、E列の入力状況も
必ず同じになっているシートなのです
メッセージボックスの文字制限は考慮してなかったですね
何文字ぐらいなのでしょうか?
>>848 Excelのオートフィルタ機能を使えば態々VBAで書かなくてもいいのに何故あえてVBAでやろうとするのかな?
851 :
桃白白 :2013/03/28(木) 08:52:17.55
>>851 COUNTIF使ってないじゃんっていうツッコミはないのね。
>>851 そういう風にMagBox使うなら行数制限くらいかけとこうよ
あとエラーのセルに色くらいつけようよ
>>853 質問者が要求してないことは、提案として出すならまだしも、
いきなりコードに組み込んじゃうのは如何なものかと?
提案としてはどちらも正論だとは思うけどね
お前ら自分はコード書かない癖して、いつも桃白白のコードにはけち付けるんだな。 コード書いてから言え。
「ケチ」なら反論して論破しちゃえばいい 「正論指摘」なら素直に受け止めればいい ただそれだけ
ケチはケチであり、論ではないから反論など存在しないのだよ。
なんだかんだ言って、このスレでは桃白白くらいしかコード晒す奴いないからね。 いろいろ突っ込まれたりするけど、無料レビューだと思えばいいんじゃないの。
>>854 言われたとおりのコードしか書けないのかなとか思ってしまう。
本人がどう思っているかわからないけど。
確かにどこまで書くかっていうのがあるけど。
行数制限とかコードで書かなくても、コメントアウトで注意書きできるわけだし。
今回の質問であれば、コードをベタ書きする以外にも説明書きの列、IDの列を入力として
説明書きの列が空欄のIDのリスト(コレクション)を出力するプロシージャにする方法もあるわけで。
これだとID列、説明書きの列が変わっても入力の値をを変更すれば済む。
場合によっては別な列でも同じようなことがしたい時に使えるわけで。
いきなりコードを書き始める前に、ちょっと考える必要はあると思う。
>>848 まずぱっと見て、後々言われそうな事が数点有るね。
まぁ、出力対象が5つくらいまでなら問題なさそうだけど。
納品先には取り敢えず、
何件くらいまで出力するのか。
重複を省くのは当たり前として、出力時のソートはどうするのか。
沢山出すなら、コピペ出来る様にするのか。
このくらいは確認した方がいいのかな。
勉強でやってるなら不要な心配だけどね。
ここは質問スレで、プログラムを作成するスレではありませんよ
>>851-854 ,859,860
レスありがとうございます
今回のは自分で使うので試行錯誤しながらやってます
エラーのセルに色を付けるのは自分で何とかなりそうです
MagBoxの行数制限や文字制限に関しては全く気が回らなかったです
出力のソートに関しては今回は特に問題になりません
>>851 のコードを試してみたのですが
重複を省くのはどのようにしたらいいでしょうか?
それ以外は思った通りの動きをしてくれました
>>862 一つの考え方として。
Dictionary使ってるからScriptingRuntime参照して。
Sub hoge()
Dim dic As New Scripting.Dictionary
Dim code As Variant
Dim mes As String
Dim i As Long
If Cells(1, 2) <> "" Then
For i = 1 To Cells(Rows.Count, 2).End(xlUp).Row
If Cells(i, 5).Value = "" And _
Not dic.Exists(Cells(i, 2).Value) Then
dic.Add Cells(i, 2).Value, ""
End If
Next
>>864 の続き
If dic.Count = 0 Then
MsgBox "説明書きはすべて入力されています。"
Exit Sub
Else
For Each code In dic.Keys
mes = mes & code & vbCrLf
Next
MsgBox mes & "の説明書きが未入力です。"
Exit Sub
End If
End If
MsgBox "データが存在しません"
End Sub
Ninjaレベルが低くて一発で書けないし。
自分で言うのも何だけど雑。テストもしてないし。
>>864 ありがとうございます
思った通りに動きました
こんなやり方もあるんですね
勉強になります
>>848 についてオートフィルタでダメなのか不思議
別に文句つけるつもりじゃないんだけと
>>866 すまんがどういうところが勉強になったのかな?
お前が思っていたやり方とどう違ったのか、なんでお前のやり方が何でダメだったのか
理解したってことなのか?
それとも、表向き言葉は質問だったけど、本当は「作くれよ」ってことだったのか。
こういうやりとりを見てると質問スレというより宿題スレのように見えてしまう。
回答者は親切心でやているつもりなのかもしれないけど、全く本人の為になっていない。
宿題スレにしたいのなら別スレ立ててくれ。
>>868 本人のためになったかどうかなんて
君の気にするところじゃないよ。
ExcelはIT技術者でないエンドユーザーが実務に迫られて
使っていることが多いのだから、回答の中身の理解よりも
問題の解決の方が本人にとっては大切。
そんなギスギスせずもっと大らかに参加しなよ。
>>869 勝手にこのスレを解釈するなよ。
>>1 ★5を声をだして死ぬまで読んでろ。
>>869 表面的な問題解決に放ってるけど、本質的な問題解決には全くなっていない。
ギスギスしてんなあ。 表面の問題解決が一番本人のためじゃないか。 仕事が進むんだから。 人に知識を与えるのに報いを求めるような人は ネットなんて参加しないでいいんだよ?
世界は自分の思った通りには動かないんだよ。 気に入らないことを見たくないなら、2chなんかに来ないことをお薦めするよ。
>>868 本人の為になったかどうかなんて、お前には関係ないよ
あと、この話引きずってこのスレ荒らすなよ?
このスレの初心者か? 力抜けよ
ブログラマ板にあるからプログラマしか参加できないなんておかしい。 エンドユーザーがVBAを使って何が悪い。 むしろエンドユーザーのためにあるのがVBAだろ。 次スレからはテンプレの5を外すことを提案する。 堅苦しすぎる。
881 :
桃白白 :2013/03/29(金) 08:38:17.67
ぜひともこのスレにて見識あるかたがたに わたくしめの質問をお聞きいただき できますればご教導いただきたく存じまする 身勝手なお願いであるとは重々承知しておりますが なにとぞよろしくお願いもうしあげまする る~るる~ みたいな ご教授いただきたいという人に対して教授はやだ教示ならやるっていうのを 桃白白はよく見かける 掲示板で質問者の成長を第一に考えるっていうのは なかなか難しいんじゃないか 質問者も回答者もはたしてそこまでする 必要があると考えている人がどれだけいるのだろうか 桃白白は疑問に思う
>>867 なんでオートフィルタじゃなきゃダメだと思ったのか疑問
>>881 君は皆に叩かれ突っ込まれながら成長したよね
VBA知識的にも、すぐムキにならず上手く躱せるという精神的な面でも
最初のころは感情的に吠えてばっかでまるっきり負け犬厨房だったけど
今は回答者の底辺に位置するまでになったからなぁ
なんで底辺とか言いたがるかなぁ。
マクロ使い始めた頃に、似た様なマクロ作った。 オートフィルタは適用範囲の指定が自動で効かない場合があるので、 そういう場合は範囲を手動で指定して、さらに指定が間違ってないか確認しなくてはならない。 手間もかかるし作業ミスが発生する恐れがある。 マクロ化するのに十分過ぎる理由だと思う。
いいんじゃない?丸投げ。 無視しても怒ったり文句言ったりしつこくしたりしなければ。
>>886 丸投げがあってもスルーすればいいだけなんだけどそれができないアホがいるから始末が悪い。
コードを書いてもらうことによって 初心者はやりたいことのアプローチの仕方が分かって そこから調べたり出来るから良いと思うけどね。 最初はどうアプローチしてどのキーワードでググればいいかも 解らないからね。
>>888 コードが必要とはそんなに思えないけど。
「○○のやり方がわかりません」とかいう表面上の質問に
何がどう分からないのか不明のままコードを提供する。
で、「勉強になりました」とかどういう勉強になったのか明かさず、どう考えても質問とは思えない。
ようは質問とは名ばかりで、コード作成依頼をしているのと同じ。
質問の体をなしてない。
コードを提示してもらってあえてググッたりするとは皆無だと思うけど。
質問者?は質問ではなくコード作成依頼をしてきてるわけで、
マクロが動けばいいという認識だからね。
やっぱり
>>1 ★5は次スレから削除かね。
丸投げお断りな人は別にスルーすればいいだけだし、
学ぶことを押し付けるのもやっぱり何だしね。
VBA自体は言語の中でも比較的初心者でも取っ掛り易い言語なのに
間口を狭めてしまうことになりかねないのかな。
約1名が、自演で何人も居るように見せかけながら
>>1 ★5叩き&印象操作を頑張ってるけど
コードクレクレ君にとって都合が悪いだけで、何の問題もない
>>890 コード作成依頼は別のところでやってくれ。
ってかさ何で別スレ作ろうとしないんだ?
荒らしの居座る典型的なパターンなんだが。
>>891 だね。コードクレクレ君が都合悪いから反対してるだけにしか見えないね。
>>891 別にクレクレでもいいと思うよ。
昨日のコードも
>>862 がコードで書いてと頼んだ訳じゃなくて
私が勝手にやった事だし。
コード書いてと言われても書く義務は無いけど、
頑なに拒絶する理由も無い。
>>893 こういうのが質問者が書いてと頼んでいなかったとしても、お前の行動がいかにも質問者が
コード作成依頼をしているように見せてしまっているのだが。
いい加減別スレ立てたら?
【コード作成】どんとこい Excel VBA【無料で承ります】
>>896 別スレを立てる理由が見当たらない。
許容すればいいだけだよ。
何でそんなに頑なに拒絶するの?
荒れるとか言ってたけど、
冷静に見てここの数レスで荒らしているのは拒絶している人の方に見えるけど?
>>897 いい加減さ、お前のマスターベーションは見たくないんだよ。
やってることはコード作成依頼の対応だろ。
質問スレなのに質問をどうするかなんて関係なくなっちまってるんだよ。
「動くコードを作ればいいんだろ」って考え方がもうこのスレのテンプレからかけ離れてる。
お前がどう思おうが関係なし。全ては
>>1 が正しい。それが2chの掲示板。
それに従えないということなら別スレ立てればいいだけのこと。
>>898 まぁ、私にとってそんなに重要なことではないからこれ以上は言わないよ。
消すか消さないかはどっちにしたって次スレ立てる人に委ねるしかないしね。
でもそこまで言わせるって、以前一体何が有ったのかって思っちゃうよ。
>>898 お前まじでうざいわ。
自分が荒らしだって気づいてるか?
嫌ならこのスレにくるなよ。
>>889 何で何がどう勉強になったか、お前に説明する必要があるんだよ
お前ちょっとおかしいんじゃねーの?
俺は俺の知らない誰かが、勉強になったかどうかなんてちっとも気にならんが
なにこの人怖い
最近どのスレいっても自己顕示欲の人がいるように見える
>>903 全部同一人物だったりして。
いずれにせよ、テンプレ原理主義は荒れるからやめてほしい。
905 :
桃白白 :2013/03/29(金) 23:50:08.27
>>899 最近スレ盛り上がってたから
>>898 はそれをみて興奮してるんだろう
ひきつけみたいなもんだ まわりの雰囲気を無視して教条主義的に
ルールを適用しようとするあたり軽度のADHDなんじゃないか
コードを書いてレスするののどこがいけないのかさっぱりわからん。 疑問質問にくどくど日本語で説明するより、コード書いた方が楽じゃん。
VBAって親切だから演算オーバーフローが出ると 「オーバーフローだからな」って谷桃子みたいにビンタしてくれるんですごく良い って思いませんか???
>>900 お前もウザイと思ったらこのスレこなきゃいいのにww
>>901 勉強になったというより質問の体をなしていないということが問題といっているのだが。
スレタイちゃんと読めてるのか?日本語読めるか?
>>906 全然ダメ。
ってかさなんでコードでレスしないんだ?www
コード書いたほうが早いんだろ?
>>899 こういうアスペが寄り付かなくなるなら
俺も消すのに賛成だわw
>>909 百歩譲って質問の体をなしてないとしようか。
それでお前は何が困るんだ?
今までもこんな質問山のようにあったし、これからもあるぞ。
お前はその都度いちいちイチャモンつけてスレ荒らす気?
>>910 ん?コードでレスすることよくあるけど?
>>911 消すべきだね。
じゃないと何度でもテンプレ
盾に取って暴れるよこの人。
>>913 なに日本語でレスしてんの?
コードでレスするほうが楽なんだろ?
>>915 アスペなの?
コードなんかいらないって奴がいたから、技術的な質問には日本語で説明するよりコードのが楽って言ったんだけど
結局この人、なんで1★5を消しちゃいけないのかまともに説明してないんだよね。 体をなさなくなるとかいって、昨日の朝からずーっとこのスレが体をなさなくなるように 荒らし続けているのも意味が分からない。
>昨日の朝からずーっとこのスレが体をなさなくなるように荒らし続けて 一旦スレ埋めて自分で立てて乗っ取るんですね
ま、スレが埋まった後新スレのテンプレに★5が削除するという行為はできないと思う。
>>1 のテンプレが正義ということを肯定してることになるからね。
結局何かあったらテンプレに書いてないだろとか言い出しそうだw
>>919 テンプレに悪も正義もないよ。
皆で楽しくやっていく為に作られた取り決めなだけ。
今回の様に
>>1 ★5が有ったが為に、誰もそれを守っていない者など居なかったのに
勘違いした人が執拗にテンプレを盾に取って荒す者が出れば、
当然皆それについて話すし、その時の流れで決まる。
そもそも、息の長いスレではテンプレに全く改修が入らない方が珍しい。
どっちでもいいけど ★5が入って昨日の荒しがドヤ顔で やっぱり俺の言ったことは正しかったってみんな認めてるだろwwww とか出てきたら超ムカつく
922 :
デフォルトの名無しさん :2013/03/30(土) 20:47:49.18
自分もエンドユーザーだけど、本業が忙しく、作成時間も限られている 為、コード書くのは、客が長めのクレーム電話かけてきたときに、 うわのそらで適当に相槌いれながら、作ってたりするな。 細かい原理とか、多少の効率の悪さより、使えるレベルで即動作するこ とが最優先。大抵はネットに知りたいことがのってるから、このスレで 質問したことはないけど、コード記載して回答してくれるのは、 現場の人間にはありがたいんじゃないか。
何のいい訳だよ
>>922 こういうので後で痛い目を見るのだが。
それが本人であればいいんだけど、これが別の担当になったりすると精神的によくない。
そんなことより 昨日俺らの方がひどい目に合わされている訳だが
VBA初心者ですが 2週間かけて5000行のVBAコードを書き上げましたが 実行するとほぼ1舜で処理が終わってしまい正しく動いているのかどうか全くわからないのですが 一体どうすればいいのでしょうか?
927 :
デフォルトの名無しさん :2013/03/30(土) 22:34:31.49
>>924 自分の残業が減ればいいので、自分の担当でなくなれば、
プログラム消してから異動すれば問題ない。
しょせん、事務職だしね。
立つ鳥、跡を濁さずってやつです。
928 :
桃白白 :2013/03/30(土) 22:41:06.43
>>926 ところどころにDebug.Printを挿入して
お茶を飲みながらイミディエイトウィンドウを眺めてうひょー動いとるのー
と言えばいいじゃん
>>926 自分の作っているものが合っていれば、
結果こうなる筈だってのは無いの?
>>928 >>929 セレクトケースで分岐してる箇所が500箇所ぐらいあり結果に応じてそれぞれが行き交うようになってますので中間作業が正しく動いてるのかどうかを調べるのは至難の業のようですね、
全肯定でログを書き出すようにするとかあの手この手で色々やってみます。
>Debug.Print
試して見ます。ありがとうございます。
分岐だらけでテストをするのも途方に暮れるコード・・・ 何か物凄く嫌な予感がするな
932 :
デフォルトの名無しさん :2013/03/30(土) 23:22:14.24
>>924 職業SEじゃないから、自分がいなくなった後まで、プログラムを残しとく
必要性もないしな。
会社だって、エンドユーザーが業務システムをDOM操作して、自動作業してる
とは思わないだろう。
そもそもDBへのアクセス権も、ソースが見れる状態でもないわけだし。
後任は、手動でやることになるからたいへんかもしれないが、まあそれが
本来の事務だから、頑張ってもらうしかない。
たとえ、残したところで、普通の事務職は保守などできないだろうし、下手に残し、
法改正などで、修正が必要なのに気づかずに使われて、責任とらされても困る。
>セレクトケースで分岐してる箇所が500箇所ぐらいあり 後で保守させられる人間になりませんようにナムナム
俺なら余裕
そもそも、500通りも別々の処理なんて本当にやってんのかね? サブプロシージャにしたら適当な引数渡して処理できそうな気がする。
>>930 >セレクトケースで分岐してる箇所が500箇所
別スレでエクセルでビックデータ解析するんだとか言ってたおっさんですか?
939 :
桃白白 :2013/03/31(日) 01:31:01.03
セレクトで分岐する数が2つだとしてもそれが500あったら
分岐の組み合わせは2の500乗で超大変じゃん
セレクト文ごとに関数を分割してそれぞれの分岐が正しく行われるか
だけチェックしてあとは状態が変わる境界値を放り込んで全体の動作をチェックして
完璧だと宣言するべきだと思うんだよね 桃白白的にはそうするべきだと思うの
みんなだったら
>>930 のようなときどうする?
926の5000行のコードだけど、それだけ長いとどれほどのことが出来るんだろう
>>939 大体考え方として同じ。
でもその前にObject 指向で言う所のリファクタリングかなと。
Vbaでは何て言うんだろ。
942 :
桃白白 :2013/03/31(日) 04:01:10.19
>>941 VBAでも変わらんでしょ リファクタリングってテストがないとできないんじゃね?
>>930 何も考えずにDebug.Print入れるのに大変苦労すると思う。
それなら、分岐が全部通るテストデータを作ってどこが通ってどこが通らないという
絞り込みをしてから、Debug.Printをいれたほうが効率的だと思うけど。
ってか
>>929 が言ってるとおり、まず、正しい結果が得られているのかわからんのだが。
正しい結果は得られているのかな?
5000行のコードだとか、Select Caseの分岐箇所が500箇所とかあまり関係ないと思うけど。
まずは一パターンの正常系の処理が動いているか判断したいだけなら、Debeg.Printより
コードの一番先頭にブレークポイント貼ってからステップ実行すればいい。
>>936 ,937はデバッグのことを言ってるわけだけど全く無視されちゃってるし。
この後に、Debug.Print1000行入れたのに殆ど出力されません。とか言ってきそうな予感。
945 :
桃白白 :2013/03/31(日) 05:02:31.02
>>944 テンプレがどうとかで荒らすのはやめたのか? あ?
>>945 その件に付いては、このスレの住人は
>>1 ★5に付いて比較的どうでもいい人、
要らないと思ってる人が殆どみたいなんで、
次スレ立てるときにしれっと「荒すなら出ていって下さい」的な
文言に置き換えておけばいいと思ってるの。
947 :
桃白白 :2013/03/31(日) 05:30:04.88
>>946 なにいってんだお前が質問者のためになってないとか
なんとかいって荒らしてたんだろ 違うか?お?
948 :
944 :2013/03/31(日) 05:45:21.72
>>939 VBA初心者に境界値がどうのこうの言っても分からんでしょ。
レスを見る限りデバッグの仕方が分からないと言ってるようにしか受け取れないんだが。
ステップ数とか分岐の数とかに誘導されすぎ。
>>930 は分岐の数は多かろうと普通にデバッグ&テストデータを増やすでいいと思うよ。
>>945 すまん。何言ってるのかわからない。
949 :
桃白白 :2013/03/31(日) 05:48:30.94
>>948 平成25年3月31日
Excel VBA 質問スレ Part28
>>944 様
桃白白
念書
平成25年3月31日(日)午前5時2分、桃白白は人違いをし
>>944 様に暴言を吐きました。
>>944 様の気分をいちじるしく害すとともにスレの空気を
悪くしスレを利用されておられるみなさまに多大なるご迷惑
をおかけしました。
桃白白が勝手に思い込みそれをなんの疑問も持たずに書き込む
という桃白白の日頃からの軽薄な行いが原因にあることは明白であり、
>>944 様ならびにスレのみなさまに心からお詫び申し上げます。
今後は書き込みを行う前に根拠がじゅうぶんであるか
考えて書き込みを行うよう肝に銘じ、二度とこのような失態を
繰り返さないことをお誓いいたします。このたびにかぎり
寛大なお心でお許しくださいますようお願い申し上げます。
以上
950 :
946 :2013/03/31(日) 06:05:05.41
こういう文書で、最後に「以上」とだけ書くのは失礼に当るぞ
友人や同僚との日常的なメールの締めくらいならいいけど
得意先や上司相手はもちろん、親しき仲でも冠婚葬祭などの改まった場や
謝罪文などを「以上」で締めるのも非常識な行為
本音ではなく嫌味で
>>949 を書いてるなら、嫌味ったらしさが引き出されて効果抜群だがな
952 :
桃白白 :2013/03/31(日) 06:10:10.75
953 :
桃白白 :2013/03/31(日) 06:12:57.90
>>951 え? そういうもんなの? それは知らなかったわ
以上付けたら失礼になるの? まじで~ 謝罪文が失礼とか
もう救いようないじゃん 桃白白超かわいそ~
954 :
946 :2013/03/31(日) 06:21:20.58
>>952 横槍で済まんかったけど本当に違うんだ・・・。
勿論あの時のアスペ君でもない。
俺は別にいいけど、
>>944 にはもう一度謝っておいた方がいいと思うよ。
955 :
桃白白 :2013/03/31(日) 07:16:54.23
平成25年3月31日
Excel VBA 質問スレ Part28
>>944 様
桃白白
始末書
平成25年3月31日(日)午前5時30分、桃白白は本来
>>944 様に返信するべきところを間違って別のかたに返信し、
度を越えた発言を行い、
>>944 様また
>>946 様の会話を阻害し
>>944 様また
>>946 様に不快な思いをさせ、ご迷惑をおかけしました。
この不祥事は桃白白の身勝手な思い込みと慎重さを欠いた言動が
原因で生じた事態です。まことに申し訳ございませんでした。
心からお詫び申し上げます。
今後はスレのみなさまの円滑な会話の進行とスレのみなさまの
調和を第一に考え、節度ある発言を心がけます。深く反省して
おりますので寛大なご処置を賜りますようお願い申し上げます。
このスレが盛り上がるのって、大体こういうVBAと関係ない話題の時だよね。 ほんともうテンプレ見直す時期かもね。
なんでそこでテンプレの話に繋がるんだ?
どんだけテンプレ変えたくて必死でウズウズしてるんだよw
テンプレっつーか
>>1 が効果あったら
「ExcelのVBAに関する質問スレです」に従ってこんな流れにはならないわけで
故に時々脱線して盛り上がることは、テンプレを変えたって避けられないよ
テンプレ云々の話が嫌なら「VBAなんでも質問スレ」でいいんじゃね?
>>956 起きてもいない事象をアスペが勘違いして荒らさなければ
テンプレを盾に取って荒らしまわる奴もいることが露見されることは無かったからね。
要するに、消しても問題が出るかもしれないけど、
今の状態で既に問題アリアリだってことだよね。
少なくとも改変はしないとね。
掲示板のルールに従えない奴がコードでレスする。 まともなコードとは到底思えないけどw
>>960 必死過ぎワロタw
じゃそのルールが変わってもちゃんと守れよw
>>962 住人の意見をシカトしてやっちまったか。
基地外だな。
両方の意見があるんだから、どっちを取ってもいいんじゃないの? というか自分の意見と違う結果になっただけで他人を基地外扱いする奴こそ 本当の基地外だと思う
本物のキチガイの思考
>>965 ここ数日の流れでは、1対多にみえるが。
それを同等の意見と見なすのはどうかと思うよ。
968 :
デフォルトの名無しさん :2013/03/31(日) 12:49:35.37
>>943 自分が前任者から引き継いだものをそのまま引き継ぐ。
自分が作ったVBA資産は消去。本来の事務の流れに戻るだけ。
経営者でも職業SEでもないから、それでかまわないし、後任が残業したくないなら、
自分でナントカすると思う。
まあ、自分でナントカする気の人なら、自分の資産を引き継がせて、保守を任せて
もかまわないわけだけど、事務職でそこまで手をのばす人はなかなかいない。
VBAいじる職種はたいてい片手間だからな 本業のヘルプデスクとかセットアップとかで手が回らん
自分の業務範囲で自分がラクする為のVBAは作るのも使うのもお気楽でいいんだけど 人に使ってもらうVBAを作るのはしんどい
VBAいじる職種には、運用改善も大事な業務。 ボーナスとかに影響するけど 運用改善ってのはアイデアを出すだけじゃなくて 実際にそれが当たり前のことになるまで全部面倒を見ないといけない
>>967 > ここ数日の流れでは、1対多にみえるが。
多分、どちらかに偏ってる人たちは、お互い1対多で自分の方が多勢だと思ってるよ
どっちでもいい派から見ると、どっちも2,3人ずつっぽいが
973 :
デフォルトの名無しさん :2013/03/31(日) 13:40:36.13
自分の本業は窓口業務。 督促業務とか、苦情受付とか、電話相談、制度説明などだわ。 日中はそれで潰れる。 まわりでVBA作成しているのは、自分くらい。 入力業務やお知らせ作成業務などもあるので、VBAあるのとないのとでは大違い。
>>973 ほぼ同じだが、入力業務やお知らせ作成業務とかはほとんど無い
VBAは、苦情受付・電話相談・制度説明のために作る
残業でセットアップや運用改善にあたる
こんなつまらん議論でスレが消費される事の方が問題だわ
976 :
デフォルトの名無しさん :2013/03/31(日) 13:53:35.72
>>974 VBAを苦情受付・電話相談・制度説明で活用?
うーん、想像つかない。VBAだとむいてなさそうだけど、電話の記録を残しておくのに使ってるってことかな。
入力業務は業務システムをVBAでDOM操作、お知らせ作成は業務システムからはきだされたCSVで自動作成って
いう使い方しか、うちはしていないな。
カンマ区切りで改行があるレコードだけ”で囲ってあるCSVを上手に読む方法ってあるかしら 一文字ずつ読み込んで処理するしかないのかしら
>>976 苦情受付・電話相談・制度説明は全部AccessDBに保存・入力されるようになってて
履歴を検索して回答することが多い
>>977 csvファイルダブルクリックで普通に読み込めるけど、どういう点が気に入らない?
>>977 ADOとか使ってテキスト用のドライバで読むとかあるけど
CSVって結構こまかいフォーマットが違うからなぁ
改行含んでたり、特定項目だけクォートありとかならやってみないとうまく行くかわからん
EUCの話はさすがにスレ違いだろ マ板でやってくれよ
>>977 セル内の改行と、行の終了の改行は改行コードが違う。
セル内の改行コードはvbLfで行の終了を表す改行コードはvbCrLf。
>>981 ,982
改行コードが複数種類入っているのか、途中でズレてしまうんです
>>972 テンプレ原理主義者はさすがに三人はいないでしょ。
居て二人。
俺の見立てでは一人。
>>984 それはWindows標準の場合
マック版だったり、CSVを作ったシステムやプログラムによってはそうとは限らんかもしれん
その辺厳密にやりたいなら自分で読み込んで解析するしかないんじゃね
え? 俺には見えてるんだけど、お前には見えないの?
>>972 どっちにしても、審議中に皆の意見を無視して立てたことに変わりはない。
馬鹿なことをしたもんだ。
>>986 きっと相手方はその逆のこと思ってるぜw
>>988 というか、項目内改行コードがLFだというほうが特殊で、CRLFで改行されるのが普通。
が、項目内改行はおろか、行端の改行もLFの可能性があるのがCSVの悪いとこで、
結局自前でパースしろって結論になるわけだが。
>>991 相手っていってもお前も含めて一昨日の荒し1人だけだけどな
うめ
どっちかというと、VBAで仕事を改善した俺すごいでしょ、でも俺が居なくなるとき消すもんね 的なコメントの方が★5を守れっていってる奴より腹立つね
>>984 セル内の改行コードはvbLfでもvlCrLfでもどっちでもいけちゃうはず
いや別に。 荒らしたりとかの実害ないし。
>>996 仕事を引き継げばいいだけの話であって、VBAまで引き継ぐ必要性は無いでしょ
1000なら桃白白が実は・・・
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。