1 :
デフォルトの名無しさん :
2011/08/04(木) 14:30:44.38
ExcelのVBAに関する質問スレです ★1 質問テンプレ(雛形)は用意しませんが、OSとExcelのバージョンは必ず書きましょう。 ★2 ExcelのVBA以外の部分に関する質問はNGです。 但し、VBA無しでも出来ることだが、あえてVBAでやりたいって物に関してはOK。 ★3 ExcelのVBE(Visual Basic Editor)を使うとしても、VBAの分野以外に関してはスレ違いです。 VBAとは、『Visual Basic for Application』の略で Application ├Workbooks |└Workbook | ├Worksheets | |└Worksheet というApplication以下のオブジェクトを、VB言語で操作するものを指します。 例えExcel付属のVBE(Visual Basic Editor)を利用しようとも、このApplication以下のブックやシート、 セルやオブジェクト等を操作するもの以外はVBA分野の話ではないので、ここでは聞かないでください。 ★4 とりあえず、Excelのインスタンスを作らずにVB6で出来ることは全てスレ違いだと思ってください。 ★5 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。 ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。 ★6 わからなければとりあえず「マクロの記録」(Alt, T, M, R)
>1-2 乙
4 :
デフォルトの名無しさん :2011/08/04(木) 21:56:17.18
いきなりの質問ですが 例えば列を20列目までデータを入力した後 データを全て消しても、UsedRange.Rows.Counで最後の列を取得すると 20列目が選択されてしまいます。 これを解消するには何か手段はあるのでしょうか? よろしくお願いします。
5 :
デフォルトの名無しさん :2011/08/04(木) 22:11:49.66
workbookをたくさん扱うVBAを書いてるんですが、 workbookのブックナンバー(シートでも出てくるindexと呼ばれるヤツ)を取得するにはどうすればいいんですか? エラーが出るばかりでエラいことになってるんですが・・・
6 :
デフォルトの名無しさん :2011/08/04(木) 22:15:20.68
cells(x,y)やrange("A1")を扱うとき、その直後に .value は省略できないんですか? いままで .value となるべきところではずっと省略して書いてきたんですが たったいま初めて .valueを書かないと正常に実行されない現象を確認しました。
>>4 UsedRangeを使わなければいい。
>>5 Index使わないとダメ?For eachで何とかならない?
>>6 外すな。付けとけ。
8 :
4=5=6 :2011/08/04(木) 22:44:53.39
>>7 じゃどうすればよい?
>>7 うんIndexを使いたい
>>7 わかった。でも省略できる条件とかある?
EXCEL2003 XP32bitSP3の環境です。 VBAからwindowsのAPIを使いたいと思って、調べた結果 VBAから直接呼び出せないAPIはDLLを作って呼び出す方法が 有るのは見つけたのですが、最終的にDLLになるんだからDLL作成 言語は何でもいいという認識で良いですか?
>>4 1回保存したら行ける気がする
しかし、いま2007で確認したら、ちゃんと消した後の範囲返したぞ
>>5 WorkBooksに使うインデックスなら、名前でも行けるからブック名使っとけ
>>5 Rangeのデフォルトプロパティは実はValueではないからValueを期待した省略はやめとけ
>>9 そのAPIが呼び出せて、VBAから呼び出し可能なDLLが作れればなんでも良いんじゃね
>>5 >>10 の意見に賛成だけど
どうしてもIndex取得したければ自前で作るしかない
でも Index だと 途中でブックをクローズしたりすると
それ以降のIndexが ずれるけどいいの?
まあ下記とかで取得するしかないような
Sub TEST()
WBNO = BookNo("BOOK2.XLS")
Debug.Print WBNO, Workbooks(WBNO).Name
End Sub
Function BookNo(WBNAME)
'ブックが存在していない場合 0 を返す
Dim No As Integer
Dim Wb As Workbook
BookNo = 0
No = 0
For Each Wb In Workbooks
No = No + 1
If LCase(Wb.Name) = LCase(WBNAME) Then
BookNo = No
Exit For
End If
Next
End Function
しかし、何でBookのIndexなんか欲しがるんだろうな。
何をやりたいのかよく分からん。
>>11 そのコードが実行される時、アプリケーション内にブックが存在しないケースなんて有るの?
13 :
11 :2011/08/05(金) 10:43:58.78
>>12 たぶんコメントの事をいってるのだと思うけど
プロシージャ BookNoは ※文字列※としての"ブック名"を引数として必要としてるが
Callする際に存在していない(又は無効な)ブック名を指定する事はいくらでも可能なわけだが
そもそもIndexで管理したいというのが間違い
16 :
デフォルトの名無しさん :2011/08/05(金) 21:08:35.58
画面上にコマンドボタンを表示して 押せばVBAが実行されるようになっていますが 画面を下へスクロールさせるとボタンだけが取り残されてしまい 現時点では手動でボタンの移動を行っています。 これをどうにかして画面をスクロールさせた場合でも 同じ位置に表示させることは可能でしょうか?
17 :
デフォルトの名無しさん :2011/08/05(金) 21:10:56.66
>>16 VBAとは関係ないけど
"ウインドウ枠の固定"をしておいてスクロールしないエリアへ
コマンドボタンを配置じゃダメなの?
IEで表示したサイトをコピーして、エクセルシートに貼り付ける処理を行っています。 今まで順調に利用できていたのですが、つい先日から 、「このページを使用して、クリップボードから情報を貼り付けますか?」 というダイアログボックスが表示されるようになってしまいました。 環境は エクセル2003 IE6 SP3 WinXP です。 スクリプトによる貼り付けの許可は有効にしてあります。 どのような対処をすればよいでしょうか。
コピーじゃなくてinnerText使えばいいんじゃね?
>>19 ちょっとくぐってみたけど
そのメッセージは、IEからでてない?
Excel vba 関係ないような
スレチ じゃね
22 :
デフォルトの名無しさん :2011/08/06(土) 21:54:06.01
publicな変数でもそれは同じブック内に限り どんなモジュールからでも参照できるということで 他のブックからは参照できないという認識であってますか? もしそうならブック間でも共通に使えるような変数ってどうにか作れないのだろうか?
23 :
デフォルトの名無しさん :2011/08/06(土) 21:59:13.20
>>12 わたしがBookのIndexが欲しいと言ってるから使いたいのだ。
きみがSheetのIndexの使用をわたしに禁止されたら困るだろ?
24 :
デフォルトの名無しさん :2011/08/06(土) 22:10:28.24
VBAに限らず、CやJava含めたプログラミングにあたり、 変数は、値渡し、参照渡し、矢切りの渡し、 どれをメインに使っていくのが得策でしょうか?
25 :
デフォルトの名無しさん :2011/08/06(土) 22:11:27.24
26 :
デフォルトの名無しさん :2011/08/06(土) 22:15:32.32
>>22 その考え方で合ってると思います。
が、
そもそも、複数モジュール間のやりとりをPublicな変数で行うのは如何なものかと思います。
プロパティであれメソッドであれ、セッタやゲッタを作ってやりとりすれば
モジュール間であれBOOK間であれ、
特に深く考える必要も無くて宜しいんじゃないでしょうか。
28 :
デフォルトの名無しさん :2011/08/06(土) 22:22:58.97
>>27 ありがとうございます。
セッタやゲッタのことについて勉強して出直してきます。
29 :
デフォルトの名無しさん :2011/08/06(土) 22:26:07.05
VBAを勉強するにも結局はいろいろいじらないと覚えないけで 本だけじゃ使いこなすスキルにおいて身に付きません。 Excelのシート関数も同様で、結局は他人の作った関数がいっぱいあるシートをたくさん見ているときがかなり上達した気がしました。 VBAでも誰かが作ったコードを大量に見れるようなサイトはないですか?
30 :
デフォルトの名無しさん :2011/08/06(土) 22:31:28.63
シートモジュールじゃなく標準モジュールに Sub worksheet_change(ByVal a As Range) MsgBox "うんこ" End Sub と書いたら反応しないのはぜですか? また、シートモジュールに書いても別シートだと反応しないのはなぜですか?(Private Subじゃないのに)
32 :
30 :2011/08/06(土) 22:43:27.11
釣れた(笑)
33 :
30 :2011/08/06(土) 22:43:53.13
冗談はさておき、 シートモジュールじゃなく標準モジュールに Sub worksheet_change(ByVal a As Range) MsgBox "うんこ" End Sub と書いたら反応しないのはぜですか? また、シートモジュールに書いても別シートだと反応しないのはなぜですか?(Private Subじゃないのに)
>>29 VBAに限らずこう言ったものを作りたいと言った時に、
こう言った組み方をすると綺麗に実装出来るよと言う
定石的な物が有ります。
それをデザインパターンと言うのですが、
VBAには継承と言うものが無く(当然、継承が無いわけですから
オーバーロードやオーバーライドは存在しません。
しかし何故かインターフェースは有りますので、そちらでポリモーフィズムは
使えたりします。)
実際には継承の替りに委譲を使ったりしなければなりませんが、
それでも考え方として取り入れると、VBA固有のクラスに関しては
別途使い方を覚える必要はあるものの、
どういう組み方をすればいいかの参考にはなると思います。
求めているものと違うかもしれませんがご参考までに。
ttp://www.atmarkit.co.jp/fdotnet/vbcheer/vbcheer12/vbcheer12_01.html
37 :
デフォルトの名無しさん :2011/08/07(日) 01:10:11.13
あれっVBAのフォームに、メニュー作ることってできなかったっけ?
デキルヨ
40 :
デフォルトの名無しさん :2011/08/07(日) 09:58:15.11
ここで聞いていいものか不明です。 スレ違いで有れば削除します。 VBAでGroupMaxのメール操作は出来ますでしょうか? 具体的には共有book(非ブックの共有)の勤務表等で 間違いや未記入が有る場合に対象者にお知らせメールなどを VBAで自動的に送信したい。 Outlookが使えれば出来そうなんですが・・・・。 使用環境 Win XP SP3 Excel 2007 GropMax 6
まずスレ違いだと思うよ たが ちょっとコメントを GroupMaxって日立のグループウェアでしょ この手のアプリって自社開発ソフト以外の外部アプリから操作って基本出来ない(させない)って 思うけどな。(セキュリティ問題もあるし) まあGroupMaxの開発元に聞くしかないよ
43 :
37 :2011/08/07(日) 12:07:18.00
>>38 ゎたしどうゃって作るか聞ぃてるんですけど♪
44 :
デフォルトの名無しさん :2011/08/07(日) 14:32:16.91
モジュールの宣言セクションに書いておいた「ステートメント」は そのモジュール内のどのプロシージャが実行されるときにその直前に必ず実行されるのでしょうか? 気になって夜も眠れません。
45 :
デフォルトの名無しさん :2011/08/07(日) 14:35:33.45
あれっモジュールの宣言セクションに「ステートメント」って書けなかったっけ?
46 :
デフォルトの名無しさん :2011/08/07(日) 14:36:41.67
誰か助けて。 宣言セクションって、変数を宣言することくらいしかできないの? その変数に初期値を代入しようとしてるんだけど、そうしたらマクロ自体が実行できなくなった。
47 :
デフォルトの名無しさん :2011/08/07(日) 15:07:21.46
あれっVBAのフォームのコントロールって、配列コントロールにすることってできないっけ?
48 :
デフォルトの名無しさん :2011/08/07(日) 15:16:20.14
フォームを使ったマクロを終えるとき フォームを消すための「Unload UserForm1」みたいなコマンドは 付けておいたほうがいいですか?または無くてもいいですか? またそうするのがいいと思った考え方を教えてください。
50 :
デフォルトの名無しさん :2011/08/07(日) 16:23:07.50
>>49 ありがとうございます。
そうするとloadはshowを含み
unloadはhideを含むということですね。
つまりshowしたらload+show、
unloadしたらhide+unload
をしたことになる?みたぃな。
51 :
デフォルトの名無しさん :2011/08/07(日) 16:29:44.74
VBなら UserForm_Initialize() UserForm_Load() の2つあるのに VBAなら UserForm_Initialize() の1つしかないんですね。 ついでに質問ですがVBでプログラミングしてるときに UserForm_Initialize()とUserForm_Load()の使い分けってあるんでしょうか? またどちらかをメインに使ったほうがいいのであればその心を教えてください。
52 :
デフォルトの名無しさん :2011/08/07(日) 17:20:02.65
Private Sub UserForm_Terminate() はどういうときに使うの?
ユーザーフォームをターミネートする時でしょ
54 :
デフォルトの名無しさん :2011/08/07(日) 17:46:19.32
>>53 なるほど。さっぱりわからん。Thanks.
>>47 出来ないはず。おかげでイベントハンドラ書くのがしんどい。
56 :
デフォルトの名無しさん :2011/08/07(日) 18:08:03.93
>>55 やっぱりできなかったのか。ありがとう。Thanks
>>55 クラスモジュール使えば それに近い事できるけど
メンドイからその説明はしない
>>51 > UserForm_Initialize()とUserForm_Load()の使い分けってあるんでしょうか?
当然ありますよ。自分はフォームを拡張するクラスを作って、WithEvents使って
クラス側でフォームのイベント処理をしているけど、InitializeにもLoadにもコードは書いてあるし
これはどちらかにまとめることも、当然ながら入れ替えることも出来ない。
> またどちらかをメインに使ったほうがいいのであれば
それは目的次第だよ。基本的に目的に合ってる方を使えば良い。
両方とも目的に合ってるなら好きな方を使えばいいし、目的に合わない物を無理して使う必要も無い。
>>47 ,55-56
クラスとコレクション使って、疑似コントロール配列にすれば良い。
疑似なんて言うと本来のというかVB6のコントロール配列に劣るように聞こえるかも知れないが
実は疑似コントロール配列の方が高度な処理が出来て、VB6でも標準のコントロール配列を使わず
疑似コントロール配列で実装することも多い。
>>58 横レスになるけど失礼します
疑似コントロール配列の作り方というか
綺麗に実装出来る参考となる文献なりサイトってご存知ないですか?
何度か疑似コントロール配列は作った事はあるんですが
コレクションは使わず
配列にクラスオブジェクトを入れてたりしたんですが
なんか定石みたいなのって ないかなって思ってます。
>>59 添字でアクセスしたいだけとか
イベントをまとめたいとか
動的に作成したいとか
目的によって実装方法は千差万別
(疑似)コントロール配列は、目的そのものではなく
目的を満たすための手段でしかないんだから定石も無いし
実装の何を以て「綺麗」とするかは人それぞれなので
君が綺麗だと思う実装方法は君にしか見つけられない
つーか、初心者は綺麗とか定石とかに拘りすぎ
綺麗に書くことが目的になっていて、その先が見えていない
全てのコードは目的を実現するための手段でしかないことを忘れるな
61 :
59 :2011/08/08(月) 18:54:37.55
>>60 ありがとうごさいます
ご意見を胸に刻み精進します。
コードに「綺麗さ」を求める奴は大概トリッキーなコードを書いて後々保守する奴がそれで苦労させられるということを全く考えていない 所期の目的を達してなおかつ判りやすいというのを目標にすりゃぁいいものを
vbaってマルチスレッドできない?
>>62 お前の「後々保守する奴がそれで苦労させられるようなトリッキーなコードが綺麗なコードである」
という認識が間違ってるとは思わないの?
とりあえずみんな『ビューティフルコード』くらい読んでから綺麗とは何かを語れや
OS:Windows7 x86 SP1 Office:Excel2010(14.0.6023.1000) 【コード】 With Application .Calculation = xlCalculationManual .ScreenUpdating = False End With シートの枚数分ループ--- maxRow = Worksheets(targetSheet).Range("A65536").End(xlUp).Row Worksheets(targetSheet).Range("1:" & maxRow).Copy targetRow = Worksheets(1).Range("A65536").End(xlUp).Row + 1 Worksheets(1).Rows(targetRow).PasteSpecial Paste:=xlPasteValues ---- 【現象】 上記コードで複数シートに入力されているセルを1つのシートへまとめてるVBAマクロ を実行した後に、 With Application .ScreenUpdating = True .Calculation = xlCalculationAutomatic ←これ End With を実行するとExcelのステータスバーに 再計算:(プロセッサ 4個): 0% と出てだんまり状態になってしまう。 マウスホイール回転やクリックするとすぐに再計算が実行されて終わるけど 何もしないでいるとずっとこのままで、マウスカーソルが○マークになって マクロの処理は終わっているのにまだ処理中になっている状態に見えてしまい 気になるのでなんとかしたいんですが、解決策をご存知の方はいらっしゃいますか? 自動再計算はVBA終了後ONに戻したいです。 ちなみに、コピー対象のセルは他のシートを参照する関数を使ってます。
>>65 > お前の「後々保守する奴がそれで苦労させられるようなトリッキーなコードが綺麗な
> コードである」という認識が間違ってるとは思わないの?
>>62 も間違っていると書いてあるんだが。
ひょっとして馬鹿?
> コードに「綺麗さ」を求める奴は大概トリッキーなコードを書いて というのが間違い。 コードに綺麗さを求める奴は、大概トリッキーなコードは書かないだろ。 まあC++で簡単なテンプレートを使うくらいで「トリッキーなコード書きやがって」とかいう低脳もいるが。
>>68 >>62 が間違っていると主張しているのは、コードに綺麗さを求める行為。
なぜなら、綺麗なコードは得てしてトリッキーなコードであり、後続のメンテナを苦しめるから、という主張でしょ。
>>70 > 綺麗なコードは得てしてトリッキーなコードであり
新たな主張?
>>62 が書いてるのは「「綺麗さ」を求める奴は大概トリッキーなコード
を書いて」だけ。
「綺麗さ」を求める奴が「綺麗なコード」を書いてるとは書いてないよ。
>>71 > 新たな主張?
表現が間違ってた。訂正する。
なぜなら、綺麗なコードは得てしてトリッキーなコードであり、後続のメンテナを苦しめるから、という主張でしょ。
↓
なぜなら、綺麗なコードを求める行為は得てしてトリッキーなコードを産みだし、後続のメンテナを苦しめるから、という主張でしょ。
綺麗なコードを求めると、なぜ全員が綺麗なコードが書けないと思っているのかが不思議。
綺麗なコードを求めて、綺麗なコードを書けばいいでしょ。
まあ、VBAの世界じゃ、Class使っただけでトリッキーと言われ、 Eventを使いこなすと悪魔と言われるからな。
>>72 > 綺麗なコードを求めると、なぜ全員が綺麗なコードが書けないと思っているのかが不思議。
「大概」を無視して勝手に不思議がる方が不思議なんだが...。
> 綺麗なコードを求めて、綺麗なコードを書けばいいでしょ。
陥りやすいってことでしょ。
真偽は知らんけど。
そもそも「綺麗なコード」を求める奴のほぼ全てがトリッキーなコードを書くだなんてこと
>>62 はおろか、お前さんらも知るはずもないので、議論しても無駄。
「綺麗なコード」を求める行為を良しとするかどうかは、
>>62 が思う「綺麗なコード」の内容を
聞かなければ議論しても無駄。
77 :
デフォルトの名無しさん :2011/08/09(火) 16:53:12.31
シート上にフォームコントロールからチェックボックスを配置して チェックの状態でif文を使い判断させたいのですが このオブジェクトの指定方法が分かりません。 シート上のチェックボックスの名前はチェックにしています。 chk = Worksheets("Sheet1").OLEObjects("チェック").Object.Value だと上手くいきません。 どこが悪いのか分かる方教えてください。お願いします。
>>76 >誰が何に陥りやすいと?
>>「綺麗さ」を求める奴は大概トリッキーなコードを書いて
の意味が理解できないの?
とりえあずお前ら、綺麗なコードの定義を出せ
>>77 これでいいんじゃね
chk = Worksheets("Sheet1").CheckBoxes("チェック").Value
If chk = xlOn Then
Debug.Print "onです"
Else
Debug.Print "offです"
End If
>>79 役割ごとにきちんと分割してあれば見やすいな。
綺麗なのとはずれるけど
Me.CheckBox1.checked = True とかそんな感じじゃないの
83 :
77 :2011/08/09(火) 21:23:43.80
>>80 >>82 ありがとうございます。
一応思った通りの動作をさせることができました。
84 :
デフォルトの名無しさん :2011/08/09(火) 22:14:20.22
=ROUNDDOWN(( D3 ) - 26 * 110 * Sheet1!E2,0) とセルに入っている内容を replaceを使って =ROUNDDOWN((( D3 ) - 26 * 110) * Sheet1!E2,0) のようにしたいのですが上手くいきません。 分かる方お願いします。
>>84 上手くいきません。だけじゃなく
どのようなコードで どうゆう結果なのか書いてくれないと
(エラーなら エラーめっせーじも)
もしかして
Rangeオブジェクトのreplaceメソッドを使ってるのかな?
だとしたら この例だと
計算式が 一時的にせよ 破綻しないように変更するの難しいような
つまり 一発で ( ) を追加できない限り 計算式が一時的に破綻する
(破綻した時点で 実行時エラー となる)
下のやり方の方が良いんじゃない?
.Formula で計算式を文字列として取り出し
変更(Replace関数等使って)後に 元のセルに戻す
86 :
84 :2011/08/09(火) 23:47:51.50
すみません。自分で考えたのは以下の式です。 Cells(1, 1).Formula = Replace(Cells(1, 1).Formula, "=ROUNDDOWN" * " * Sheet1!E2,0)", "=ROUNDDOWN(" * ") * Sheet1!E2,0)") これでいくと型が一致しません。とエラーが出ます。 多分*のところが駄目なのかと思いますが解決策が見つかりません。 >つまり 一発で ( ) を追加できない限り 計算式が一時的に破綻する まさにその状態で直接書き換えるぶんには破綻しないのですが replaceで一気にいくとエラーの件で書き換えられません。
型が一致しませんって当然のような これ自体が VBA の文字列式(構文的)に 既に破綻している "=ROUNDDOWN" * " * Sheet1!E2,0)" "=ROUNDDOWN" と " * Sheet1!E2,0)" を積算しようとしてるからな やるなら "=ROUNDDOWN"" * "" * Sheet1!E2,0)" だろ あと Replace関数ってワイルドカードってできたっけ?
88 :
84 :2011/08/10(水) 00:15:39.47
>>87 答えて頂きありがとうございます。自己解決しました。
Cells(1, 1).Formula = Replace(Cells(1, 1).Formula, "=", "")
Cells(1, 1).Formula = Replace(Cells(1, 1).Formula, "ROUNDDOWN", "ROUNDDOWN(")
Cells(1, 1).Formula = Replace(Cells(1, 1).Formula, "* Sheet1", ") * Sheet1")
Cells(1, 1).Formula = "=" & Cells(1, 1).Formula
=を無くして式でな形式にしてエラーを防ぎ
カッコを付けたして最後に=を足して式にする。
いろいろとお騒がせしました。
89 :
84 :2011/08/10(水) 00:16:55.33
あとひとつ書き忘れです。 >Replace関数ってワイルドカードってできたっけ? 自分もそこが分からなかったのですができるかな?と思って。
90 :
デフォルトの名無しさん :2011/08/10(水) 01:02:54.05
>>「綺麗さ」を求める奴は大概トリッキーなコードを書いて 持論厨乙すぎる なんで「綺麗=トリッキー」って等式作っちゃったのか気になる まさかとは思うが変なアルゴリズムかまして短くまとまったコードを「綺麗」と形容してるんだとしたらゴミだな
91 :
85=87 :2011/08/10(水) 03:22:37.24
>>88 もう見てないかもしれないけど
自己解決して納得してるんならいいんだが
セルへのアクセスは最小限にした方がいいような
自分ならこうする
Str = Cells(1, 1).Formula
Str = Replace(Str, "ROUNDDOWN", "ROUNDDOWN(")
Str = Replace(Str, "* Sheet1", ") * Sheet1")
Cells(1, 1).Formula = Str
vbaってプログラムを他人に見られないように、コンパイルとか ファイルにパスワードとかけるの?
>>93 よくわからんがプロジェクトのロックのことか?
そうです、プロジェクトの事です。
>>67 なんだが、解決策ってやっぱないのかな?
2007はどうか知らないけど、2003では起こらない現象で、2010では起こる
2003から再計算の仕様変更とかその辺りのが原因なのかな
2010でネット上に同じような質問あるけど、解決しましたってのはないしね
画面をクリックしないとマクロの動作が終了しないってのはなんなんだろう
マクロの動作というか再計算で固まるっていう現象
フォームにボタンを置いて、ボタンのクリックイベントの中で whileを使ったループ処理をしたいんだけど、ループ処理中に ループを停止させたい場合ってどうすればいいの? ループ中はフォーム側に制御が戻ってこないから、 停止用ボタンを作っても押せないからどうしたもんかと。
DoEventsってVBAにはなかったっけ?
トリッキーなコードを書こうと思ってる奴か、 トリッキーなコードが綺麗なコードだと思ってる奴じゃ無いと 綺麗なコードを書こうとしてトリッキーなコードを書いてしまうなんてまれ。
処理中に制御権をアプリ側に明け渡す事なんか良くある事じゃん
>>99 まず前提として
・コードが簡潔にまとまってる方が綺麗なコードである
・コードの量を(ある程度以上に)減らすとトリッキーなコードになる
というのがあると思う
こうやった方がコードが短くて簡潔だな、と思ってどんどんコード量を減らしていくと
ある程度のラインを超えるとトリッキーなコードになってくる
その加減が結構難しい。人によってもそのラインは違うだろうし
その前提はVBAで成り立つかなあ?C/C++でそれを言うなら、まあ納得だけどさ。 目的を達するコードを、C++とかだと、それこそ無数に書きようがあるから、中にはトリッキーなものも出てくる。 でも、VBAはそんなにバリエーションないと思うんだけどね。寧ろトリッキーなVBAのコードの具体例を見てみたい。
他人が見て理解してもらえるのが綺麗なコード 他人が見てイミフ、なんでこんなことしてるの?って思われるのが汚いコードじゃないの?
>>102 たとえば、整数 a が
31以上40以下の場合、1を引く
40より大きい場合、2を引く
という処理があったとして
何も考えないで
If a >= 31 And a <= 40 Then
a = a - 1
End If
If a > 40 Then
a = a - 2
End If
綺麗(俺基準)に書くと
Select Case a
Case 31 To 40
a = a - 1
Case Is > 40
a = a - 2
End Select
だが、トリッキーなコードを書くと
a = a + (a >= 31) + (a > 40)
の1行でできてしまう
ありがとう。確かに、これはきめえわw 真が-1って共通認識をプロジェクトで共有できているなら使ってもよさげなんだが。 コメントで、注釈してもいいかも。 a = a + (a >= 31) + (a > 40) ' 条件が真ならば-1 てな感じ。 でもまあ、その程度じゃない?式中で代入は出来ないし、評価の短絡もない。 他の構文もそうそう別の簡単な書き方がある訳でもない。With使いまくりは勘弁な。
大昔のインタプリタなBASICだと圧倒的に速度差がでたんだが 今なら速度気にすることはあんまりないし(そもそもコンパイルで差が出ないかもしれん) まあ使っちゃいかん類の書き方だと思う
>>104 うん、そうそう。
だから、綺麗なコードを書こうとしている奴が
> a = a + (a >= 31) + (a > 40)
なんてコードを書くかね、って話をしてるんだが、
なんか変な奴が一人まぎれてるっぽい。
そいつは、綺麗なコードを書こうとすると上のようなコードを書きがちだと思ってるらしい、
>>107 うん、そうそう。
>その加減が結構難しい。人によってもそのラインは違うだろうし
その為の極端な例だと理解できない、注意力散漫な馬鹿ほど口出ししたいらしい
シートに表示→ツールバー→フォームからボタンを設定したする時に 複数のボタンをまとめるフォームというかコンテなってないの?
110 :
デフォルトの名無しさん :2011/08/10(水) 22:03:25.62
>>106 VBAってPコードコンパイラ積んでた?案外全部コロンでつなげた方が速いかもな。
>>112 あれ?名前に90って入れなきゃいけなかった?
そんな意味のない返ししするなんて相当悔しかったんだね
>>111 Cells(1, 1).Value = ComboBox1.List(ComboBox1.ListIndex)
>>113 Pコードコンパイルかどうかはしらんが
デバッグメニューにコンパイルってあるからなぁ
117 :
デフォルトの名無しさん :2011/08/11(木) 01:15:53.14
Dim TaTe As Long For TaTe = 3 To 99 Worksheets("sheet").Range(Cells(TaTe, 2), Cells(TaTe, 96)).Select With Selection .Replace What:=0, Replacement:=Worksheets("0").Cells(TaTe, 49).Value 99までは問題なく動くのですが100にすると RangeクラスのReplaceメソッドが失敗しましたとエラーが出ます
>>116 そういえばあったか。コンパイルって結果をブックにでも保存してるんか?毎回開くたびに走ってるのかな。
>>117 100行目のどっかのセルに変なコードが入ってんじゃないの?
綺麗なコードで書くと言うのは、如何に可読性を高めて次回の改修作業をより行い易くする為に行うこと。
無論、処理コストとの兼ね合いもあるが今までのレスを見ていると
もっと根本的なクラス設計の話が出て来て然るべきと思うんだけどなぁ。
まず、
>>104 みたいなのは論外。型を何だと思ってるんだ。
ついで言うと、グローバル変数を指定して他のクラスから呼ぶのもやめれ。
きちんとそう言った他のモジュールと橋渡しになるエンティティを作ること。
設計の際にはどのクラスにどう言う役割と責任を持たせるか最初から考えて作っておくこと。
細い所で技に走ってちょこっとソース縮めてみても根本的な所がしっかりしていなければ
全体的にグダグダなソースになってしまう。
CTRL+スペースでchrが出て来るのに、実行するとCHRが無いってエラーが出て、 定義で調べても無いって言われるのは何故?
>>120 >綺麗なコードで書くと言うのは、如何に可読性を高めて次回の改修作業をより行い易くする為に行うこと。
持論厨乙
て言うか、VBA でクラス設計云々言うのはちょっと痛すぎ。
>>123 クラス設計云々はともかく、メンテナビリティは重要な要素だろうが
子供に部屋のかたづけとはまずは部屋のレイアウトをCADにおこして、かたづけのフローを書いてだな とか言い出しかねないな。
ウチは大げさに捉えればそうしてる
エンティティとか役割と責任って言葉を最近覚えたんだろ。 外は暑いけど、暖かく見守ってやろうじゃないか。
綺麗なプログラムって話で、 ちゃんとしたクラス志向のオブジェクト言語の話なら解らんでもないが VBAでの綺麗なコードって話で何言ってんのって感じだな
やっぱりな。他のオブジェクト指向の言語とかやった事無い奴は 設計が既に疎かになっているから次に進めないしここを突つくと顔真っ赤にして反論する。 テキトーに考えてテキトーに組んで、いい感じでスパゲッティーにするんだろうな。 まぁ、ここで色々反論してくる奴は、そんな基本的な事も分かっていない様だから、 オブジェクト指向の言語や関数型言語なんてまともに使えないまま一生を終えるんだろうな。
>>123 井の中の蛙乙
これは一般的に言われている事だ
使い分けって大事だよな。Cでもオブジェクト指向っぽく出来るけど、わざわざやらないだろ。そういうライブラリ使う場合は別として。 VBA向けのクラスライブラリでも作るっていうのなら、気にする必要があるのかもしれないが、少なくともVBAの世界では一般的じゃないな。
だから今話してるのはだな 部屋を片付ける=部屋を綺麗にする だよね 例えばおもちゃを片付けるのをおもちゃ箱にしまうのか部屋の見えない所に隠してしまうのかの話で どちらも部屋を綺麗にすることに変わりないがおもちゃ箱にしまったほうがまた遊ぶときすぐ遊べるってことだろ そこに部屋を片付けるプランから考えるとかはまた別問題なわけで。 プログラミングにそれが大事なのは当たり前のようにわかってるよ。 ただ今はそんな話してないってだけじゃないのか?
133 :
デフォルトの名無しさん :2011/08/11(木) 13:39:10.98
マクロでシートを保存するとブックの名前も変わってしまうのですが、 マクロ実行中に保存以外の方法で元の名前に戻すことはできますか?
その保存するブックをどうやって開いているのかと ブックを保存するマクロをどう書いてるのかを示して
>>131 > VBA向けのクラスライブラリでも作るっていうのなら、気にする必要があるのかもしれないが、
> 少なくともVBAの世界では一般的じゃないな。
継承とコンストラクタにパラメータが渡せないのがきついからなぁ。
この二つがサポートされてりゃまだそれなりの暮らすライブラリがかけると思うんだが...。
136 :
デフォルトの名無しさん :2011/08/11(木) 14:15:22.77
ブックの開き方というのがわかりませんが、マクロが有るブックでシートを保存しています 別のブックからデータを読み込んだりしますが、その時はファイル名は変わりません ThisWorkbook.SaveAs Filename:=ThisWorkbook.Path & "\" & tooshibango & ".txt", FileFormat:=xlText
>>131 VBA+クラスで検索
約 2,000,000 件 (0.17 秒)
VBA+classで検索
約 493,000,000 件 (0.20 秒)
まぁこれを見て、一般的でないと見るかどうかだけどな。
>>137 絶対的な指標になり得ないものを上げて判断を仰ぐのはペテンくさい。
ちゃんと他と比べないといけないよね。
C++ クラス
約 59,200,000 件 (0.18 秒)
VBA クラス ライブラリ
約 64,700 件 (0.19 秒)
C++ クラス ライブラリ
約 500,000 件 (0.06 秒)
あと、分かっててやってるんだろうけど、
検索使うときは対象絞るようにしないと、VBAのままだとVBにもヒットするよ。
VBでの話がしたい?なら該当スレへどうぞ。
そもそも何でそれを検索したんだ?クラス=オブジェクト指向なのか?本当に?
>>136 SaveAsは名前を付けて保存だから、名前変わるのは当然だな
ブック名をどう使いたいか解らんが、名前をもとに戻す方法考えるより
保存するシートをマクロと別ブックにする方がいいんじゃね
>>138 >検索使うときは対象絞るようにしないと、VBAのままだとVBにもヒットするよ。
はあ?
>>138 お前こそ何がしたいんだよ。
「VBAでクラスライブラリを構築する」なんて概念こそがほぼ無いことだろ。
なんでわざわざ「ライブラリ」を付けて検索するんだよ。
VBAで.NETのクラスライブラリを使うことができることを考慮して検索すると、
vba "クラスライブラリ" -.NET
約 18,700 件 (0.34 秒)
しかも、1ページ目のほとんどが他言語のクラスライブラリの話だ。
> そもそも何でそれを検索したんだ?クラス=オブジェクト指向なのか?本当に?
この流れでそれがわからないとか、馬鹿なの?
>>141 VBAでクラスを使うことが異端であると言いたいんだと思うよ。
きっとクラスを使ったことないんだよ。
便利な場面で使えばいいだけのことなのにね。
使ったことないから、いつ便利なのかわかんないんだろうけど。
エクセルVBAでクラス設計とかアホだろ そもそもクラスはエクセルのセル、というかエクセルのブックがクラスなんだから、 それを最大限に生かせばいいだけの話。 エクセルのセル内容をほとんど使わないアプリとかは知らん。 クラス=オブジェクト指向 よりも、 エクセル=オブジェクト指向 という結びつきのほうが強い バグは置いておいてくれ。これを言い出すとキリがないからな なんにしろ普通は データベース、特にアクセス(更に言えば普通は専用システム)でvbaを使い、データ整理 エクセルでデータを引っ張り出し、vbaでレイアウトの整理、出力 が基本
お前の中ではそれが基本なんだな
>>142 わざわざC++と比べてるんだから、異端か異端でないかじゃなくて、
他の言語と比べて一般的かってことだろ。
大体検索結果なんてものによって分母も違ってなんの参考にもならんのに、
ドヤ顔で結果を貼り付けるて、挙句意図も説明しないから、
結局訳が分からなくなる。
意見があるなら、それをまずちゃんと日本語で書くべき。
どうでもいいが、設計論やりたいならスレ立てるかなんかで余所でやってくれ
ここ最近の流れって、ちょっと真面目に読むと笑えてくる。皆それぞれ独自の認識してるんだ。 VBAのクラスはただの構造体+メソッドだろ。多態もできないと言い切れるレベルなのに、オブジェクト指向って・・・()笑 あっ、もちろんこれは俺の中ではこうだって話だから、皆さんはそれぞれ自分の中のVBA像を語ってください><
>>147 こんなこと結構するけど。
Class1.cls:
Private WithEvents m_sheet As Worksheet
Public Sub SetWorkSheet(ByRef aSheet As Worksheet)
Set m_sheet = aSheet
End Sub
Private Sub m_sheet_Change(ByVal Target As Range)
MsgBox m_sheet.Name & "!" & Target.Address & " was changed"
End Sub
ThisWorkbook:
Private m_sheets As New Collection
Private Sub Workbook_Open()
Dim obj As Class1
Dim aSheet As Worksheet
For Each aSheet In Worksheets
Set obj = New Class1
obj.SetWorkSheet aSheet
m_sheets.Add obj
Next
End Sub
RSSで読み込んでいるデータと固定値を比べて同じならBEEPを鳴らすようにしているのですが、 以下のソースで (1)はなんら問題なく動作しますが、(2)はExcelファイル起動にRSSからの更新データ読み込み更新の有無のダイアログ表示後「更新する」ボタンをクリックして継続すると 実行時エラー13:型が一致しません と出て処理がとります。 VBAから再度実行すると普通に動きます。 考えたのですが問題点がよくわかりません。 (1) For Each myRange In Range("d12:d21") If myRange.Value = Range("b2") Then Beep End If Next (2) For Each myRange In Range("b2:b11") If myRange.Value = Range("h23").Value Then Beep End If Next myRange 対象となるセルはすべて、数値としてあります。 セルh23に固定値が入っています。
C++で言うと、それtemplate使えば簡単に書けるよとか、boost使えば簡単だよとか言うと いきなりファビョりだす奴と行動が似てる
>>148-149 がんばってるなぁ、でも馬鹿みたいとしか思えない。
ボケ防止に趣味でやってるなら止めはしないけど。
セルがすごい複雑で優秀なクラス構造をしてるから、それを利用するという意見は少数なのか もったいないなぁ
逃げることしかできないへたれ
>>152 同じ構造のシートで数十シート(可変)以上あるようなBookを読み込んで、
それぞれのシートに同じ処理を適用するような場合を思いつかない?
まあ、後は普通にクラスで実装した方が楽な場合は使うよ。
クラスなしにVBA用のxUnit実装してとか言われたら発狂もの。
>>154 なるほど!
>>154 さんは中卒なのですね(泣)
月収は16万ぐらいなのでしょう・・・
お互い大変ですけれども、頑張りましょう!
私も25万しかもらっていません(泣)
今年はボーナス無しです・・・
こいつ、ExcelでJavascriptが使えるようになったとしても、絶対に使わんだろうな あ、Javascriptでオブジェクト指向なんて、とか言い出すかw
>>155 >それぞれのシートに同じ処理を適用するような場合を思いつかない?
そんなもん別に VBA でクラスなんぞ作らんでも作れるだろ?
まあ、がんばってクラス作ってくれてもいいんだけどね。
Excel 自体はそりなりにクラス構造が作られてるから普通に利用すりゃいいだけで、
VBA でクラス作らないといけないわけじゃない。
なので、
>>153 とか何言ってるのか意味わからん。
ちなみにそれなりの機能を持つアプリで入出力が Excel の場合、最近は
>>154 が
言うように C# で Excel 呼び出す方向に「逃げる」ようにしている。
でも、 Javascript だと、ちょっと嫌かも (w
159 :
150 :2011/08/11(木) 18:30:23.35
自己解決しました。 ファイルを開いた瞬間は各セルの値は #N/A でアサインされていないので、アサインされてから比較するようにしたらうまくいきました。 お騒がせしました。
160 :
デフォルトの名無しさん :2011/08/11(木) 18:41:45.57
A1の値を別ブックのシート1にコピー A2の値を別ブックのシート2にコピー・・・・・・ このようなマクロを作りたいのですが Worksheet(変数).Selectのところでうまくいきません
うまいこといかないじゃなくてエラーメッセージとその付近のコードを晒せ
ユーザーフォーム上のコントロールの状態を記憶させておく簡単な方法ってない? 終了時にファイルに適当に記録するにしても、一発でチェックボックスの 状態の読み書きが出来るとかそんなのない?
163 :
デフォルトの名無しさん :2011/08/11(木) 20:14:41.08
>>161 こんな感じです。コピーまでは動くのですが
Dim P As Integer
For P = 1 To 100
Workbooks("XXX.xls").Activate
Range(Cells(1, P), Cells(500, P)).Copy
Workbooks("YYY.xls").Activate
Worksheets(P).Range("D1").Select
Selection.PasteSpecial Paste:=xlValues
Next P
RangeクラスのSelectメソッドが失敗しました
164 :
デフォルトの名無しさん :2011/08/11(木) 20:25:11.71
workbooks(x) で、xをsheetsのimdexのように使う用法ってまさかないんですか? あるはずだよね? どうやるの? 万一ないなら、代替えとしてどうやってbookを操作するの?
>>163 もしかして
"YYY.xls"へ 非表示のワークシートがあったりしない?
非表示のワークシートもにもインデックス番号がついてるから
それをSelect すると"RangeクラスのSelectメソッドが失敗しました" になるけど
>>163 Worksheets(P).Select
Range("D1").Select
167 :
デフォルトの名無しさん :2011/08/11(木) 22:53:34.64
>>166 できました。ありがとうございます。
どこかのサイトにSelectはあまり使わないほうが良いと書いてあったのですが
繋げるのとSelectで分けるのとどう違うのでしょうか
>>167 Worksheets(P).Range("D1").Select
このコードはあくまで セルをSelect しようとしてるんであって
Worksheets(P)を Selectしている訳ではありません
Selectされていないシートの セルをSelectしようとしているので
エラーになる(ううむ ややこしい)
169 :
デフォルトの名無しさん :2011/08/12(金) 00:18:08.40
Worksheets(index)ってできないの?
なぜできないと思ったのかその根拠を示せ
171 :
デフォルトの名無しさん :2011/08/12(金) 00:41:31.34
まず、できないと思ってると考えた根拠を示すのが先だろ。 そもそも質問してるだけだ。
エクセルVBAでクラス設計とかアホだろとか言ってる奴は EXCELが全てクラスで構成されている事なんか知らないんだろうな。 標準モジュールですらスタティックエリアに展開される静的なシングルトンのクラスだと言うのに。 それらの使い方や作り方をおざなりにすると言うことはアジャイル開発なんて全く念頭にないな。 そんな奴が作ったプログラムの改修作業に入る人は悲惨だな。
こらそこ難しい単語使わない
難しい単語なんて出てきたか?
>>172 半分くらいは言ってること正しいんだが、"クラス"の捉え方次第では的外れな主張になる
君が言ってるのは、プログラム言語一般でのクラス、でもここはVBAスレなので
VBAのクラスとして捉えると、標準モジュールどころかシートモジュールさえもクラスでは無いと定義される
特定言語でのコミュニティー(掲示板や開発チームなど)に入ったときに、その言語特有の概念や定義を理解せず
プログラム言語一般論で語り出しちゃう奴は何処に行っても疎まれ、チームでは役に立たず掲示板ではウザがられるだけ
そんな奴と一緒にチーム開発させられる人が居るとすれば悲惨だな
いいから設計論は余所でやれ
>>174 悪いがそんな受け捉え方なんてもので実際の本質が変わる様なあやふやなものでは無い。
持論を持ち出すのは結構だが、実際にそいつらの本質がクラスであるのは変わり様のない事実。
そして開発チームどうのと言う以前の問題。使われているのはそう言った性質を持ったアプリケーションなんだからな。
そう言ったウチの開発チームでは、とか、俺的には、とかそう言う細かい本質から離れたプライオリティの低い話を
あたかも本質として扱おうと言うのは「既に私の話は破綻していますよ」と言っている様なものだ。
そして、そう言った知識レベルの低いチームが一般的で無い組み方をしたプログラムを後に他のチームが改修に入り、
その時にはどう言う意図でそう組んだのか誰も分からなくなるなんてざらにある事。
要するに一般的な事の前に持論が来ちゃってるんだよな。
三流の下っ端プログラマとして終わりたく無ければもっと外にも目を向けるべきだな。
そもそも VBA って三流の下っ端プログラマ (=素人、MS 的にはエンドユーザ) 向けだと思うが。
ホントたのむからスレタイ読んで芯でくれ
>>176 お前らが三流なのはよく解った
プログラマ板にでも行け
>>158 > そんなもん別に VBA でクラスなんぞ作らんでも作れるだろ?
じゃ、クラス使わずに
>>148 と同等の処理ができるコード示して。
> まあ、がんばってクラス作ってくれてもいいんだけどね。
がんばって、というのがよくわからないんだけど。
>>148 のどこががんばってる?
> ちなみにそれなりの機能を持つアプリで入出力が Excel の場合、最近は
>>154 が
> 言うように C# で Excel 呼び出す方向に「逃げる」ようにしている。
永続化の手段としてExcel Bookを使う場合の話?
俺が話してるのは、UIの手段としてExcel Bookを使う場合なんだが。
ユーザーフォームを一旦HideにしてからShowにする時に、 Hide時の位置に表示させたいのですがどうしたらいいですか
182 :
デフォルトの名無しさん :2011/08/12(金) 09:50:03.14
>>180 >じゃ、クラス使わずに
>>148 と同等の処理ができるコード示して。
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
MsgBox Sh.Name & "!" & Target.Address & " was changed"
End Sub
>
>>148 のどこががんばってる?
がんばってると言うか、はっきり言えばアホみたい。
>俺が話してるのは、UIの手段としてExcel Bookを使う場合なんだが。
C# からでも Excel の UI 制御できるよ。
君にできるかどうかは知らんけど。
何度言ったらわかる消えろ
>>183 うーん、そのコードを同等と言うならしょうがないね。もういいよ。
> C# からでも Excel の UI 制御できるよ。
UIを制御するんじゃなくて、UIとしてExcel Bookを使う場合なんだけど。
まあ「がんばって」C#でExcelのUI制御でもしてれば。
基本機能としてクラスモジュールが使えて、クラスを使うと便利な場面があるのに、 頑なに使おうとしないんだからもう平行線だね。 どこぞのstatic親父と似た匂いがする。
>>181 Me.Top と Me.Left の値をどこかに保存しておいて
Showする時に戻すとか ちなみにその時に
Me.StartUpPosition = 0
じゃないと位置変更されないと思う
こういう時のためにすいとんがあるんじゃないか 誰かやれよ
>>187 > Me.StartUpPosition = 0
> じゃないと位置変更されないと思う
これでした。
ありがとうございました。
Windows8ではExsel VBAどうなるの?どうせ変態仕様で継続されるんだろうと予測
vbaで外部ソフトを操作するプログラムを作ってて、ほぼ出来上がってるんだけど ある1つのボタンだけvbaからのクリック動作を3回に1回くらいしか受け付けてくれません。 ググって見たら WM_COMMAND を使うようなページが幾つか見つかったんですが動作しません。 Call SendMessage(hnd_A_Button, WM_LBUTTONDOWN, 0, ByVal 0) Call SendMessage(hnd_A_Button, WM_LBUTTONUP, 0, ByVal 0) こんな感じでボタンをクリックしていたのですが、1つのボタンだけ素直に受けつてくれません。 ググッたページを見て Call SendMessage(hnd_OYA_Window, WM_COMMAND, BN_CLICKED * &H10000 + GetDlgCtrlID(hnd_A_Button), ByVal hnd_A_Button) こんな風にしたのですが反応しません。 ハンドルはスパイソフトで確認して間違えないのは確認しています。 何が間違えているのでしょうか? よろしくお願いします。
>>185 >うーん、そのコードを同等と言うならしょうがないね。もういいよ。
え゛っ、どこか違うか?
違うなら、違いを示してくれよ。
>UIを制御するんじゃなくて、UIとしてExcel Bookを使う場合なんだけど。
プロパティもイベントも普通に使えるから UI として Excel 使う上で何の
問題もないわけだが。
まあ別に君に使えと言うわけじゃないから安心しなよ。
>>186 「クラスを使うと便利な場面がある」なら使えばいいと思うよ。
でも少なくとも、自信満々で出してきた
>>148 なんて、わざわざクラス
使って20行近く書くよりより3行書く方が楽だと思わないか?
思わないとしたら、平行線でもしょうがないと思うけどね。
>>190 Visual Bacik for Apprikation になると思われ。
え?
>>176 みたいに恥ずかしい奴って、昔から見かけるよね
もしかして同一人物がずっと粘着してるのかな?
恥ずかしいってか、バカ相手にムキになり過ぎ。ほっときゃいいのに。
お前ら、質問に答えろや お願いします。
水戸市民の俺参上
>>197 バカは言い過ぎ
新しいことが受け付けられない
お年寄りになっただけ
>>198 質問者の態度でかいしお礼も言えない子が多いからね
>>201 まぁこういうゴミクズに礼を言う必要はないからなw
いいからさっさと答えろグズ
>>200 >新しいことが受け付けられない
>お年寄りになっただけ
進歩の止まった VBA ってお年より向け言語だろ?
ひょっとして、VBA のクラス使いこなしてる俺すげーと思ってる
>>148 さんですか?
>>202 生きるうえで礼儀大切だよ粗末にしてると本物のゴミクズになっちゃうよ
そういえばうちのおじいちゃんも 切符の券売機でよくまごついてるなあ
>>208 窓口に行って駅員に売って貰えばいいだろ
>>208-209 おまいらナイス!
実に素晴らしい例え方だわw
券売機(クラス)が使える普通の人は券売機でさっさと買って行ってしまえばいいし、
使えないおじいちゃんは窓口で買えばいいわな。
>>206 クラス使えるとスゲーなんて発想になるのは君だけじゃない?
ここにいるほとんどの人は、使えるけど状況に応じてあえて使わないだけだと思うよ。
自分専用ツールぐらいしかVBA使わないわー 券売機クラスってwwwせめて関数程度だろwww
券売機クラスってどういう構造で表現するのがいいんだ? ↑の例えでいくと人か機械かどっちかのインターフェースがあって、その下に発券のシステムがあるイメージ? でも発券のシステムって、入力と出力が一対一だろ、ファイルに全対応を書き出しておいて検索しても十分だ。 特に好んでクラス使う例にはなりそうに無いな。
俺がVBAでクラスを使って良かったと思えたのは、シューティングゲーム作った時かな。 不特定多数の敵や弾を、その種類毎にクラス作っておいて、 発生する時にインスタンスをぽこぽこ作って、コンストラクタで最初の位置を設定して、 後はコレクションに格納して、インターフェース使ってポリモーフィズムでそれぞれの敵や弾毎に別れた処理をぐるぐる回す。 らくちんw
>>210 >券売機(クラス)が使える普通の人は券売機でさっさと買って行ってしまえばいいし、
こんなぼろい券売機もどきでなに言ってるんだ?
>>211 日本語ぐらいちゃんと読めよ...。
>>214 >コンストラクタで最初の位置を設定して、
引数ももてないコンストラクタでどうやって設定したのか kwsk
>>215 御老体向けの券売機もどきも使いこなせない人っていったい・・・
ごめん、「御老体向けの券売機もどき」で満足してる人だったんだね。
>>219 満足とか意味不明。
無い機能は使えないし
ある機能は使えば便利な時に使うだけ。
君、自己満足の為にVBAでプログラミングしてるんだ。いい身分だねw
>>220 >無い機能は使えないし
>ある機能は使えば便利な時に使うだけ。
それを「「御老体向けの券売機もどき」で満足してる」って言うんだけど...、
日本語不自由な人なのか?
俺は、機能がなくて不満なときは C# に逃げるけどね。
>>221 あれぇ?
VS2010はプロフェッショナル以上のエディションなら直接EXCEL2010を.Net環境から開発出来るよねぇ。
古いのでやってるの?それともお金が無いの?
で、C#に逃げるって、それもクラス設計しないで作ってるの?
クラス図から直接コードに落とす機能も有ったりするのに?
それともやっぱりお金が無くて.NetFreamWorkだけ突っ込んでテキストファイルで一生懸命書いてコンパイルしてたりするの?w
ひょっとして、テスト環境とか作ったりリファクタリングする機能があるのも知らないんじゃないの?
俺はC#もVB.Netもやってるけど、スレ違いになるからわざわざ言わなかったのに。
そんなスレ違いの方向に持って行って何がしたいの?
攻撃方法変えて金持ってる事を自慢し始めちゃったよこの人
自分が満足どうのとC#の話振っといて、 突かれたらお金の自慢されたとかw どうなの?古い環境や低いエディションで満足出来てるの?w
早く夏休み終わらないかなぁ
227 :
デフォルトの名無しさん :2011/08/13(土) 20:11:25.26
>>226 What's the difference?
Every single annoying person is a NEET.
両者引っ込みつかなくなってアホ丸出しなどーでもいい議論ははよ終わらせてくれや
229 :
222 :2011/08/13(土) 21:29:01.63
済まん。本当は
>>214 と
>>216 とのやり取りで、
>>216 が少なくともObject指向のこと少しでも分かってたら
そんな質問は出て来ないだろうと言うことで、ろくすっぽ知らない事は分かってたんだ。
>>215 と
>>216 はそのレスのタイムスタンプから同一人物である可能性が極めて高いと判断した。
そして
>>221 でC#に逃げるとか言ってたから、ちょっと意地悪してみたくなったんだ。
ちょっと大人気なかったな。そこは素直に謝らせて貰う。済まんかった。
>>222 一応 Professional は買ってもらってるけど、仲間内で使うちょっとしたツール作るだけに、Ultimate
(定価 160万) は、買えないよ。Office アプリは本職じゃないしね。
>そんなスレ違いの方向に持って行って何がしたいの?
いや今頃言われても...。
>>158 で2日も前に書いてるし、
>>180 〜 あたりの話は理解できなかったのかなぁ。
>>229 で、いつから VBA のコンストラクタにパラメータが指定できるようになったの?
232 :
222 :2011/08/13(土) 22:30:34.31
>>230 そこで会話を交わしているのは俺じゃないし、実は
>>214 も俺じゃない。
ま、信じるかどうかはそちらに任せるけど、
今そっちのレスを読み返してみたけど、どっちも本当は互いの言いたい事分かっててあえて意固地になって
戦ってる様にしか見えないぞ。
後、余計なお世話かもしれないが金が無いならWindoswPhoneの環境を見ると、あれはまだBetaだがまだ日本語の本も出てないくらい本気で最新だ。
開発環境も無料だしな。データベースとのやり取りを行う時SQLを使う事もないし、
基本UIの項目から直接値を取る様な事もしない。
構造化言語からObject指向言語に移行した時に味わった苦しみを次はObject指向を開発している人達が近々味わうだろうと
思わせる一品だ。
スレチだからこの辺にしとくわ。じゃあな。
233 :
222 :2011/08/13(土) 22:35:09.07
>>231 その関数自体の引数で渡せないなら他にどんな渡し方がある?
流石にここまで言えば分かってくれるよな?
>>232 > データベースとのやり取りを行う時SQLを使う事もないし、
笑うところ?
まさか、Uiltimate で C# とか VB.net 使ってて、Linq 知らないなんてことはないよねぇ?
>>233 はぁ、関数? なにそれ。
まじで、さっぱりわからんから詳しく教えてくれ。
>>234 なんだ、LINQを知っているのに
>>233 みたいなのは知らんのか。
覚える順序が滅茶苦茶だな。なんか胡散臭いなあ。
LINQを使うと言う事は既にObject指向の範疇から外れているものなのは知っているよな。
で、LINQを使うと言う事は他にも色々知っていなければ出来ない訳だが、それらの内Object指向の範疇で無いものに
どんなものが有るのか、どんな働きをするものなのか教えてくれよ。
後、そこまで豪語するなら「基本UIの範疇から直接値を使う事もしない」って言うのも当然知っている訳で、
本当は
>>233 見たいなのも知ってて言ってるんだよなぁ先生。じゃなきゃそこまで豪語出来ないもんなぁ。
おっと、スレチ過ぎだな。じゃあC#板で待ってるからとっとと来て説明してくれよ。
板じゃないな。失礼。スレだ。
C#,.NETできますアピールもういいから
>>239 豪語?
「MS」「SQL 使わない」「 C#/VB.net」とキーワードがあれば、"Linq" ぐらいは
知識としてあるだろ。
Windows Phone でも C# で Linq 使えるのは当たり前で、わざわざ言うほどの
ことじゃないはずだから指摘しただけ。
俺は SQL 書けるから、Linq なんて使ったことないし興味もない。
> もうこれ以上このスレに迷惑掛ける訳にもいかないのも分かるよな?
>>216 は、VBA の話なのでここで答えてくれていいよ。
>>240 君、面白い事いうね。
>「MS」「SQL 使わない」「 C#/VB.net」とキーワードがあれば、"Linq" ぐらいは
>知識としてあるだろ。
平たく言うと、そのキーワードで今ググったって事だよね?
そう言うのは知識とは言わないよね。
で何、
>笑うところ?
>まさか、Uiltimate で C# とか VB.net 使ってて、Linq 知らないなんてことはないよねぇ?
何でLINQとエディションが関係有るのか説明して欲しいな。それと
Uiltimate?何でUiltimateだと思ったのかな?
>一応 Professional は買ってもらってるけど、仲間内で使うちょっとしたツール作るだけに、Ultimate
>(定価 160万) は、買えないよ。Office アプリは本職じゃないしね。
本当にProfessionalを持っているなら
>>222 で挙げた機能は、実は全て入ってる事知ってる筈だけど。おかしいねぇ。
MSDNのページででも調べちゃったのかな?
君はハッタリ君な上に嘘付きなのかな?
これらの事から言える結論は、君はC#やった事が有るとは到底俺には思え無いんだけど。
やっぱりちょっとC#のスレ来てちょこっとC#やってたってのを証明出来る様なコード書いて俺を納得させてくれよ。
逃げ回ってばかりでこのスレに迷惑掛け続ける訳にもいかないだろ?
お前らスレ違いだから下らん論争は他でやれ ここは質問スレだ
>>242 外でやると言ってる訳だが、ハッタリ君が逃げ回って拒絶しているんだニンニン
>>243 だったら放置しろ屑
弱いもの虐めすんなって小学校で教わらなかったのか
いいだろう。今日は命名負け犬ハッタリ君の目出度い日だからこの辺にしておこう。
>>241 > 本当にProfessionalを持っているなら
>>222 で挙げた機能は、実は全て入ってる事知ってる筈だけど。
本当におかしいねぇ、俺が使ってる Pro. には、「クラス図から直接コードに落とす機能」なんてないんだけど。
君の Ultimate にはあるんでしょ? Ultimate しかないしねぇ、その機能。
>>244 ごめん、ハッタリ君な上に嘘付きで MSDN のページも調べられない情弱を虐めてしまった。
>>222 で、あまりにもアホなこと書いてるから、ついつい遊んでしまった。(w
>>234 の Ultimate にも、食いついてくれるし、言うことのないアホっぷりだったから、
さすがにもう出てこれない思うけどね。
# よくよく見たら、Ultimate の綴りが所々間違ってるな...。
おまいら水遁と土遁の刑な
ハッタリ君は茶かして逃走。 以後、ずっと負け犬ハッタリ君のレッテルは貼られ続けられるなw
忍者ハッタリくん
>>249 あれ?
>>246 にはレスしないの?
まあさすがにできないよな、Visual Studio の比較ページ見たらすぐわかることだし。
> 以後、ずっと負け犬ハッタリ君のレッテルは貼られ続けられるなw
自己紹介乙。
あっ、情弱ハッタリ君のほうがいいんじゃないかな (pgr
粘着質きも
早く夏休みなんて終わってしまえ
オフでもネットでもキモがられて生きてて楽しいのだろうか
ニンニン
XMLを使ってwebページを直接ダウンロードすることってできますか?
正確にはファイルに保存するところまでしたいです
XMLを使うってのはどういう意味?
ページの情報を読み込んでそれを保存するってことです
>>255 まだやってたのか
お前のせいで
自殺者が出るんじゃないか?
今となっては
>>251 が痛々しいな
>>255 すごいな、この人。
> テキストファイルで一生懸命書いてコンパイルしてたりするの?
なんて豪語しながら、いまさらクラスダイアグラムを出してきたよ。
クラスダイアログラムだと、ロジック部はどうしてるのかなぁ?
当然テキストで一生懸命書いてないんだよね。まあ、書くほどのロジックがないのかな (w
# クラスダイアグラムは使ってるバージョン管理システムと相性悪いからマジで忘れてたわ。
# コード生成といってもクラス定義だけだから、たいして効率あがらないし。
# そもそもいまさら UML 以外でクラス図ってどうよ。
>>263 お前もうやめといたら?
見苦しいしただの恥の上塗りだよ。
>>264 だね。オブジェクト指向言語はクラスの設計がキモで、基本となる所の
ひとつひとつのメソッドのロジックはそんなに長くなるもんじゃないし、
長く作る人はへたっぴだってJavaやってる先輩に聞いた事がある。
このスレって、なんで俺より上位の奴が居ないの? 世間から見たら、俺なんか中の下か下の上くらいなのに ここにはその下しか居ない
>>265 ネタむこうで振ったら向こうの人が先に答えたりするし、
ネタ振ってもまたググって適当に答えられてのらりくらりと逃げられても意味ないでしょ?
だから前から言ってる
>>241 の通りでいいよハッタリ君。
どんどんボロが出て来るし、スレ違いでみんなに迷惑掛けるし、引き際も知らないし、本当に見苦しいねw
>>267 うわぁ・・・
ハッタリもここまで来るとネタでもキモいね
頭悪くてごめん、
>>263 の言い方だと、
上のバージョンだとクラス図の中にロジック部分のコードが書けたりするのか?
前からクラス図からコードが落とせるかってことが論点だったと思ってたから、
違ってるなら何で今頃と思ったんだが・・・
横槍ごめんな
>>266 はいはい、短いからどうしたの?
書かないといけないのは変わらないだろ。
はぐらかしたい気持ちはわかるけど、それこそ「見苦しいしただの恥の上塗りだよ。」 (w
>>268 >ネタむこうで振ったら向こうの人が先に答えたりするし、
>ネタ振ってもまたググって適当に答えられてのらりくらりと逃げられても意味ないでしょ?
結局どうしろと?
>だから前から言ってる
>>241 の通りでいいよハッタリ君。
>> 証明出来る様なコード書いて俺を納得させてくれよ。
書いても、ググったって言って、納得しないだろ?
そもそも C# の話なんてこのスレではどうでもいいから、
>>216 に答えてよ。
それとも、まだ逃げ回るの?
>>270 申し訳ない、俺も Ultimate は触ったことないので、実際のところはよくわからない。
ただ、今評価している IBM Rational Rhapsody なんかだと、クラス図 / 状態遷移図 から、
その状態遷移を実現するコードを自動生成できるし、そのコードがシーケンス図通り動くか
を検証できたりするので、Visual Studio でもそれに近いことはできるとのではないかと思う。
ソフトの種別によるけど、うちの会社がやっているような用途だと、ロジックの多くを状態遷
移図で表現できるので、それなりの効果が見込めると踏んでいる。
なお、細かいコードは、その状態遷移図の中に人手でのコーディングが必要。
>>272 C#の話は元々、君がVBAから逃げる時に使うと言う話から起因しているからね。
いつもやってる通り普通に書いて
納得させてくれればいいんじゃないか?
>>272 >書いても、ググったって言って、納得しないだろ?
それは前科が有るから仕方ないよね。
奴はUltimateじゃなくてUiltimateなら持ってるかもしれんぞ 自慢げに連呼してたからなw
276 :
デフォルトの名無しさん :2011/08/15(月) 00:17:19.23
>>274 >いつもやってる通り普通に書いて
>納得させてくれればいいんじゃないか?
>>書いても、ググったって言って、納得しないだろ?
>それは前科が有るから仕方ないよね。
前科? はぁ、どこのことを言ってるのかレス番具体的に示してくれ。
あと、なんで C# の話はぐだぐだ書くのに、VBA の話である
>>216 は無視するの?
>>275 >>247 に間違えたって書いてるんだから、許してくれよ。
>>240-241 >>「MS」「SQL 使わない」「 C#/VB.net」とキーワードがあれば、"Linq" ぐらいは
>>知識としてあるだろ。
>平たく言うと、そのキーワードで今ググったって事だよね?
>そう言うのは知識とは言わないよね。
そう、知りもしないのにあんな豪語垂れてた訳だから、
ちゃんとC#で作ってるって証明してくれないとそれ以上の話はする気がしないと
前にも書いただろ?
記憶力無いの?
>>278 >そう、知りもしないのにあんな豪語垂れてた訳だから、
C# で DB 使う奴なら、Linq の概要ぐらいいちいちググらなくても知ってると思ってたけど、
キーワードって書くと Google しか思いつかない奴もいることを学んだよ。(w
# て言うか、こんなことで人を前科者呼ばわりか。相変わらずすげー奴だな。
>ちゃんとC#で作ってるって証明してくれないとそれ以上の話はする気がしないと
だから、そんなお前に証明しようがないだろ?
できないこと言い続けて、
>>216 をごまかす気なの?
280 :
デフォルトの名無しさん :2011/08/15(月) 01:04:05.56
しかしIDなしコテなしでよくバトル出来るよな、こいつら 馬鹿が二匹しかいないからこそ、齟齬なく相互認識できるんだろうけど
この煽り口調の馬鹿なんとかならないのか はぁ・・未成年はネット禁止にするべきだって気持ち分かるわ・・
>>279 >>232 の前に事前にそのキーワードを出してましたってかwエスパーかよw
ほんっと見苦しいよな。
VBAで出来ない事が有ったらC#に逃げてたんだろ?
だったらその様に普通に書いて証明すればいいって何度も言わせるなよ。ボケ老人かよ。
それで証明出来れば
>>216 の話をしようって言ってるだろ?君が逃げなければ話は進行するんだよ。
>>282 >だったらその様に普通に書いて証明すればいいって何度も言わせるなよ。
書いたらぐぐったというだけだろ?
それこそ何回も言わせるな。
>それで証明出来れば
>>216 の話をしようって言ってるだろ?
もういいよ、証明できないことを要求して、逃げるんだろ。
まあ、VBA のコンストラクタ (Class_Initialize) にパラメータを持てないことも知らずに、
VBA のクラス使いこなしてるなんて恥ずかしくて答えられないわな。
でもさ、VBAやAPI呼び出しで できなくてC#でできることって どんなことがあるんだろ
>>283 何だ、結局逃げたな
さすがハッタリ君だ
>>284 VBAからも.NET FrameWorkの機能呼び出せるしな
>>284 クラスに関して言えば、
>>135 にも書いたけど、VBA のクラスは...
> 継承とコンストラクタにパラメータが渡せないのがきついからなぁ。
と思う。
言語仕様的には、Generic / 例外 とかかな。
>>285 はいはい、
>>214 のハッタリにはかなわないけどね。(pgr
>>265 msxmlのことでした
そのページのはソースを変数に格納してるんだけどそうじゃなくて
もうmsxmlじゃなくてもいいので
webページ丸ごとダウンロードして同じ階層ににあるhtってフォルダの中に保存したいです
拡張子はなんでも
半端にプライドの高い馬鹿が延々と場違いな争いを繰り広げる夏休み
>>216 本当にそんな大したことやってるわけじゃないんだけど、
来てみたら何でこんなに話が大きくなってるんだ?
俺、そんな変なこと書いたかな・・・。
>>233 の人の
「その関数自体の引数で渡せないなら他にどんな渡し方がある?」
って言うフレーズから、この人との認識とは一致してるっぽいけど
ごめん、ヘタレだから怖くて答えられないやw
>>233 の人には答えてもらって、俺の作りが変じゃないっていって欲しいけどね。
293 :
デフォルトの名無しさん :2011/08/15(月) 09:28:11.88
GREEのコミュニティのトピックに自動書き込みできるVBAを組んでるんだけど、さっぱり分からん <textarea name="thread_msg" rows="5" style="width:98%" cols="5000"></textarea> ってのがフォーム部分のソースで objIE.Document.all("thread_msg").Value = "入力するコメント" って記述したら始めの2,3回はちゃんと動いたんだけど その後に送信ボタンを押す記述を加えたらエラーで動かなくなって 追加した送信ボタンを押す記述を削除してもエラーで動かなくなっちまった。 そもそも記述が間違ってる?
ステップインで一行一行実行するとSendMessageが送れるのに 普通に実行すると送れないってどういう事?
295 :
デフォルトの名無しさん :2011/08/15(月) 09:52:20.75
いや、始めからツールバーにある再生ボタンを押して実行してたんだ。 始めはちゃんとフォームに文字がセットされたのに、今は何故かエラーで動かず。
296 :
デフォルトの名無しさん :2011/08/15(月) 09:58:06.35
パソコン再起動したら再度エラーなしで動き出した なんなんだ
297 :
デフォルトの名無しさん :2011/08/15(月) 10:31:00.12
連投ごめん なんかIEを再起動したらエラーが解決する事が分かったわ 起動済みIEを発見する記述に問題があったっぽい スレ汚してすいませんでした
>>292 大したことやってないし、認識も一致してるっぽいのに
具 体 的 に は な に も 書 か な い
もういいよ。
クラス必要無いって人がいるみたいだけど、カプセル化とか、オブジェクト自身がデータとメソッドを持ってるとか、 多態性(もどき)が使えることとかをメリットとしては見てないの?
俺は必要ないとは思わないけど、そのメリットを認識していても そのメリットを必要としていなければ、クラスも必要ないって話になるのでは?
>>300 >クラス必要無いって人がいるみたいだけど、
そんなやついたっけ?
>>302 ん、いないの?
詳しく読むのだるいので、ざっと読んで「クラスいらん」って人がいたと思ったので。
>>301 > 俺は必要ないとは思わないけど、そのメリットを認識していても
> そのメリットを必要としていなければ、クラスも必要ないって話になるのでは?
え、そういう話だったの?
ただ単に自分がそのメリットを享受できるようなコンテキストに出会ってないだけって事か。
まぁメリットデメリットを理解した上でクラスが不要というのはあり得る vbaはエクセルに対してはメソッド程度の存在だからな ただそれをどこまで理解しているかだな
不要ということは、クラスモジュールがあるVBAという言語体系は、設計そのものがあやまりだったということ?
>>305 > vbaはエクセルに対してはメソッド程度の存在だからな
そう?
上の方で出てきたのと似てるけど、VBAのクラスはEvent発行者になれたりする。
VB6でも同じ事ができて、かなり強力(いまだにVB6改造案件がかなりある)。
つか、デフォルトで揃ってないデータ構造が必要なときは、良くクラス使うけど。 木構造とか、グラフ構造とか、スタックとかでもクラスのが楽。
309 :
305 :2011/08/15(月) 19:50:50.78
>>306 個人的にはあやまり、とは言いたくないです。私もお世話になった。
>>307 vb6は何だかんだでキュ雨力、でも嫌われれた
羨ましシイ
>>308 ベッの言語使ったほうがいいんじゃねか
>>294 SendMessageの後にDoEventsとか入れてみたら?
SendMessageはメッセージュキューに積まないからそれでいけるか微妙だけど
class使わなきゃCollectionに入れられないじゃん
クラス要らない派ってもしかしてDictionaryとか自分で実装してんの? Excel上のデータ管理するならDictionaryは必須だと思うけど なんであるもの使わないかな 車輪の再発明好きか バグ入り込みやすいし周りはやめて欲しいと思ってるんじゃない? 個人的にはTypeより使い勝手いいと思う くだらない喧嘩でレス消費するのやめて本題の質問応答に戻ろう ここはそういうスレだよ
>くだらない喧嘩でレス消費 しへぇ
>>312 >くだらない喧嘩でレス消費するのやめて
くだらない持論を披露するスレでもないよ。
>>312 どういうクラス作ってるの?
Dictionaryとかはエクセルで実装してる範囲内では使ってるけど
わざわざクラスは作るまでもない
c#の議論が終わったら今度はクラスの議論か。 w
317 :
デフォルトの名無しさん :2011/08/15(月) 21:43:24.06
ところでなぜWordってみんなVBAを活用してないの? できるとこはできるみたいなんだからもったいない。
318 :
317 :2011/08/15(月) 21:44:06.49
自分もやりたいけど大型書店にも「Word VBA」みたいな本が1冊もないからどうしようもない。
>>317 wordって一回書式作ったらそうそう変えること無いしなぁ
むしろどういうふうに活用してるか教えて欲しい
320 :
デフォルトの名無しさん :2011/08/15(月) 21:51:03.84
>>319 写真が大量(100以上)あって、
それを文章とともに作ってる書類がある。
文章を追加すると当然レイアウトがくずれる。
しかし例え文章を追加してもレイアウトを自動的に調整してくれるマクロが欲しい。
>>320 くずれる、の崩れるがなぁ
100ぐらいなら手作業のほうが早いんじゃないかっていう
322 :
デフォルトの名無しさん :2011/08/15(月) 22:10:31.46
じゃ500だ。
じゃあってなんだよw
楽だから増やせばいいとか どこのブラックの上司だよ・・・ あれはちょっとトラウマだった
Dim sry() As String
Dim server As String, ita As String, dat As String
Dim hdate As Variant
Dim y As Integer
Range("A:A").Clear
Set http = CreateObject("MSXML2.XMLHTTP")
server = "hibari.2ch.net"
ita = "tech"
dat = "1312435844"
http.Open "GET", "
http://bg20.2ch.net/test/r.so/ " & server & "/" & ita & "/" & dat & "/", False
http.Send
hdate = StrConv(http.ResponseBody, vbUnicode)
sry = Split(hdate, vbLf)
y = 1
For i = 0 To UBound(sry)
Cells(y, 1) = sry(i)
y = y + 1
Next i
Set http = Nothing
こんな感じにbg20.2ch.netからこのスレのdat?を取得してA列に表示する奴作ったんだけど
Excelを終了しないと取得したのが変わらない、どうしてだよ
あと2chでインデントってどうやんの
>>325 コード見てないけど、今朝鮮人のおかげでkamome鯖が落ちてる
鯖落ち対策とかしてるかの
いや鯖は関係ないと思う 前から終了しないと最新のが取得できなかった
っていうかちゃんとhibari.2ch.netとかからdatを取得してみたいんだけど リクエストの飛ばし方とか差分取得がさっぱりだわ
>>330 bg20はバーボンに掛からないからやってたんだけどそれが原因だったか
ってかこの鯖どういう仕組みなんだよ、ブラウザで更新したらちゃんと取得できてるのに
最後datは要らない
実は朝鮮人のVBA砲だった
んなもんどこにでも落ちてまんがな
337 :
デフォルトの名無しさん :2011/08/16(火) 08:03:38.86
>>332 なにが忍法帖だよこの野郎。
2chにどっぷりはまってそうでダサくてかっこ悪い。
VBAのファイルって、単独で配布できるの?
>>309 > ベッの言語使ったほうがいいんじゃねか
逆に聞くけど、木構造とかスタックとかが必要になったとき、態々別言語でそこだけ実装してんの?
341 :
デフォルトの名無しさん :2011/08/16(火) 12:45:05.71
作ったマクロをショートカットで使えるようにしたく 試しにマクロの記録で作ったコードを見たら ' の注釈文の中に使用キーが書いてあったから そこで設定するのかと思ったら 実はこれはあくまでも注釈であり ここを変えても反映されないし自分が作成したマクロにそう書いても使用できない。 なので実際はわれわれの目に見えないところで ショートカットキーが登録されているよう思われる。 どうやるの?
>>338-339 エクスポートすれば、アドインにしなくても単独で配布できる
つーか、アドインはVBAのファイル(モジュール)の単独配布では無いだろw
.bas
>>314 俺だけの持論てことはもしかして
>>314 は
「単価、製造元」の情報を「製品名」をキーとして連想配列したい場合
自分で連想配列を実装しちゃうって事?効率悪すぎね?
俺なら
Public 単価 As Long
Public 製造元 As String
だけ定義したデータクラス作って商品名をキーにしてDictionaryに入れちゃうけど
俺ならADODBを使う
「持論」厨は相手にしない方が良いよ
俺ならどこぞのシートに製品名、単価、製造元の列つくって書いとく
で、毎回O(n)になると
連想配列厨はワンオフのしょうもないクラスを作った
一方、
>>349 はワークシートに書き込んでVLOOKUPした
ケースバイケース。 実にくだらん。
クラスに相当なコンプレックスを持ってる奴がいるな
VBAのクラスの使い方さっぱりだわ
356 :
デフォルトの名無しさん :2011/08/16(火) 20:18:28.03
変な質問ですみませんが Sub a() If Range("A1") = "あ" Or Range("A1") = "い" Then MsgBox ("a") Else End If End Sub と、if文でorを使い複数条件を指定する時 If Range("A1") = "あ" Or "い" Then では型が一致しません、と出てエラーになります。 いちいちRange("A1")を指定しないと駄目なのでしょうか?
357 :
デフォルトの名無しさん :2011/08/16(火) 20:26:32.45
駄目 演算子の優先順位が理由
そんなことより Else End If これelseいらなくね?
>>333 のレスをコピーしてRange("A1")に貼り付けて
Range("B1") = Range("A1")
ってやったら#VALUE!ってセルに表示されて代入された値も#VALUE!なんですけどなんでですかね
.valueつけたら表示されたわ なんでこれ省略したらいかんのかね
Rangeのデフォルトプロパティがvalueじゃないから
デフォルトってValueじゃなかったっけ?
Excelがやってる日付解釈関連の変な処理のバグだね エラー2015
エクセルVBAを使ってWEBから数値を取ってきて貼り付けるってことはできませんかね?
>>364 クラス使わないって言ったやつにこういう場合はクラス使うだろって例出しただけなんだけど
ケースバイケースなんて当然だろ
お前ずっとクラス使わないって豪語してるヤツだろ
攻撃されて悔しいからって重箱の隅突こうとして外しまくりで自分で空しくならない?
367 :
デフォルトの名無しさん :2011/08/16(火) 23:01:56.75
VC++からExcelを操作するよりもVBAで書いた方がExcelのver違いによる 動作不良は起きにくいんでしょうか? VC++からはタイプライブラリとか使用せずShellExecuteで Excelを立ち上げる処理だけして後の処理はVBAに 任せるみたいな方法はver違い克服に有効?
外部からだとWorkBookのOpenですら引数の個数違ったりするから色々調べたり結構めんどいと思う。 それと解放忘れでExcelプロセスがゾンビ化したりもあるからVC++等で使用する場合は注意が必要ですね。 やっぱりExcel+VBAでやった方が親和性的にもよろしいかと。
C#の後はC++か・・・ その内ILとか出て来そうな勢いだな
>>365 VBAで株価データを取ってくるなんて作業なら毎日やってる
>>366 >クラス使わないって言ったやつに
そんなやついたか?
勝手に敵作って一人相撲乙。
連想配列厨はクラスを使う良い例が出せないセンスの無さを、 「クラスを意地でも使わないやつがいる!」 と脳内変換することで防衛機制を発動しているのです
こいつ何にでも粘着するな 分かりやす
こないだのハッタリ君とか呼ばれてた奴じゃね?
377 :
デフォルトの名無しさん :2011/08/17(水) 08:47:36.44
呼ばれてたってか、お前ともう一人の馬鹿が暴れてただけだろw
>>374 そもそも何で例なんか必要なんだ?
教えてもらわないとわからないのか?
お前、C#とかC++やJavaでクラス抽出できないの?
クラスを作ってDictionaryにぶち込むって書いてた人がいたけど、それって毎回データをファイルから読んでるの? VBAのクラスの生成コストがどんなもんか知らないけど、良く利用している人の感覚からすると速度ってどんなもんなの? ケースバイケースなんだろうが、DBを毛嫌いする理由もないよな。Excelからじゃ使いにくいって考えかもしれないけど。
>>379 もはや支離滅裂。
言いたいこと整理しろよ。
>>379 なんでDBの話が出てくるのかわからないけど、木構造が必要になったときとかにクラスでデータ構造を
表現すると便利だよねって例がわからない?
>>379 あ、それとDictionaryが便利なのは、ハッシュ構造だからだよ。
383 :
デフォルトの名無しさん :2011/08/17(水) 12:22:02.83
連想配列厨がただ一匹暴れている微笑ましい光景はいいんだが、
いいかげん連投レスがうざいんでコテつけてくれないか
>>380-382
お前が付けろ NGするから
>>383 みんなは、お前一人が暴れてると思ってるよ。
マクロで縦5〜497までの繰り返しで Gが空白ならそのまま、何か入っていればA~Gを水色に染める ってどうなりますか?
>386 VBAじゃなくても、条件付書式ではどうですか?
>>387 それでも大丈夫だと思います!
やり方わかりませんが・・・
>>387 その枠だけは色を変えれる様になりました
ありがとうございます
391 :
390 :2011/08/17(水) 19:20:32.36
エクセル2007でwindowsXPです ブックをセーブする時に時々 「共有違反のため保存されませんでした」 というエラーが出ました ググッたら 校閲→ブックの共有→複数のユーザーによる同時編集と、ブックの結合を許可する にチェックを入れればいいというのが見つかったので、そうしました。 それでいまのとこ「共有違反のため保存されませんでした」は出てません。 そしたら、今まで何年も問題無く使えてた自作のマクロを使おうとした時に 「このコマンドは、共有ファイルで実行することはできません」 と出て使えないんです。 で、ググッたら 「複数のユーザーが同時に編集する(ブックを結合する)」のチェックを外せばいい という事でした。 結局どっちかを諦めるしかないんでしょうか?
共有を外すっていう選択肢はないの?
どっちも諦めたら考えてる手間が省けるよ
>>394 共有を外すっていうのはどうすればいいんですか?
ネットワーク上のファイルなのこれ
398 :
393 :2011/08/18(木) 01:32:29.68
>>393 >校閲→ブックの共有→複数のユーザーによる同時編集と、ブックの結合を許可する
>にチェックを入れればいいというのが見つかったので、そうしました。
まずこれ対処間違ってるから
Officeのバグなので「時々」出るくらいならそのままパッチを待ちましょう
400 :
393 :2011/08/18(木) 02:10:59.63
>>399 はい。ググった時にもバグという記述があって、とりあえずこれでいけるって書いてあったのでそうしてました。
これ間違ってたんですね。チェックはずします。
セーブ失敗するのは、たまになのでこのまま使います。
ありがとう。
vbaでm4a(AAC)って再生できますか
できます
関連付けられているアプリを使ってっていうことなら出来る、、、、、、、、、、、ような気がするw
404 :
デフォルトの名無しさん :2011/08/19(金) 00:10:45.97
A列だけを使って行がたくさんあるシートがあります。 これをメモ帳の形式(つまり拡張子txt)で文書として保存するには どういうVBAを書けばいいでしょうか?
405 :
デフォルトの名無しさん :2011/08/19(金) 00:14:26.26
Word VBAのスレがないからここで書くけど WordのVBAって、マクロの自動記録の機能を使って研究しようと思ったら マウスカーソルの下にテープのような小アイコンが出てきて マクロに記録したい「右クリックで使用できる機能」や「文字を選択する機能」などが全く使えないじゃないか。 そのため研究すらできやしない。 これはどういうこと? そもそもこれじゃなにも記録できないから自動記録の意味がないじゃん。
右クリックがダメならメニューから使えばぁ?
>>404 とりあえずマクロの記録
名前を付けて保存でテキスト選んで保存してみれ
WordのVBAは腐ってるからないものと思ったほうがいいよ
大文字小文字を区別してデータの個数を数えたいのですが、 関数なら =SUMPRODUCT((EXACT(A1:A100,A100))*1) と書く場合を VBAで書くにはどうしたら良いのでしょうか? (Application.WorksheetFunction.SumProductの使い方?) .Formulaに関数を書くのではなく直接求める方法を教えて下さい。 よろしくお願いします。 OSはXP、EXCELのバージョンは2003です。
410 :
デフォルトの名無しさん :2011/08/20(土) 16:04:49.67
"もしアクティブセルがB列にあるならアクティブセルに○と記入" これのやり方お願いします
411 :
デフォルトの名無しさん :2011/08/20(土) 17:30:56.91
間違ってても責任とらん If ActiveCell.Column = 2 Then ActiveCell.Value = "◯" End If
どうでもいいけどみんな最初は入門サイトとかでColumnWidthとかRowheightとかを先に覚えてから 後でColumnとかを知るよな
413 :
デフォルトの名無しさん :2011/08/20(土) 19:17:31.90
414 :
デフォルトの名無しさん :2011/08/20(土) 20:29:27.11
た〜くさんあるセルの文字列を連結して それを別の1つのセルに入れたいんだけど この場合はどの関数を使うの?
>>414 CONCATENATE 関数だけど普通使わないかなぁ
& で いけるから
416 :
413 :2011/08/20(土) 21:10:35.86
>>415 =A1&A2&A3
程度ならいいけど
=A1&B1&C1&D1&E1&F1&G1&H1&I1&J1&K1&L1&M1&N1&O1&P1&Q1&R1&S1&T1&U1&V1&・・・・
とどんどん続く場合は?
For n = 1 to m str = str & Cells(1,n) Next n cells(2,1).Value = str こんな感じじゃいかんのか?
>>419 頑張ってVBAなんて使わなくてもできるだろ。
419のをコピペしたらコンパイルエラーなるで
>>421 当たり前だろ。全部答え乗せる馬鹿いるかよw
Function link(myRng As Range) As String Dim n As Object Dim x As String For Each n In myRng x = x & n.Value Next n link = x End Function これ標準フォームに貼ってセルには =link(範囲) これで連結されるはず
424 :
デフォルトの名無しさん :2011/08/20(土) 22:15:10.90
VBAで 指定したフォルダ内の全ファイルのファイル名を A列に1列にならべるにはどうすればいいですか?
426 :
デフォルトの名無しさん :2011/08/20(土) 22:40:34.21
指定フォルダ内の全ファイルを A列に1列にならべるにはどうすればいい?
>>426 cd 指定フォルダ
dir /a-d /b > temp.txt
temp.txt を Excel で読む。
430 :
デフォルトの名無しさん :2011/08/20(土) 23:25:37.00
VBAに限らず、CやJava含めたプログラミングにあたり、 変数は、値渡し、参照渡し、矢切りの渡し、 どれをメインに使っていくのが得策でしょうか?
431 :
430 :2011/08/20(土) 23:26:40.37
変数のスコープのような「できるだけローカル変数にしたほうがいい」みたいな指針はありますか?
>>430 ケースバイケース
>>431 スコープは可能な限り狭い方がいい。
人が理解できる範囲は限られているから。
>>430 変数の値渡し、参照渡し、矢切の渡しは用途に応じて使い分けるもんでしょ。
ユーザインターフェースに関係ないところは全てローカル変数なんじゃないの?
因みにC言語には参照渡しなんて無いから。
これ以上はスレチになるんでやめとく。
434 :
デフォルトの名無しさん :2011/08/21(日) 00:33:43.61
スコープを小さくする、が基本 グローバル変数よりも、モジュール変数、できればローカル変数で。 可能なら値渡しをつかう。
435 :
デフォルトの名無しさん :2011/08/21(日) 08:03:41.75
矢切の渡しはどういうときに使いますか?
436 :
デフォルトの名無しさん :2011/08/21(日) 10:15:16.51
江戸川を渡りたい時
437 :
デフォルトの名無しさん :2011/08/21(日) 10:26:31.54
>>436 とおっしゃいますと、矢切とは江戸川のこと?
438 :
忍法帖【Lv=1,xxxP】 :2011/08/21(日) 22:15:27.68
>>437 Cells(3, i).Select
ActiveCell.FormulaR1C1 = "=RC[-52] - RC[-6]"
RC[-6]を絶対パスにはせずに固定する方法ってありますか?
440 :
デフォルトの名無しさん :2011/08/22(月) 01:36:19.74
RC使うよりoffsetじゃいかんのか?
441 :
忍法帖【Lv=1,xxxP】 :2011/08/22(月) 03:08:35.67
セルに式が入っていればなんでもいいです。オートフィルしたいので。
変数を使って書き直してみたんですがダメでした。最後のセルだけちゃんとなってたんですが
Cells(3, i).FormulaR1C1 = "=RC[-52] - RC[" & -変数 & "]"
>>439 わざわざ貼ってもらってありがとうございます。でも解決できなかったです。
あと
>>438 のアンカーはミスです;
>>441 >>439 だと固定にするには[]を外せば絶対参照になるって書いてある。
何でそのようになっていない?
javascriptではグローバル変数はローカルに代入してから使ったほうが速いって聞いたんだけどVBはどうなの
>>441 なんで絶対参照でダメなのか解らんが
相対参照でやりたいなら、自分で目的セルまでの相対的な位置を計算すればいいんじゃね
445 :
デフォルトの名無しさん :2011/08/22(月) 16:53:12.32
再計算方法を特定のシートだけ自動計算、ほかは手動計算にする方法はありますか?
>>445 Workbook_SheetActivateで切り替え
447 :
デフォルトの名無しさん :2011/08/22(月) 17:02:41.38
>>446 わからないんでちょっとだけ書いてもらえませんか?
>>445-446 特定のシートから他のシートを参照していたりするケースを考えると、無理じゃね?
449 :
デフォルトの名無しさん :2011/08/23(火) 14:29:20.37
>>445 が無理なら
bookの設定を手動計算にして、VBAで再計算させるときSheet1以外を再計算させる方法ありますか?
>449 なぜ、一部のシートだけ自動再計算を止めたいの? 値を変えたくなかったら、コピーして値貼り付けすればいいんじゃないの?
451 :
デフォルトの名無しさん :2011/08/23(火) 19:25:23.67
解決したんでもういいです
(#^ω^)
453 :
デフォルトの名無しさん :2011/08/23(火) 19:40:59.01
454 :
デフォルトの名無しさん :2011/08/23(火) 23:39:41.78
>453 なぜそれを聞く必要があった?
456 :
デフォルトの名無しさん :2011/08/24(水) 01:08:27.65
>>455 お前もな
はいキリがないからこれで終わり
ユーザーフォームにオプションボタンを2個置いてiniファイルで状態記憶させています。 iniファイルが無い状態で実行した時は、オプションボタンAのValueをTrueに、オプションボタンBの ValueをFalseにするようにしています。 この時オプションボタンAのチェックする所がグレーになってしまいます。 オプションボタンAのキャプション部分をクリックすればきちんと表示されます。 iniファイルから状態を読み込んだ時は正常に表示されます。 iniファイルが無い状態で起動させた時もグレーにさせないようにするにはどうしたらいいでしょうか? iniファイルの読み込みは下記のように書いています。 RC = GetPrivateProfileString(FormData, "optionA", "Ture", buf, Len(buf), iniFile) UserForm1.optionA.Value = Left$(buf, InStr(buf, vbNullChar) - 1) RC = GetPrivateProfileString(FormData, "optionB", "False", buf, Len(buf), iniFile) UserForm1.optionB.Value = Left$(buf, InStr(buf, vbNullChar) - 1)
多分 "Ture" のせい
459 :
457 :2011/08/24(水) 11:25:06.07
>>458 まさにそれでした。
ありがとうございました。
460 :
デフォルトの名無しさん :2011/08/25(木) 20:50:14.60
Word VBAのスレがないのでここで質問です。 文書があります。 段落が50個くらいあります(Wordの定義の段落ではなく、世間一般の段落。)。 写真が200枚くらいあります。 写真は必ずどこかの段落に属していて、各段落は0個〜10個くらいの写真を支配下に置いてあります。 段落の文章は追加したり構成したりで、長くなったり短くなったりします。 そこでマクロの登場。 文章の長さが変わっても、自動で写真がレイアウトされるようなマクロは作れますか? レイアウトは人工知能のように勝手に見た目よく配置されるような仕様にしたいです。
461 :
457 :2011/08/25(木) 22:03:31.55
Boolで書くのと、0,1で書く場合の区別って何でしょうか? オブジェクトインスペクタではチェックの状態はBool値になっているのでTrueとか書いたのですが。
>>457 BoolはTrueかFalseしか値を取れない。
0,1はIntegerだから、2値以上扱う場合に使用できる。
簡単な例だけど、
関数の成功、失敗だけの返却値が欲しいのならBool。
関数の失敗を詳しく返すのであればIntegerにするとかかな。
>>460 Word 捨てて、TeX とか DocBook とか使え。
>>462 言ってることよく分からないけど解決してるんでもういいです。
465 :
デフォルトの名無しさん :2011/08/25(木) 23:42:31.77
Cells(1, 1).fomula = "=" & 値段 & "* 130" と上記のようにセルに式を入力したいのですが オブジェクトは、このプロパティまたはメソッドをサポートしていません。 と表示され上手くいきません。 この場合どのようにすれば上手くいきますか? よろしくお願いします。
>>460 見た目良くという仕様をまずは一意に解釈出来るように定義しよう。
それさえ出来れば後は作業に過ぎないし、それが出来ないなら話にならない。
>>465 抜粋した記述なのか否か分からなかったけど、
Range("a1").Cells(1,1).Formula=〜
みたいに、Rangeオブジェクトにぶら下げる形で書いても駄目?
>465 * と 130 の間に半角のスペースがありますが、これのせい? 値段 という変数には何が入っているの?
>>465 これ スペルミスだろ
X fomula
〇 Formula
h
セルのChangeイベントって100個とか200個とか複数のセルが 一気に書き換わっても追従する?
そんな事書いてる暇があったら答えろカス
そんな事書いてる暇があったら試せカス
やだ
477 :
デフォルトの名無しさん :2011/08/26(金) 23:35:00.69
For Each c In Selection Select Case c.Value Case "1" c.Interior.ColorIndex = 7 こんな感じでセルの値によって別のセルの値を入れるにはどうすればいいでしょうか。 置換だと時間がかかったのでこっちで処理したいのですが c.value = cells(tate,yoko).value では動いてくれません。
c.value = cells(tate,yoko).value でいいと思うけど型違うとか?
>>477 セルの値によって別のセルの値を代入すればいいんじゃね?
480 :
デフォルトの名無しさん :2011/08/26(金) 23:53:00.67
>>478 Longではだめですか?
>>479 selectcaseを使わないでもっと簡単にできる方法がありましたら是非教えてください
""で囲ったらstringになるんじゃかったっけ?
> c.value = cells(tate,yoko).value
が動かないのではなく、条件分岐が不適切で、そもそもそのコードが実行すらされていないのでは?
>>481 も言ってるが、「case 1」と「case "1"」は別物
セルに「1」と入れたら前者には一致するが、後者には一致しない
セルに「="1"」とか「'1」と入れたら後者に一致する
特定行のコードが実行されているか否かは、ステップ実行やブレイクポイントを使えば、
バカでも簡単に確認出来ることなので、PC初心者板ならまだしも、プログラム技術板に
来る奴がその程度の初歩的な確認すらしてないなんてことは無いと思いたいが
ここにも偶にプログラム技術板ではなくPC初心者板が相応しいようなバカが迷い込むからなぁ
因みに、Select CaseよりはIfの方が僅かに速いぞ
「簡単に」と簡単に言ってくれるが、「簡単」の定義を明確に書かないと、実行の簡単さ(速さ)なのか、
コードを書く上での簡単さ(コード量の少なさ)なのか、コードを読む上での簡単さ(可読性)なのか、
何を求めているのか解らないし、具体的な分岐条件も書かれていないのでは尚更答えようが無い
分岐条件によってはコピー元のセル行列を演算やChoose、Iif、Arrayなどを使って求め、条件分岐自体を
廃することも可能だが、不特定の条件に万能に対応出来る方法となるとIfとSelect Caseしか答えようがないからなぁ
うわ偉そうなうっとおしい長文回答
無能の遠吠えを聞いた気がする
select caseもifもコンパイルで最適化されるんじゃないの
>>482 とりあえずはっきりした間違いだけ指摘しとく
>セルに「1」と入れたら前者には一致するが、後者には一致しない
これは間違い
暗黙の型変換によって両者に一致するぞ
仮にもVBAのスレッドにいるプログラム技術者が暗黙の型変換わからんとか言うなよ
セル範囲のデータを取得してXMLに出力するプログラムを作成しています。 各要素の前後にLF改行を入れるため Call AAA_node.appendChild(xmlDoc.createTextNode(vbLf)) としているのですが、作成されたXMLをEmEditorなどの改行コードを区別して表示できるエディタで確認すると CRLFで改行されています。 XMLに出力される改行コードをLFにしたいのですがどうすればよいでしょうか?
いろいろ試せばいいんじゃないの
>>487 エディタ側で気を利かせて改行文字を勝手に変換してるオチは無い?
変換してるのが、エディタかVBAか切り分けるため、
ファイルのバイナリをチェックしてみては?
ごめん、ボケてエディタの種類見落としてた…ちと吊ってくる
491 :
487 :2011/08/28(日) 02:01:11.21
一旦作成したXMLをOpenAsTextStreamで開き Replace(text, vbCrLf, vbLf)して再度保存するという方法に逃げました。。
>>487 バイナリエディタでチェックせずに対策しちゃったのか?
バイナリデータでどんな値が入っているか確認しないで結論出せるとは天才だな。
そもそも XML なのに改行コード云々ってどういう環境なんだろう?
>>493 セルのデータだからじゃないの?
セルの中の改行はLFだから。
楽天証券が配布してるツールでエクセルのアドオンでRSSって言うのがあります。 セルに =RSS|'9501.T'!現在値 (9501は東京電力の株価コード)と書くと東電の株価がセルに表示されます。 これをVBAで kabuka = RSS|'9501.T'!現在値みたいに直接扱うにはどうしたらいいでしょうか? 現在は Cells(1,1) = "=RSS|'9501.T'!現在値" みたいに一旦セルに記入させてから値を取得しています。 環境はXP、エクセルは2003です。 よろしくお願いします。
>>494 「改行」を保存するんじゃなくて
「改行コード」のコードを保存したいなら、テキストで保存しちゃダメだな
>>495 そのアドオンの仕様がわからんので答えられません
楽天証券に聞いてください
497 :
デフォルトの名無しさん :2011/08/28(日) 11:44:23.07
アドオンなら中見えないの?
498 :
495 :2011/08/28(日) 12:37:48.35
今、中身見たけどサパーリ分かりません。
思い通りに動くならどんなやり方でもいいんじゃないの アドオンの関数使ってCalculateして値とればいいじゃない
>>496 セルの内容をXMLファイルに吐き出すVBAを作ったことがある。
セルの内容をString型の変数に保存するだけで問題なくXMLに登録できたし、
XMLファイルから文字列として取り出しても普通に改行コードはそのままだったよ。
普通セルのデータならString型の変数に格納するんじゃないの?
テキストで保存っていうのはどこから出てきた話なのかな?
501 :
デフォルトの名無しさん :2011/08/28(日) 16:26:22.19
すみません。 ファイル書き出しについて、ファイル名に選択セル内の文字列を引用する場合はどのように書けばよいでしょうか? 選択セル内に"123"とあれば、123.txt を保存など strFileName = "C:\temp\***.txt"
"C:\temp\" & Cells(i,j) & ".txt"
>>503 そこをどう読んでもXMLファイルの改行コードはLFにすべきと読めないんだが。
そうですか。全く違う意味だったんですね。失礼しました
>>502 >>2 を声を出して1億回読め。
お前のようなやつがいるから、小学生でも分かるような内容を質問してくるヤツがつけあがるんだろ。
>>505 本当に理解してるのか怪しいね。
どこをどう理解したんだ?
だれかが「LFにすべきだろ」と言い出したらどうするの?
自己満足のために蒸し返すなよ
>>507 蒸し返されても仕方ない書き込みのほうが問題だろ。
問題を作る能力に長けてますね
なぜそこまで粘着するのかようわからんが、もうええやんw
セルのチェンジイベントに関して教えて下さい。 セルにキーボードから入力した場合はチェンジイベントが発生するのですが、 たとえばA1からA10までの集計をSUMでA11に表示する場合、A11ではイベントが発生しません。 セルの表面上の値が変わった時に発生するイベントを教えて下さい。
だから、うだうだ言う前に書いたコードを晒せ
>>511 A11 の値をどこかに覚えておいて、Calculate イベントで更新されたことを
見る方法しか思いつかない。
>>513 ありがとうございます。
ググっていてcalculateイベントにたどり着きました。
それで、改めて質問をしたいのですが、
自分のやりたい事は、このcalculateイベントが起きたセルによって
処理を変えたいので、どこのセルで起きたかを知る方法です。
よろしくお願いします。
>>513 さんの具体的なサンプルをググったらありました。
513さんの言われるように監視用のシートを作ったりする必要が有るみたいです。
ありがとうございました。
>>514 計算式にユーザ定義関数を使うってのは?
>>516 ユーザー定義関数は今ググって調べました。
しかし、中身をどうすればいいかが分からないです。
せっかくレスくれたのに、申し訳ない。
>>517 セル位置によってどう処理を変えたいのか詳しく説明すれば、
だれかが適切な内容を考えてくれるさ
VBEに function hoge(a as nanka) //shori hoge = hage end function =hoge()
>>518 レス、ありがとうございます。
お言葉に甘えて状況を書きます。
5枚のシートが有り、それぞれA列からE列、100行使います。
E1〜E100まではサーバーから勝手に数字が入ってきます。(この部分は業者が作ってくれた)
やりたい事なのですが、E1からE10、E11からE20と言う感じでグループとして、
どのグループのデータが変更されたかで、その変更されたグループに色を付けたいのです。
E1からE10のどれかが変更されたら赤、次にE41からE50が変わったら、赤を消してE41からE50を
赤(別の色でも良いですけど)みたいにしたいのです。
数字の合計がいくつ以上とかなら、calculateイベントの度に計算すればいいのですが、
どこが変わったのかなので
>>514 さんのレスのように何処かに記憶させて比較するしかないのかと
思いました。
よろしくお願いします。
つーかさ、ChangeイベントでA1:A10を見ればいいだけじゃん A11の【内容】は「=SUM(A1:A10)」であり、A1:A10に変更があってA11の【表示】が変わっても A11の【内容】は「=SUM(A1:A10)」のまま変わらないのだから、 セルの【内容】が変更されたときに起こるChangeイベントがA11で発生しないのは当然のこと しかし、A11の【表示】が変更されると言うことは、A11が参照しているA1:A10の【内容】が変更されて いるわけだから、A1:A10側ではChangeイベントが発生する つまり、A1:A10の【内容】変更を監視すれば、A11の【表示】変更を取得できるというわけだ
>>519 リロードしていませんでした。
どう応用できるか、考えます。
ありがとうございます。
>>521 > セルの【内容】が変更されたときに起こるChangeイベントがA11で発生しないのは当然のこと
すみません。
自分の知りたい事を強調しようと思って書いた例でした。
>>520 それ、セルの値が変わったかどうかが問題で、計算式関係ないじゃないか
一番の解決方法は、E列を設定するその業者に、値が変わったら色変えてくださいって頼め
>>524 ガ━━(゚Д゚;)━━━ン!!!!!
>>517 >しかし、中身をどうすればいいかが分からないです。
>>511 の例だと、標準モジュールに
Public Function Hoge(R As Range) as Variant
MsgBox "A11 が変わったよ。"
A11 = Application.WorksheetFunction.Sum(R)
End Function
って書いといて、シートの A11 に "=Hoge(A1:A10)" と入力する。
>>520 >E1〜E100まではサーバーから勝手に数字が入ってきます。(この部分は業者が作ってくれた)
Excel だよね?
ブックの共有でもやってるの?
>>526 なるほど。
分かりました。応用できます。
>>527 サーバーとのやり取りをしています。
中身は分かりませんが、サーバーからデータを取ってきて数字によって
E列の何処かに値を書き込む感じです。
ありがとうございました。
VBAやってて面白いと思うときってfunctionとシートやり取りしてるときだよな なんか関数を司ってる気がする
530 :
デフォルトの名無しさん :2011/08/29(月) 22:45:42.34
>>529 もうすこしくわしくおしえてくださらんか?
してない子の方が圧倒的に多いし
友達より早く
ListBoxのColumnCountいじると高さが変わるのってなんで?
Worksheets("MAIN").Cells(2, 2)にフォルダを書いておいて実行したんですが With Worksheets("MAIN") If Dir(.Cells(2, 2), vbDirectory) = "" Then ← MsgBox "指定したフォルダが見つかりません。" Exit Sub End If End With 矢印の部分で「型が一致しません」って出るんですけどDir関数って 引数 pathname に指定した内容が見つからないときは、長さ 0 の文字列 (" ") を返します ってヘルプにあるのにどうして?
Dirの第一引数の型ってRangeでもいいの?
>>536 そちらの方だったのか。。。
Cells(2,2)には d:\test と書いておいたんで文字列だと思ってたんですけど
If Dir(CStr(.Cells(2, 2)), vbDirectory) = "" Then
と訂正しました
ありがとうございました
.value これは?
Excel97という古いExcelですが分かる方 よろしくお願いします。 画像&オートシェイブ複数を グループ化した状態で グループ内の 特定オートシェイブのテキストを変更したいと思い 以下のコードを書きましたが 実行時エラー '1004' Characters クラスの Textプロパティを設定できません。 となってしまいます。 グループ化した状態では変更できないのでしょうか? Dim CapText As String Dim AddText As String Dim ThisShape1 As Shape AddText = "HogeHoge" For Each ThisShape1 In ActiveSheet.Shapes("Target-Img2").GroupItems If (ThisShape1.Type = msoAutoShape) And _ (ThisShape1.Name Like "*-[FB][BHP]-Frame") Then CapText = ThisShape1.TextFrame.Characters.Text CapText = CapText & "(" & AddText & ")" ThisShape1.TextFrame.Characters.Text = CapText '<---ここでエラー End If Next
Excel2007/2010でマクロを実行し、処理対象のブックを97-2003形式で保存したいのですが、 SaveAsのFileFormatにはxlWorkbookNormalとxlExcel8のどちらを指定すればよいでしょうか? どちらで試しても97-2003形式で正常に保存されているような気がします。 xlExcel8はExcel2003以前だとサポートされていないということは知っていますが、他に違いはあるのでしょうか?
>>538 遅くなってすんませんでした。それでもOKでした。どうもm(_ _)m
>>539 これグループ化した時点でShapeが書き換え不可になるんじゃないの?
543 :
539 :2011/08/31(水) 01:41:31.87
>>542 やはり書き換え不可になるのですかね
別の処理なんですが
特定Shapeを 非表示(Visible = False) には出来たので
テキストの変更もできそうだと思ったのですが.....
一旦グループ解除するしかないのかな
レスありがとうこざいました。
>>526 への便乗質問なんですが、
プロシージャの引数でセルを1つだけの指定にさせるにはどうすればいいのでしょうか?
Rangeだと範囲が指定できてしまいますので、セル1つだけに制限したいのです。
Cellsってやったら怒られました。
545 :
デフォルトの名無しさん :2011/08/31(水) 11:12:16.83
>>544 型としてはRangeを引数で渡して、関数内でRows,Columns,Areasの
各Countが1以外ならエラー値を返すんじゃ駄目なの?
まぁ、Cellsを指定するとか言ってるなら、型を理解してるかどうかが怪しいが…
単一セルのオブジェクトが無いから、それがexcelの基本方針なんだろうね ところで、Cellsって昔はメソッドだった気がするんだが、いつのまにプロパティになったんだ?
ユーザー定義関数で Public Hage(ABC As Range) As nantoka If ABC.Value>0 Then Range("A1").Value="0より大きい" End If End Function みたいに関数内からシート等に働きかける事ってできませんか? #Valueエラーが出てどうして良いか分かりません。 よろしくお願いします
無理だからワークシートチェンジのところに書け
働きかけたい先も引数にとれば行けそうな気がする
function忘れてる
553 :
549 :2011/08/31(水) 16:36:59.89
レスありがとうございます。 ワークシートチェンジに書くしかないようです。 このイベントなんですが、100カ所くらいのセルが ランダムに書き換わって、当然何カ所かは同時に 書き換わるような場合、100回処理がきちんと行われるんでしょうか? もしくは、そういう場合は最初のイベント処理の時に イベントが発生しないようして、何個もプロシージャが 走らないようにした方が良いのでしょうか?
誰がどうやって複数のセルに同時に書き込むんだ?
どなたか
>>540 にお答えいただける方いませんか。。
>>554 >>520 氏のような感じ。
うちは機械とシリアルでやり取りしてさせてるんだけど。
100台機械を繋げてる訳じゃなくて、シリアルのデータの中から
セル100個(おおざっぱな数字だけど)にデータを振り分けてる。
for each
ついでにいうと同時に書き変わるというのはシングルタスクのVBAでは無理
それは理解している PCの性能にもよるんだろうけど、どこまできっちりイベント処理してくれるのかな
560 :
デフォルトの名無しさん :2011/08/31(水) 23:43:31.02
質問です。 整数で二枚の各シートA,Bの2列に1から600までの整数がランダムに各列36万行入力 しています。シート1のA,B列の整数をシート2の整数A,Bと合致する行を検索するプログラムを 作ろうと思います。各シートの中の同じ組み合わせのA,Bは、2つありません。 そこで実際にシート1.2の各行を一つ一つ照らし合わせるプログラムを書いて見たが、実行すると あまりにも計算する量が多くてパソコンが止まってしまいます。 そこで質問ですが、計算量を少なくするには、どのようなやり方がよいでしょうか?
シート3に1と2が一致してるかどうかの関数いれる
>>560 ひとつひとつ参照ってどんな風に書いてるの?
564 :
デフォルトの名無しさん :2011/09/01(木) 09:04:09.44
>>562 If sheet1.Cells(a, "A") = sheet2.Cells(b, "A") And _
sheet1.Cells(a, "B") = sheet2.Cells(b, "B") Then
Loop
a = a + 1
のようにFor文で一致する行を検索してます。
>>563 APIを直接叩くプログラムだと、EXEファイルと挙動が違ったり
windowsにメッセージが行く時と行かない時があるから疑ってる
>560,564 シートのセルを直接参照するんじゃなくて、 A列とB列の値を連結した1個の数字(値は1,001〜600,600)×36万の1次元の 配列2個(シートAからのものと、シートBからのもの)を作って、配列同士の比較をした 方が速いんじゃないの?
>>566 それでいいのなら、36万要素の配列Aを一つ用意して、一つ目のシートに対して、
hash = (sheet1.Cells(i, "A").Value - 1) * 600 + sheet1.Cells(i, "B").Value - 1: A(hash) = i
を計算しておいて、今度は二つ目のシートに対して、同じようにhashを計算すれば一瞬で済むじゃない。
Excel, pptのマクロにて, Set Menubar = Application.CommandBars("Tools") Set cbcbtn = cbMenubar.Controls.Add(Type:=msoControlButton) cbcbtn.Caption = "ほげほげ" などとして,アドインタブにマクロを追加しているのですが, アドインタブ内のバーのタイトルが"メニューコマンド"となっていて, 変更方法がわかりません.これを変更するにはどうしたらいいのでしょうか? "Tools"が,アドイン->メニューコマンドとして 定義されてしまっているのでしょうか?
>>560 シートのセル参照すると結構遅い
どこまで早くしたいかわからんが、素直にシート1のA1:B360000と
シート2のA1:B360000をそれぞれ2次元配列に入れて、配列どうしで比較するだけで良いんじゃね
s1 = Sheet1.Range("A1:B360000")
s2 = Sheet2.Range("A1:B360000")
For i = 1 To 360000
If s1(i, 1) = s2(i, 1) And s1(i, 2) = s2(i, 2) Then
...
みたいな感じ
つか普通にセル参照しても、うちの環境なら数秒のオーダーで終わったけどな
参照と比較以外で時間かかってるんじゃないか?
>570 ループは2重で「総当たり」だから時間がかかるんでしょ。
572 :
570 :2011/09/01(木) 18:43:03.79
俺のexeclは6万行くらいしかないんだけど
65535行が上限です
>573,574 ナカーマ いつまでもExcel2003を使い続けましょう!
ご指導願います あるマクロを設定しましてマクロボタンを作って 現在指定時間にクリックしてマクロ実行しているのですが ボタンがたくさん増えたため 時間のずれがでてきまして・・・・ このボタンを毎日指定時間に 自動でボタンを押してくれるマクロを設定したいのです ご指導お願いできないでしょうか? お願いいたします
OnTimeでそのボタンのマクロを起動すればよいのでは?
579 :
デフォルトの名無しさん :2011/09/02(金) 15:23:37.81
Set FoundCell = range("B:B").CurrentRegion.Find(What:=名前) If FoundCell Is Nothing Then Else FoundCell.Select 上記のようにfindで見つけたセルをセレクトしたいのですが 検索範囲をB列のみとしているのですが実行して セレクトされる列は何故かA列になってしまいます。 どこが悪いのか分かる方ごご指摘ください。お願いします。
CurrentRegionのせいで範囲が広がってると思う
ボタン作らなくても関数名入力するだけでいいと思うが
583 :
デフォルトの名無しさん :2011/09/02(金) 21:10:23.01
VBAの入門レベルは突破したから こんどは仕事で使える「便利技」を重点的にたくさん学びたいんだけど そういう中級レベル以上を対象としてる とくに便利技のサンプル例がたくさん載ってる本はありませんか?
寧ろ懇切丁寧にプログラミングの基礎から書いてある本より、こういうときはこう書け、みたいなのが多い気がする
正直基礎完璧にしてAPIの使い方分かったらほとんどのことはできる
>>583 基礎が出来たなら、仕事で使えそうな便利技を勉強するも、仕事の中でこういう風に出来たら便利なのになと思うことを実際にコード書いてみるといいと思う。
大抵のことは、検索すれば答え出ると思う。その中で不足していることを補えばいいのでは…
学生だと話ずれてしまってるかもだが…
入門レベルは突破っていうのがどのくらいのレベルのことを言うのかな? ・Excel VBAのルールを理解している ・構造化プログラミングが出来る ・クラス設計が出来る ・プログラミングの定石を理解している 俺はどれも中途半端。 っていうかクラスモジュール使ったことないorz クラスが必要になる場面に出くわしていないっていうのもあるけど。
588 :
583 :2011/09/02(金) 22:54:38.45
入門 for nextが使いこなせる ローカル変数とグローバル変数がわかる フォームも使いこなせる モジュールの考え方がわかる サブルーチンで、値渡し、参照渡し、矢切りの渡しの区別がつく しかし クラスとはなんのことかさっぱり分りません 構造化プログラミングの意味は説明はひととおり読んで意味はわかったけどそんな大そうな用語を使う意味が分りません。
591 :
デフォルトの名無しさん :2011/09/03(土) 00:49:23.41
中級者: On Error Resume Next が正しく使える
それはない
帰ってくる型が違うときにOn Errorで条件分岐するともれなく奇怪なコードを作れます
通常3日あれば入門突破できるはずなのに 何で理解できないのか分からないけどクラス理解してないとか入門突破してないよ
矢切りの渡しってなんぞ?
江戸時代初期、地元住人専用に幕府が設けた渡し場のうちのひとつ。都内に残っている渡しはここだけ。小説や歌謡曲で有名。
597 :
591 :2011/09/03(土) 08:33:43.40
いや、オートフィルタを解除する時とかにつかわない?>>On Error Resume Next 他にもどうしてもって時にOn Error goto 0 と挟んで使うけど
>>569 遅レスだがあまり信用はしてはいけないよ
何にでもバグはある
vbaでListBoxを引数にするにはどうすればいいです? また、引数に出来るとして、受け取った側で渡されたのが ListBoxなのかどうかを判断するにはどうすればいいでしょうか? よろしくお願いします。
>>599 どういう状況でListBoxを引数にする必要が出てきたのかな?
リストボックスが5個あって条件によって商品名を各リストボックスに 登録していくのですが、リストボックスには最大10個までしか商品名は 登録しない。 古い順から消去して、追加される商品名は先頭に追加する。 こういうルールなので、リストボックスが違うだけで、リストボックスに追加、削除する プログラムは同じなので、追加、削除するプロシージャを使い回したいのです。 Add_ListBox(Name as string,LB as ListBox)とやると、LBに引数を設定する際、 修正候補"="とエラーが出ます。 Variantでもおなじです。 よろしくお願いします。
型指定する時の接続詞じゃないの
コードがあまりに断片的過ぎて困る
これじゃダメ? ググればこれくらいのことは分かる。 sub hoge() Call Add_ListBox("foo",ListBox1.Object) End Sub sub Add_ListBox(Name as string,LB as Object) LB.AddItem(Name) End Sub
>>594 なんか定期的に出てくるなぁ、VBA でクラスマスターしたってアホが。
>>598 なんにでもバグはあるけど、その確率がぜんぜん違うだろ。
ListBoxを変数に格納するときにSetせずに代入してるとエスパー
「世界で1番簡単なExcelVBAのe本」っての読んだけど、 次に読むべきオススメの本ってありますか? あまりお金がないので後はその二冊目の本と辞書っぽい本だけ買って何とか自分で大抵のものは作れるようにしたいです
>>608 > なんにでもバグはあるけど、その確率がぜんぜん違うだろ。
お前素人だろ
半導体が接触不良を起こす確率
半導体が接触不良を起こす確率 vs ここに質問しに来る人間のバグを仕込む確率
615 :
デフォルトの名無しさん :2011/09/04(日) 00:01:52.65
Set range = range("A:A").End(xlDown) range.Select これでA列の一番下のセルを選択したいのですが A列が2列以上あれば正常に動きます。 しかし、A列が1列しか無い場合、A1048576が選択されてしまいます。 何故でしょうか?分かる方教えてください。お願いします。
それはバグだな
A列は2列以上ないはずなので 目がバグってる可能性がある
>>617 >自称玄人乙
「〜乙」はヤツの口癖だったからおそらく同一人物だろ
xldown って要はCTRL+↓の動作でしょ だから 2行 以上ないとそうなるでしょ
俺のexecl6万行くらいしかないんだけど
大丈夫だ、問題ない
素人は意外とバグ発見器だけどね
パソコン新しくしたらマクロ実行速度大幅に短縮された もう簡易用途だったら、わざわざプログラムの最適化作業に時間費やす必要はなさそう
そう思ってればいい
ユーザーフォームが呼び出されているかを知る方法って有りますか?
>>628 呼び出されているというのがいまいちよくわからんけど、
Initailize/Terminate もしくは Activate/Deactivate で、
フラグ On/Off して、それ見るんじゃだめ?
UserForm1.Show vbModeless Load UserForm2 Debug.Print "表示されているユーザーフォームの数:" & DoEvents Debug.Print "ロードされているユーザーフォームの数:" & UserForms.Count
VBAじゃなくてセルに直接書く関数に関して質問でもおk?
>>630 そのコードじゃ「どれが」ってのがわからないよ
634 :
628 :2011/09/05(月) 18:45:09.69
今、629さんに教えてもらったようにInitailize/Terminateにフラグ建てて判断するようにしてみました。 やってる事は、シートのダブルクリックイベントでフォームのcheckboxがチェックされているかによって プロシージャを実行するかしないかという事なんですが、フォームを閉じる際にTerminateが走るのは 確認しました。 しかし、フォームを閉じた後シートをダブルクリックするとフォームは呼び出していないのに Initailizeが走ってフラグがTrueになってしまいます。 ユーザーフォームが呼び出されていないのにInitailizeが走るのってバグ? エクセル2003です。
635 :
デフォルトの名無しさん :2011/09/05(月) 19:31:21.96
>>628 > ユーザーフォームが呼び出されているかを知る方法って有りますか?
フォームがロードされているかどうか確認する
function dfIsFormLoaded(Byval strFormName as String) as Boolean
on Error Goto ErrTrap
Dim i as integer
dfIsFormLoaded = false
for i=0 to forms.count - 1
if UCase$(Forms(i).name) = UCase$(strFormName) then
dfIsFormLoaded = truen
Exit Function
end if
Next
Exit Function
ErrTrap:
On Error goto 0
End Function
>>633 書いてあるのは「ユーザーフォームが呼び出されているかを知る方法」であって
「どれが」とは書いて無い
637 :
デフォルトの名無しさん :2011/09/05(月) 21:09:29.72
皆さまお力を貸してください。 findにて連続検索をして、見つかったセルの隣のセルの値を取得して 見つかったセルが3個あればその中から一番高い値を選択したいのですが どのような方法、または関数を使うのがいいでしょうか? お願いします。
連続検索はFindNext、隣のセルはOffset、 最大値はWorksheetFunction.Maxでも比較演算でもお好きに それだけ解れば、あとは自分で書いた > 連続検索をして、見つかったセルの隣のセルの値を取得して > 見つかったセルが3個あればその中から一番高い値を選択 をそのままVBAに直すだけだろ
>>637 丸投げかよ。
っていうかさ、お前どこまで考えたの?
コード書いたの?馬鹿なの?死ぬの?
641 :
デフォルトの名無しさん :2011/09/05(月) 21:53:55.91
ニコニコにあるインベーダ―ゲーム作るにはどうしたらよい?
642 :
デフォルトの名無しさん :2011/09/05(月) 22:05:08.20
>作るにはどうしたらよい? プログラムを書けばよい
643 :
デフォルトの名無しさん :2011/09/05(月) 22:08:26.92
逐次探索のプログラムについて Cells(1, 1) = 11 Cells(1, 2) = 24 Cells(1, 3) = 36 Cells(1, 4) = 44 Cells(1, 5) = 58 Cells(1, 6) = 64 Cells(1, 7) = 77 Sub 逐次探索() Dim k As Integer, j As Integer k = InputBox("数字を入力してください。") For j = 1 To 7 If cells(1, j) Then Exit For End If Next If cells(1, j) Then MsgBox j & "番目です" Else MsgBox "無いよん" End If End Sub ここまで、自力で作成しましたがどんな数を入れても、 "1番目です"としか出ません。 どなたか対処法をお願いします。
>>643 If cells(1, j) Then
って何を判定させたいの?
645 :
デフォルトの名無しさん :2011/09/05(月) 22:38:33.08
>643,645 2カ所ある cells(1, j) を cells(1, j).Value = k ってしたらいいのでは? inputboxに入れた数字を k に保存して、for〜nextループで調べて 一致したら、その数字が何番目なのかを表示するって処理でしょ? (一致しなかったら「無いよん」と表示)
647 :
デフォルトの名無しさん :2011/09/05(月) 22:56:25.97
>>646 無事に完成しました。
ご指摘ありがとうございました。
>>646-647 二つめのIf文は危険なコードだと思う。
最初のIf文で検索できなかった場合、jは8となる。
今回は偶々一つ多くてもセルの位置に余裕があるからいいけど、
セルの位置が最大255の場合ならセルの列の最大数超えるし、
配列の場合は定義の範囲を超えてしまう。
二つめのIf文は j で判定したほうが安全。
複数のセルの値を順にみていって、条件にあったらメッセージボックスを表示させたいんだけど、 普通に表示させたらOKボタン押すまでマクロの実行が止まりますよね。 メッセージボックスが出てもセルの値を順に見続けて既にメッセージボックスが出てても、 次のメッセージボックスを表示させたいんだけどどうすればいいですか?
Application.ScreenUpdating を使って処理中の画面のちらつきは 抑えられますが、 Application.ScreenUpdating = Trueになるときに ちらつくのは抑えられませんか?
>>649 全部調べて文章作ってからメッセージボックスを表示する
文章かぁ 考えつかんかった。
ウィンドウを最小化しておけばいいんでねーの?
ユーザーフォームでmodeless
655 :
デフォルトの名無しさん :2011/09/06(火) 19:09:40.71
>>648 指摘有難うございます。先程修正しました。
今、
>>643 と同じ条件で二分探索を作っていますが、良く分からず止まっています…。
subプロシージャ内で自subプロシージャ名を取得するには如何すればよろしいでござるか?
そんな事はできん。 と、思うでござるが
>658 A1〜G1まで昇順にならんでいる前提で、列位置の数字を 1→7→4→2→3で当たり!って半分ずつ探す方法 のことでしょ
>>659 余計分からん。
その探索は二分木探索じゃないし、
>>643 では二分木探索なんかしてない。
661 :
デフォルトの名無しさん :2011/09/06(火) 21:36:36.64
逐次探索
>>643 と条件は一緒で、自分なりに考えたのだが…
Sub 二分探索()
Dim i As Integer, j As Integer, k As Integer, m As Integer
k = InputBox("数字を入力してください。")
i = 1
j = 7
Do While i <= j
m = (i + j) / 2
If cells(m) = k Then
MsgBox m & "番目です。"
ElseIf cells(m) > k Then
j = m - 1
MsgBox j & "番目です。"
Else
i = m + 1
MsgBox i & "番目です。"
End If
Loop
End Sub
どんな数入れても、5番目、7番目、8番目と出てしまう。
訂正お願いします。
662 :
デフォルトの名無しさん :2011/09/06(火) 21:48:42.47
>>661 デバッグできないの?馬鹿なの?死ぬの?
664 :
デフォルトの名無しさん :2011/09/06(火) 22:07:08.13
>>664 デバッグの仕方ぐらいググれよ。
デバッグぐらい小学生でも出来るよ。
666 :
656 :2011/09/06(火) 22:24:37.02
>>657 じゃあ、Subプロシージャから呼び出されたFunction()側から、何処から呼ばれたか知る術はないでござろうか?
引数として決め内でフラグを渡すとかは論外で、汎用的にできないですかね
>661 は、該当しない場合のことが抜けてますよ Sub new二分探索() Dim i As Integer, j As Integer, k As Integer, m As Integer k = InputBox("数字を入力してください。") i = 1: j = 7 If (Cells(1, i).Value > k) Or (Cells(1, j).Value < k) Then MsgBox ("範囲外です"): GoTo end_sub End If Do While i <= j m = (i + j) / 2 If Cells(1, m).Value = k Then MsgBox (m & "番目です"): Exit Do ElseIf i = j Then MsgBox ("該当なし"): Exit Do End If If Cells(1, m).Value > k Then j = m - 1 Else i = m + 1 End If Loop end_sub: End Sub
668 :
デフォルトの名無しさん :2011/09/06(火) 23:03:50.88
>>667 その場合、どんな数を入れても範囲外→該当なしになるので、考え直しています。
669 :
667 :2011/09/06(火) 23:12:59.34
>668 ??? >643 では「無いよん」って表示してるのに?
670 :
デフォルトの名無しさん :2011/09/06(火) 23:15:26.81
>>669 失礼しました。自分の勘違いでした、
親切におしえてくださり、ありがとうございました。
>>666 プログラムってものの作り方を解ってないなw
俺もプログラミング初めて1ヶ月くらいの超初心者の頃
そういうことが出来ないかと模索したことがあったよ
2,3ヶ月もすると、「自分は何バカなことやろうとしてたんだろう」と
思うようになったがw
>>661 7個くらいならどんな二分探索でもよいが、もし範囲が広い場合は毎回一致してるかどうかの判定は無駄なのでこんな二分探索になる。
Sub 二分探索()
Dim r As Range
Dim k, i&, j&, m&
k = Application.InputBox("数字を入力してください。", Type:=1)
If VarType(k) = vbBoolean Then Exit Sub
Set r = Range("A1:G1")
i = 1
j = r.Count
Do While i <= j
m = (i + j) \ 2
If r(m).Value > k Then
j = m - 1
Else
i = m + 1
End If
Loop
If j > 0 Then
If r(j).Value = k Then
MsgBox j & "番目です"
Else
MsgBox "該当なし"
End If
Else
MsgBox "該当なし"
End If
End Sub
r(m)とかの意味が分からないときは、とりあえずCells(1,m)とかに置き換えればいい。
まじに書いてはみたが、ちょっと素人にはわかりづらいアルゴリズムだな。
>>671 いや、だから関数とかないのかと思ってね
カーネル使えば出来そうだけど自分参照できんのかな
>>673 を素人向きに分かりやすいアルゴリズムで書けばこうなるのかな?
Sub 二分探索()
Dim r As Range
Dim k, i&, j&, m&, temp#
k = Application.InputBox("数字を入力してください。", Type:=1)
If VarType(k) = vbBoolean Then Exit Sub
Set r = Range("A1:G1")
i = 1
j = r.Count
Do While i <= j
m = (i + j) \ 2
temp = r(m).Value
If temp > k Then
j = m - 1
ElseIf temp < k Then
i = m + 1
Else
MsgBox m & "番目です"
Exit Sub
End If
Loop
MsgBox "該当なし"
End Sub
ループを抜けたら不一致だ。
Excel2007で並び替えダイアログを表示するVBAを作成しています。 「先頭行をデータの見出しとして使用する」をデフォルトでチェックを 入れたいのですが。 ↓では出来ませんでした。 パラメータの渡し方が間違っているのでしょうか。 Application.Dialogs(xlDialogSort).Show arg8:=1
オートシェイプが移動したときに発生するイベントってありますか
>>677 名前付き引数は使えないっぽ
Application.Dialogs(xlDialogSort).Show , , , , , , , xlYes
玄人さんはいつもって訳じゃないけど、基本はこうだな。 素人でも分かりやすいコードを書く→玄人プログラマ 素人でも分かりにくいコードを書く→素人プログラマ
玄人ほど基本に忠実だよ
玄人でも基本ができてないやつは多い。 とくにVBAでは本を書くようなやつでも合格レベルの玄人は少ない。 所詮素人に毛が生えてるおかも知らんけど。
そいつは玄人じゃない
684 :
デフォルトの名無しさん :2011/09/08(木) 06:47:05.08
ゎたしゎマンコに毛が生ぇてるけど 素人ですか玄人ですか?
昔と違って余裕で1000とか2getとか
>>683 禿同。本を書いているからって玄人というわけじゃない。
素人でも参考書は書ける。
素人玄人云々は別にして、プロなら
>>676 の二分探索アルゴリズムだけじゃなく、
>>673 の手法も知ってた方がいい。
同じものが複数あるとき後ろの位置を返すには
>>673 になる。
>>687 >>673 のコードの基本は二分木探索で、その応用なんだから二分木探索だけ覚えておけばいいんじゃね?
ライブラリみたいな形にしておいてもいいと思うけど。
二分探索と二分木探索って同じものだっけ?
>>679 ご回答ありがとうございます。
カンマで引数を指定しましたが、やはり出来ませんでした。
Application.Dialogs(xlDialogSort).Show
の前にセル選択をしていると
「先頭行をデータの見出しとして使用する」のチェックが
ついていなくて、
セル選択をしないとチェックが付いていました。
一番下の行も並び替え対象から外したいので
セル選択をしてから並び替えダイアログを表示しています。
何かのイベント処理中に同じイベントが起こったら、 処理が終わり次第、順番にイベントが処理されていくと 思うのですが、イベント処理する時に溜まっている イベントを破棄することって出来ますか?
for each で一定範囲内にあるオートシェイプってできますか? 具体的には Top1〜Top2の間かつLeft1〜Left2の間にあるオートシェイプのみをfor each したいです
俺は
>>676 みたいな二分探索しか知らなかったわ。
なるほど
>>673 は比較回数が少なくなるね。
ここで久々に勉強になった。
理解するのに少々手こずったが。
>>692 すべてのオートシェイプをFor Eachで回して、そのオートシェイプがTop1〜Top2の間かつLeft1〜Left2の間にあるときだけ
実行すりゃいいんじゃね?
696 :
sage :2011/09/09(金) 10:15:37.68
>>696 その本のサンプルコードをダウンロードして見たけど、玄人とは言えないな。
今まで記録マクロしか扱ったことがない素人ですが,どうかお知恵を貸してください。 ソフトはエクセル2003です。 ○状況 フォルダ1に,商品データファイルが商品コードの頭文字A〜Zごとに,それぞれに独立のエクセルファイルに収納されている。 (商品コード,数量,値段,更新日などが1行ごとに並んでいて,列は固定です) 同じ書式で,一定期間ごとに更新用データファイルが送られてくる。(コードの頭文字に関係なく,ランダムな商品データが配列されている) ○やりたいこと 更新用ファイルの商品コードと一致するものを,フォルダ1のA〜Zのファイルの中から検索し, フォルダ1の中の該当した商品の数量,値段などを最新のものに書き換えたい VBAの中でvlookup,match+index関数などを組み込んで試してみましたが,一致しないとエラーが出たり, 非常に時間がかかってしまうなど上手くできませんでした。(1ファイルに3〜5万件のデータがあるため) また,調べたところでは,配列形式など高速で処理する方法もあるようなのですが,私には理解できませんでした。 これをできるだけ高速に,エラーなく処理するプログラムのヒントをいただきたく存じます。 全体的にこういう流れ,という概要と,途中までの具体的なコードを書いていただけると,非常に助かります。お願いします。
>>698 とりあえず、更新用データのファイルの中身を商品コードでソートして。
それからマッチングと書き換え処理をさせれば、単純にランダムな並びのまま
ファイルを更新するよりは、ファイルのオープン、クローズや検索のための
走査回数の無駄が省けるはず。
俺ならaccessに入れる
701 :
デフォルトの名無しさん :2011/09/09(金) 12:49:07.19
>>698 醜い例でよければ、こんな感じで書ける。
Sub updateData()
ActiveSheet.Range(ActiveSheet.Cells(1, 1), ActiveSheet.Cells( _
ActiveSheet.Range("A1").End(xlDown).Row, _
ActiveSheet.Range("A1").End(xlToRight).Column)).Select
'商品コードでソート(先頭行が見出し行と仮定、以降も同様)
Selection.Sort Key1:=Range("A2"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _
:=xlPinYin, DataOption1:=xlSortNormal
'更新処理本体
Dim IniChar As String, IniCharPrev As String
Dim bIsOpen As Boolean, bMatch As Boolean
Dim TimeStamp As Date
Dim a As Variant, b As Variant, vSrc As Variant
Dim sDataFolder As String, sDestFilename As String
Dim wbDest As Workbook
Dim wsDest As Worksheet
TimeStamp = Date '本日日付を取得(更新日も更新ファイルの値を反映するなら不要)
sDataFolder = "d:\folder1\" '対象フォルダを設定
IniCharPrev = ""
ActiveSheet.Range("A2:A" & ActiveSheet.Range("A2").End(xlDown).Row).Select
bIsOpen = False
'続く
ゴメン、ミスって上げてしまった… '続き For Each a In Selection IniChar = Left(a.Value, 1) '更新データの頭文字を取得 If IniChar <> IniCharPrev Then '直前に操作していたデータと頭文字が異なれば、ファイルを開きなおす If bIsOpen = True Then '既に開いているデータファイルがあれば保存して閉じる wbDest.Save : wbDest.Close : Set wsDest = Nothing : Set wbDest = Nothing : bIsOpen = False End If sDestFilename = IniChar & ".xls" '更新先ファイル名を設定(ファイル名に応じて要更新) Workbooks.Open Filename:=sDataFolder & sDestFilename Set wbDest = Workbooks(sDestFilename) Set wsDest = wbDest.Worksheets(1) 'シートが複数あるなら要修正 bIsOpen = True End If IniCharPrev = IniChar
'続き(これで終わり) '検索 vSrc = a.Value : bMatch = False For Each b In wsDest.Range("A1:A" & wsDest.Range("A1").End(xlDown).Row) If vSrc = b.Value Then '一致したら更新 b.Cells(1, 2) = a.Cells(1, 2) : b.Cells(1, 3) = a.Cells(1, 3) '値段&数量 b.Cells(1, 4) = TimeStamp '更新日(更新日も更新ファイルの値を反映するなら要修正) bMatch = True Exit For End If Next b If bMatch = False Then MsgBox "データ " & Chr(34) & CStr(a.Value) & Chr(34) & "(" & a.Row & "行目)は見つかりませんでした。", vbExclamation End If Next a If bIsOpen = True Then '既に開いているデータファイルがあれば保存して閉じる wbDest.Save : wbDest.Close : Set wsDest = Nothing : Set wbDest = Nothing : bIsOpen = False End If End Sub
ここだとインデントもなくなるし複数のレスに跨ると見辛くなるしpastebinの類を使った方がいい
スレ汚してしまって、ゴメン。次回以降、気をつけます。
Excelで管理するようりDBで管理したほうがよさげなデータだな
Janeだと引用付きレスを使えばインデントも復元できるけど、やっぱ半角スペースを全角スペースに全置換する程度の気遣いは必要かもね
708 :
デフォルトの名無しさん :2011/09/09(金) 15:39:29.87
それは気遣いちゃう 気違いじゃ
>>706 その意見に大賛成だけどネックは「今まで記録マクロしか扱ったことがない素人」にDB扱わせるのは
問題ありすぎだと
でも5万件もの商品データを扱うのにExcelを使ってるような 会社?が信用できるのかどうか。 遊びでもなさそうだし。
>>710 >>698 に「1ファイルに3〜5万件のデータがあるため」と書かれているので
a. A〜Zのファイルそれぞれに3〜5万件ある
b. 更新用ファイルの内容が3〜5万件ある
b-1. 全データ数が3〜5万件あって、毎回その全てのデータが更新用ファイルに入っている
b-2. 全データは5万件以上あって、更新用ファイルにはその中の3〜5万件分が入っている
のどれかなんだけど、Zから始まるものが3万件もあるとは考えづらいのでb.じゃないかと睨んでる。
そうすると、処理毎に3〜5万回の検索をしなければならないので、データベース的なものを
考えないと無理だと思う。(金曜の夜に起動しておいて、月曜来たときに終わってればOKとかいう場合は別)
まぁでも事前に26個のデータファイルをオープンしておいて、3〜5万回のrange.find()しても
たいした時間かからないような気もする。
あと、
>>701 のコードは駄目駄目だから。rangeをSelectするのはド素人。
713 :
698 :2011/09/09(金) 21:29:19.94
用途は仕事です。
データ件数の話ですが,フォルダ1内ののA〜Zのファイルがそれぞれ3〜5万件といったところです。
更新データは1万以下です。
正確には数の少ないX〜Zなどは1ファイルにまとめてあったりするところもあります。
結局は全部開いて検索しなければならないと思ったので詳細は省いて説明してしまいました。
時間がある程度かかることは承知していますが,その間放置しておけばよいので,
できるだけ自動化して上手く反映させられることを優先しています。
>>701 ありがとうございました。
でもこのコードは駄目駄目?なんですか?
まずAのファイルから開いてFor Eachで検索→一致したものを更新→Bのファイル→C……Zまで繰り返し
という流れで良いのでしょうか? まあそれが分かっても自分でコードは書けないわけですが
>>713 >>701 です。あくまで1例だけど、考え方はその理解で合ってる。
確かに指摘されてる通り直す余地が色々ある効率も良くないコードだけど、
一応やりたい事は実現できる。おいらもVBA熟練者じゃないんでお手本を見て参考にしたいなぁ。
更新データだけでなく、フォルダ中のデータも並びを入れ替えても良いなら、
最初にフォルダ中のデータも全部ソートしちゃうと効率上げられるね。
フォルダ中のデータに存在しないレコードを探す場合以外は、
マッチング処理用の走査開始位置を、前回のマッチング行の次の行から行えば良いので、
データ全体を検索のために走査する回数は1回で済ませられるはず。
まぁでもみんなの言う通り、Excelで処理しなければならない特別な理由が無いなら、
データベースに移行した方が良いと思うし、イニシャル毎にファイルを分ける運用も
やめてデータは1つの表にまとめた方が良いと思う。
それなら今回の処理だってACCESSとかならSQLを1文書くだけで済む。
全角スペースでインデントできるけど。
物すごく遠回りなデータベース
717 :
デフォルトの名無しさん :2011/09/09(金) 23:32:39.25
Range("A1").FormulaR1C1 = "='E:\[Book1.xls]" & i & "'!RC-'E:\[Book2.xls]" & i & "'!RC" 作業しているブックのシート名とBook1のシート名が同じ場合、上のようなマクロを実行すると 「リンクするシートを選択してください」とBook1のシートを選択する小窓が出ます。 Book2と同じシート名では問題なく実行できたのですが なぜこのようになるのか教えてください
718 :
698 :2011/09/09(金) 23:57:35.55
>701 ありがとう。まず少ないデータで確認しながらやってみます。 >716&その他の方 遠回りせずにすむ方法があればぜひ教えてください
まずaccessを買ってください
>>673 質問者とは全然関係ないんだけど
たまたま似たようなことやっててとても参考になりました。
どうもありがとう
721 :
デフォルトの名無しさん :2011/09/10(土) 08:18:44.44
Accessを買わなくてもADOでSQLはつかえるぞ メモりリークするけどw
>>721 それは何かしらのデータベースがインストールされていればの話でしょ。
mySQLとかPosGreとか無料のDBインストールして使ってみるのもいいかもしれないけどね。
DB使うってことは必然的にSQLの知識も必要になってくるわけで。
VBAで手軽にっていうのとかけ離れているのかもしれない。
DB向けの内容をExcelにやらせていること自体、システム設計に問題があると思う。
723 :
デフォルトの名無しさん :2011/09/10(土) 09:10:02.17
>>722 >
>>721 > それは何かしらのデータベースがインストールされていればの話でしょ。
> mySQLとかPosGreとか無料のDBインストールして使ってみるのもいいかもしれないけどね。
Excelの表に対してもADO&SQLで操作できるぞ?一部使えない命令(DELETE文とか)もあるけど
でも、使ってみたかんじではちょっと凝ったSQLは上手く動かなかったな
ExcelをDBとして使うのが間違ってるからなぁ 絵を書くのにペイントを使わずワードを使ってるようなものだし
脊髄反射で書いてしまった
727 :
デフォルトの名無しさん :2011/09/10(土) 21:59:43.93
OS=XP エクセルバージョン=2003 ワークシートを判別する方法を教えてください。 もしSheet1がアクティブだったらこの処理。 Sheet2がアクティブだったらこの処理ってマクロ組んでるんですけど IF反応してくれません。 他に.Selectとか =Trueとか試してみたけどさっぱり・・・ ググレカスしてもヒットせず途方に暮れてます。。。 IF Sheets("Sheet1").Activate Then 処理 Elseif Sheets("Sheet2").Activate Then 処理 ・ ・ ・
If ActiveSheet Is Worksheets("Sheet1") Then てな感じかな。
>>727 Activateはシートをアクティブにするメソッド
アクティブなシートで処理を切り替えたいなら、
ActiveSheet.Nameみて判断すればいい
730 :
デフォルトの名無しさん :2011/09/10(土) 22:31:31.23
>>728 >>729 解決できた!ありがとう。
助かりました。
知っていれば簡単な記述だけど、知らなかったら難しいですね。
おかげさまで更に応用させられそうです。
これはググレカスと言わざるを得ない
各シートがアクティブかどうか見るんじゃなくて、 アクティブなシートは何か調べるっていう発想の転換が必要なわけで 自分で書いてるけどいろいろググってもヒットしなかったんだろ まあどんな単語でググったのか気にはなるが
733 :
デフォルトの名無しさん :2011/09/11(日) 03:01:35.79
アクティブかどうかの判定の目的なのにActivateメソッドを使うって事は、 英語力に問題があるような…。高校で英語サボるとこうなるのか?
最近VBAに必要性を感じて入門サイトなどから勉強して概要はつかめたのですが 今現在は、図形描画ツールによって作成された数十個のテキストボックスに書かれた文章をセルにコピーペーストするという 作業をやりたいのですが、 以前にそのスクリプトを頂いたのですが、数十個あるうちの半分ぐらいしかコピーペーストされなかったりします。 自分でそのコードを理解して、思うように作り直したいと思い勉強していたのですが、まだまだイマイチ理解できず。 思うように書けません。スクリプトを作っていくときに、熟練した方はどのように調べて書いているんでしょうか? 私はヘルプを読んだり、マクロの記録をやったりして出てくるスクリプト文とにらめっこしているのですがピンと来ないです。 用途別にわかりやすく解説されたリファレンスなどがあるサイトなどないでしょうか? イメージとしては辞書を引きながらみたいな感じで少しずつでも目的のものが書けていくようになりたいのですが そういう作業に適したサイトなどあるでしょうか? 熟練した人はヘルプなどから、細かなオブジェクトやメソッドを理解して作っていってらっしゃるんでしょうか?
735 :
デフォルトの名無しさん :2011/09/11(日) 11:51:19.06
================= 取りあえず、下のコードを実行する Sub test() Dim O As Object On Error Resume Next For Each O In ActiveSheet.Shapes Debug.Print O.TextFrame.Characters.Text & " " & O.Name Next End Sub デバッグ表示に「図形のテキスト 数字」が表示されている その数字を下のコードのShapes(?)に入れる Cells(1, 1) = ActiveSheet.Shapes(?).TextFrame.Characters.Text 複数の場合はShapes()の所をForで回して。 ======================== ちなみに入門サイトで図形の操作はあまりないよ。 基本はWorksheetの操作。 グラフ・ピボット・図形はまれ。 サイトは検索しだいで出てくるけど、素人には解りにくい。 さらにヘルプはもっと解りにくい。 >>>細かな・・・理解とあるが時と場合による。 オブジェクトやメソッドと言うよりプロパティ(引数)は 組み合わせ次第でかなり変わる。
熟練した人はそりゃあ細かな仕様を知っているし、ヘルプも読めます。 でもVBA=VB6+EXCELなんで 普通の人が深く理解するのは難しいかも知れないです。 とりあえずヘルプについてはある日突然読めるようになります、多分。 それまで頑張ってみてはどうでしょうか。
>>735 >>736 ありがとうございます。やっぱり地道にググッたりヘルプったりして
調べていくしかないのですね。
>>735 様、コードもありがとうございます。
>>736 様突然読めるようになるというのは、なんとなくわかります。
色々調べながらやってると、前よりはちょっとだけ意味がわかるので。
わかりました。ありがとうございます。
738 :
デフォルトの名無しさん :2011/09/11(日) 23:45:13.68
Likeを使った文字列の一致法で 文字列の中に$が入っていなかった場合の式は Range("A1") like "[!$]" では上手くいかないのですがどこが駄目でしょうか? 教えてください。
>>738 not (〜 like "$")かな
〜 like "[!$]"だと「$以外の任意の文字がある場合」でtrueなんでない
Likeは部分文字列のマッチングには使えないよ やるならこう If Not s Like "*$*" Then '入っていなかった場合の処理 End IF
741 :
デフォルトの名無しさん :2011/09/12(月) 09:57:48.91
Likeにこだわるのはなぜ? できなければMidとかで取り出せば? 理解せずコピペしたって、暫くしたら 意味不明なコードになるだけ。
Like演算子が好きだけど、Likeの機能じゃ事足りないとなたら正規表現を使うのが良い まあ正規表現で出来ることは、コードが冗長になっても良いなら全てVBAの組み込み関数と 制御構造で再現できるが、VBScript.RegExpならVBAから簡単に使えるし、 Win98SE以降ならOSに標準で入っているから避ける理由も無いだろう まあVBScript.RegExpで事足りなくなると、次は鬼車などのライブラリとなるが、ここまでくると 敷居が高いと感じる人も居るし、鬼車の入ってない他機では使えないなどの障害も出てくるけどな VB6の話になるが、俺の場合正規表現パターンをユーザーが入力するようなアプリでは 鬼車使って、正規表現を決め打ちで組み込む場合は、ほとんどVBScript.RegExpを使ってる
この用途ならInStrが一番良さそうに思うが
VBAスレで正規表現を薦めるのは悲しいバグを生むだけな気がする
バグを見つけたら新たなバグを埋め込んで納期と責任をずらすんだ
>>744 残念、ハズレ
正規表現使って悲しいバグ生む奴は、正規表現使わなくても結局悲しいバグを生むし
正規表現無しなら悲しいバグ生まないという奴は、正規表現使っても悲しいバグなど生まない
結局は、本人がデキる奴かデキない奴かということで、正規表現を使うか使わないかは関係なかったりする
747 :
738 :2011/09/12(月) 13:56:18.16
>>739-740 ありがとうございます。参考にさせて頂きます。
自分のプログラムへの理解度が低いのは分かっています。
なのでいろいろと作ってみて勉強をしている最中です。
いろいろな意見が聞けて助かっています。
>>746 お前がハズレ人間だ。
このスレから去れ。
>>738 Likeを使うことそれ自体が目的じゃないのなら、
If InStr(Range("A1").Value, "$") = 0 Then
'なかった時の処理
End If
I hate like !!
>>748 キミはバグの有無に関わらず悲しい奴だなw
自分がずれまくってるのに気づかない勘違い君憐れ
いや、そうでもないか
InStr()を使うより、RegExpを使う方が一般にバグの入り込む余地は増えると思うが。 つか、なんでこの流れで正規表現の話になるのかわからんわ。
正規表現使って悲しいバグ生む奴は、正規表現使わなくても結局悲しいバグを生むし 正規表現無しなら悲しいバグ生まないという奴は、正規表現使っても悲しいバグなど生まない(キリッ
> Like演算子が好きだけど、Likeの機能じゃ事足りないとなたら正規表現を使うのが良い ってだけで、別に件の処理に正規表現使えと言ってるわけでもないのに 何故か勘違いしたバカが湧いたから、延々と正規表現の話が続いてる。
この程度のことなら普通はLikeかInStrで十分だわな。
>>758 普通っていうとファビョり出す人が結構いるのから気をつけんとな。
>>756 そのカキコが君には悔しくて仕方なかったようだけど、
言ってることは正論でしょ。
どうせバグを生むなら何もするな もしくは全部やれ
流れぶった切ってすみません。 ブール型の変数ってTrueとFalseの2値しか取らないのだから 1bitでも十分な気がするのですが、 どうして2Byteもメモリを使うのでしょうか? 例えば、PCで2Byteの方が扱いやすいという理由だとしたら バイト型変数が1Byteだということと整合性が取れないですし。 別に理由を知らなくても特に困らない興味本位の質問なのですが、 どなたか理由をご存知でしたら教えてください。
>>763 少なくともビット単位では扱いにくいしメモリ効率も悪いだろう
何ビット目に割り当てているっていう情報が必須でしょ
バイトじゃなくてワードで割り当てられている理由はちょっと分からない
バイト単位でのアクセスよりワード単位のアクセスの方が速かった気がするから
それが原因か、原型のVBでそうなっていたのをただ引き継いだだけかもしれない
765 :
763 :2011/09/12(月) 23:21:25.64
>>764 どうもありがとうございます
やっぱりワードの方が処理しやすいからですか。
根が貧乏性なせいか、理由があると分かっても
どうにももったいない気がしてしまいますw
>>765 そう思うならByteを使ってBooleanの代わりをさせた場合と
Integerとマスクを使ってビット単位でBooleanの代わりをさせた場合と
Booleanそのものを使った場合とで実行速度がどれくらい違うのか測ってみるといいのでは?
767 :
763 :2011/09/12(月) 23:52:39.32
>>766 >そう思うならByteを使ってBooleanの代わりをさせた場合と
いや、そこまでするほどの話じゃないのでおとなしくBoolean使います。
あと、マスク云々の方はやり方すらわからないので私にはできないです。
わざわざ提案していただきましたがご期待に沿えず申し訳ないです。
768 :
デフォルトの名無しさん :2011/09/13(火) 00:45:38.73
というか、Variant_Booleanじゃないの?
おそらく16ビット単位でデータを処理するCPUを想定して設計されているんだと思う CPU的にはバイト型も16ビットでも同じ速度なんだが、それではメモリの効率が悪いのでバイト型は8ビットで済むようにしてる ただ、バイトデータのメモリ格納には制限があったりするんで、実際にVBAで1バイトの変数が、メモリを1バイトしか使ってないとは限らんはず
770 :
763 :2011/09/13(火) 07:05:51.69
>>768 >>769 すみません、寝落ちしてました
こんなくだらない質問に色々教えてくださった皆さん
どうもありがとうございました。
聞いてないし
addressof 演算子でvbaの関数アドレス引っ張ってプロセスメモリを見るソフトで関数アドレス付近を見ると なんとなくP-CODEっぽい
知ったかは書き込みを遠慮しなさい。
便所の落書きだろ?
おまえもな〜
じゃあみんなべんじょなかまだ
ここで弁当食べていい?
むしゃむしゃ
ぱくぱく
つるつる
おまいら、エサだぞ。 データ転記の際の上書きコードを教えろ 【スペック】 シートAに入力フォーム、シートBにデータテーブル。 シートAに入力したレコードをシートBに転記。(ボタン1) シートBのレコードからシートAにレコードを呼び出す。(ボタン2) 【問題】 データを呼び出すコードを使った後、再度入力ボタンを押すと 転記先用シート”データテーブル”には呼び出した前のレコードと再度入力したレコードが重複。 【教えろ】 呼び出したデータに対し上書きできるコードをおまいら教えろ
もう高度すぎて頭がクラクラするわ
あわよくば丸投げで書いて貰おうってやつか?
俺も
>>783 みたいなことは厨房の頃やったっきりでしばらくやってないから
もう訳解らなくて目眩がする
重複チェックにはキー(レコードを一意に特定するもの)が必要になる。 残念ながらこれはRDBの概念。 EXCELで出来ちゃったらAccessいらないわな SQLServerなんかも無料で良いかも
787 :
デフォルトの名無しさん :2011/09/14(水) 23:39:11.21
excelの並び替えだとうまく並ばなくて、Shift_JIS順に並んでるみたいです。 例えば、a2に”亜”と入っていて、 a3に”亜”のShift_JISの9999(例)とか表示したい場合は どうしたらいいのでしょうか?よろしくお願いします。
そういうのはユーザー定義関数が良いな。 Excelが手元に無くて試せないけど、 asc("亜")でコードが取れるようなのでそれを返却するようにしてはいかが?
ウソ教えないで
CODE(A1) 文字列の先頭文字に対応する ASCII または JIS コードを返します。
dim s as string s = "あ" dim hoge() as byte hoge = strconv(s, vbfromunicode) dim c as string for each c in hoge print hex(c) next
厨の頃コード自体を動的に生成するのやったわー 多重ループの中の一行だけ変えるために
Dim b() As Byte b = StrConv("亜", vbFromUnicode) Dim i Dim s As String For Each i In b s = s & Hex(i) Next MsgBox s
794 :
デフォルトの名無しさん :2011/09/15(木) 10:01:58.48
Excel2007 先頭一文字の文字種別を判定しようとしてます Sub test_Kanji() Dim wrd As String Dim i As Integer For i = 1 To 10 wrd = Left(Cells(i, 1), 1) Select Case LCase(wrd) Case "a" To "z" Cells(i, 2) = "アルファベット" Case "あ" To "ん" Cells(i, 2) = "ひらがな" Case "ア" To "ン" Cells(i, 2) = "カタカナ" Case Is >= "亜" Cells(i, 2) = "漢字" End Select Next End Sub んで以下の文字列に対してチェックしたんですが、(互)換、(一)定範囲、(二)に対してはチェックが出来ませんでした。 互換 一定範囲 asdrf ひらがな カタカナ 漢字 二 六 何故なんでしょうか。後、対処方法とかお教え願えないでしょうか
>>794 Option Compare Text
エクセルからUDPでいいので、データを同じLAN内のPCへ送りたいのですが、 エクセル単体で可能でしょうか? ググったらエクセルでTCP,UDP,RS232Cのテストをするソフトがあったのですが、 VB6のライブラリがいるとか書いてあったので、そういったものが無くても可能でしょうか?
797 :
796 :2011/09/15(木) 11:29:58.15
エクセル2003です。
winsockをapiで呼べばできるよ。
>>796 自分でVBA用のライブラリを作ればいい
ライブラリの中身は通信関係のAPI呼び出しの定義が書いてあるだけなんで、
自分でいちいちAPI呼んでもいいけど、ライブラリ化しといた方があとあと便利
いつでもAPIが使えるように宣言を書いたライブラリを作っておくと便利だよって事でしょ。
806 :
796 :2011/09/15(木) 19:14:36.05
皆さんありがとうございます。 winsockが私のエクセルにはないらしいです。 VBAエディタの参照設定にも無かったorz
>>805 コードを書けって言ってるんかと思ったけど、VBAでAPI使うって
単純に宣言を書き直すだけじゃん。
コールバックみたいなのもあるけど。
808 :
807 :2011/09/15(木) 19:33:54.65
それくらい読み取れよとも思う。
読み取れない香具師は馬鹿だろ
自分でライブラリを作ればいいって解決策を提示したかのような口ぶりで、 今手間はかかるが次同じような事があれば楽だぜ! って、、、結局手間だし、 796はAPIを使用することにに難色を示していて、手間を惜しんでる訳ではないし、 796が言ったライブラリってそーゆー意味じゃないし。 804を見て本物のエスパーだと思った。
バカンス
>>810 お前もう出てこない方が良い。
なんか、gdgd
ソースコードでライブラリですって出されると何か違う感じだな バイナリ配布できないvbaならではって感じ
VBAだけでDLL作れないが、バイナリ配布ってならDLLでライブラリ配布できるぞ ただ元の質問が外部モジュールや外部ライブラリとか使わないでできないか、って話だから ソース提示してコピペすれば動くって言ってるんじゃないか?
>>815 それは、「私はライブラリの意味を勘違いしている愚か者です」って自嘲しているのか?
818 :
デフォルトの名無しさん :2011/09/16(金) 08:11:57.57
そういうときのアドインじゃないの?
>>817 かつ、OCX版を知らなかったんだろう。
>>813 ありがとうございます。
今、教えてもらったサイトを見てテストしようとしたのですが、
Private Sub Command3_Click() のしたほうに書かれている
lngWnP = GetWindowLong(Text1.hWnd, GWL_WNDPROC)
で、hWndがないとエラーが出てしまいます。
フォームには、プログラムを見てコマンドボタン3個とText1をみてテキストボックスを1つ
置いたのですが、何がいけないのでしょうか?
822 :
796 :2011/09/16(金) 09:47:27.15
821は796です。 よろしくお願いします。
他の人が動いたって聞いてから試すようじゃ 教える価値が無いと思う。
824 :
796 :2011/09/16(金) 10:20:28.45
いや、今朝見たから。。。
>>821 それってサーバー側に必要なだけじゃない?
クライアントにはいらないでしょ?
828 :
デフォルトの名無しさん :2011/09/17(土) 03:57:23.09
"=countif(B1:B100," & i & ")" i の値を0からループできますか? 今は0と1以上で分けて問題なく動いてますが、まとめてしまいたいです。
>>828 何を言いたい?ちゃんと脳内を整理して書こうよ。
図形に文字が書かれていたら表示するのを作っているのですが For Each myShape In Worksheets("Sheet1").shapes If myShape.Text <> "" Then MsgBox myShape.Text End If Next myShape text caption labelいろいろためしたけどだめでした どれにすればいいのでしょうか
myShape.TextFrame.Characters().Text
On error Goto nex For Each myShape In Worksheets("Sheet1").shapes If myShape.TextFrame.Characters.Text <> "" Then 処理 End if nex: Next myShape on error使ってエラー出たら次に飛ばすようにしてみたのですがエラーでます なぜでしょうか
なぜってErr.Descriptionで分かるでしょう。 それぐらいはしような
835 :
デフォルトの名無しさん :2011/09/17(土) 14:30:37.16
お勧めはしないが、On Error Resume Next をつかい、その都度ごとにErr.Numberを確認すれば期待する動きになる、たぶん それか、 On error Goto nex For Each myShape In Worksheets(\"Sheet1\").shapes If myShape.TextFrame.Characters.Text <> \"\" Then 処理 End if nex: エラー解消処理の何か Resume \'再試行 Next myShape すればいい、たぶん。 つーか、gotoでループなんかの処理制御しないほうがいいと思う
というか文字が入力されてないかどうか判定するくらいならエラーで判定しなくても他に方法あるんじゃね 知らないけど
Variantと他の型の変数の計算速度って同じ?
試せばわかるじゃん。
839 :
デフォルトの名無しさん :2011/09/17(土) 20:22:43.19
だからね、そこまで速度が気になるんだったらExcelのVBAなんか使わずに実行ファイルをコンパイルして作れって それでも不満ならアセンブラやれ、アセンブラ。
だいたい同じ。でもちょっと違う、気になる人もいれば気にしない人もいる。
変数の種類について教えて下さい。 テキストファイルを読み込んだ時に、変数に入れて 一行一行取り出して処理をしたいのですが、 それに適した変数の型ってありますか? 配列を自分で作るのでしょうか?
Line Inputなんてなかったっけ?文字列型で、というか扱うデータも分からんな
早速のレス、ありがとうございます。 ググってすぐに、Line Inputは出てきたのですが、 用例として1行読み込んだらセルに書く用例ばかりでして。 読み込んだ1行を溜め込む、リスト形式の変数がないかを お聞きしたかったんです。
変数に入れてってそういうことか Redimで配列を大きくしながら代入していけばいいし ファイルをバイナリで丸ごと文字列型に読み込んでsplit(ファイル全体, vbCrLf)で配列に分割してもいい
ありがとうございます。 助かりました。
.NETのコレクションクラスを使う方法もある Dim objArrayList Dim obj Set objArrayList = CreateObject("System.Collections.ArrayList") objArrayList.Add "a" objArrayList.Add "bb" objArrayList.Add "ccc" For Each obj In objArrayList MsgBox obj Next
無いでしょ .Netめっちゃ遅いし、初回はCLR起動時間もプラスされるし
VBAならCollectionなかったっけ
VBAならscripting.dictionaryでしょ
>>841 バリアントにスプリットするのが簡単でいいと思う
>>844 改行コード区切りをvbCrLfにしちゃうって誰に教わったの?
852 :
デフォルトの名無しさん :2011/09/18(日) 01:30:31.33
VBA初心者です。 お勧めの入門書があれば教えて下さい。 今は「ひと目でわかる・・・」シリーズを見てます
VBAは触ったその日にそれなりのものが出来るくらいLLしいから 入門書読んでる時点で将来性ないと思う 本気でやるならマクロの記録で自分で調べてくのがいいです
>>853 本人がまずどのくらいプログラムできるか次第
他の言語である程度プログラムできるのであれば
マクロの記録から調べて行けば何とかなる
プログラム全くの初心者がマクロの記録みてどうこうするのは無理がある
次の入門書はいろいろ自分でみて、ある程度内容が解るけど全部は解らない、ぐらいのが良いと思う
>>853 マクロの記録はEXCELのオブジェクトモデルを理解する上でしか役に立たない。
俺もそうやって覚えたけど、多様なRange指定方法などを覚える為に参考書は見ておいたほうがいいよ。
VBAでAAC形式のオーディオファイルのタグ書き込みってできる?
>>856 バイナリファイルの読み書きができるから、可能か不可能かで言えば可能
愛知 名古屋営業所 愛知 豊橋営業所 岐阜 関営業所 岐阜 四日市営業所 上記の文字列を、shift_jisに変換したいです。 愛知(88a4 926d)名古屋営業所(96bc 8cc3 89ae 8963 8bc6 8f8a) 最終的にshift_jisで並び替えをして表示したいのですが excelの文字列をshift_jisに変換する方法はどうしたらいいでしょうか?
>>858 目的を果たすためには
@セルの文字列を取得する
A取得した文字列のShift_JISコードを取得する
B取得したコードをセルに書き込む
という流れになるわけだが、Aは
>>2 の★3,★4にもある通り
Excelとは関係無いのでスレ違い
よって、ここで教えるとしたら@とBのみだけど、それでも良いの?
そもそもExcelって普通に文字列比較したら何順になるの?SJISで並ばないならUTF16か?気にしたことがなかったは
If〜ElseIfを使ってユーザーフォーム1が開かれていなかった場合、スルーして次の動作に移るようにするにはどうすればいいでしょうか?
マクロ1年生です。 職場で使う工程管理表を作成しています。 下のような、ガントチャート風(?)の工程管理表を作っています。 横軸は時間、作業者の名前が縦に並んだ表で、 ”各人に割り当てられた[仕事]や[休憩]などをオートシェイプのテキストボックスで作成”し、 表の上に置くことで全体の工程を管理する、という表です。 09 10 11 12 13 14 Aさん [仕事1] [ 休憩 ] Bさん [ 仕事2 ] [ 休憩 ] Cさん [ 仕事3 ] [ 休憩 ] この表を作成し使用する上で非常に手間がかかる、 ”各人に割り当てられた[仕事]や[休憩]などをオートシェイプのテキストボックスで作成” という部分をマクロを使って素早くできないか、と考えています。 イメージとしては、マクロを実行すると、 ”仕事内容は?” ”必要時間は?” という質問が出てきて、それに対して答えを入力すると、 仕事内容が書かれたテキストボックスが、必要時間に合った幅で作成される、 というようなものを作りたいと考えています。 ・質問と回答のフォームが表示される ・テキストボックスを作成しそこに文字を入れる というマクロを作ったことが無いのですが、どんなキーワードで検索すれば、 参考になるサイト等が出てくるでしょうか? 教えてエロいひと!!
服を脱ぎます
>862 オートシェイプのテキストボックスでなければならない必要は何ですか? 評判の悪い「エクセル方眼紙」風の使い方になるけど、10分や15分単位に列をせばめておいて、 ユーザーフォームへの入力内容の結果を受けて、当該時間の範囲のセルを結合させ、結合セルの 中に文字を入れる方法じゃダメですか? 時間の単位が5分単位とか?
>>862 見事に自問自答してるじゃん。やりたいことがそれだけはっきりしてるなら一つ一つやっていったらいいよ。
検索は自分で言ってる言葉でまずググってみればいい。大抵のことはヒットすると思うよ。
ただ工程管理表なんてのはよくあるからある程度近いもののサンプルが多分見つかる気がするけど。。
866 :
864 :2011/09/19(月) 01:49:59.78
>862 × 必要 ○ 理由 ついでに、セルを利用したものだと、時間の重複のチェックもわりと簡単にできます。 セルに割り当てる時間の最小単位を15分と仮定します。 ある時刻〜15:15 がすでに「仕事2」に設定されていて、続いて15:00〜15:30を 「休憩」に設定しようとしたとき、15:00〜15:15に割り当てられたセルはすでに 結合セルになっているor当該セルに値がある と判定できます。 ※ある時刻が14:00などの場合、1行×5列のセル結合になっている ※ある時刻が15:00だった場合はセルの結合には該当しないけど、当該セルには"仕事2"という文字が入ってる >865 私は>862さんではありません。
867 :
864 :2011/09/19(月) 02:03:39.70
>865 自問自答 を 自演乙 って意味にとらえてしまった。気を悪くされてたらすいません。勘違いです。もう寝ます。
>>864 ご指摘の通り、セルの結合も考えてみたのですが、、、、
時間が10分単位で、使うのがおっさんばかりで細かいセルを見れないので、
テキストボックスを作って置くというやり方をしています。
仕事が増えたり減ったり伸びたりが非常に多く、簡単な操作で対応出来る点も大切です。
オートシェイプ扱えるようになりたいというのも、どうでもいい理由なんですけどね。
"ユーザーフォーム"というキーワードが知りたかったものでした。
ありがとうございます。
>>865 オートシェイプ
ユーザーフォーム
とりあえずググってみます。
こんな時間のありがとうございます。
>>868 結局セルの上にテキストボックスを貼り付けるのなら、テキストボックスの文字も
見難くなるような気がするんだけど。
セルが見難いのならセルの高さをもっと大きくして、表示するフォントのポイントも大きく設定すればいいんじゃね?
セルを扱うよりオートシェープの扱いのほうがめんどくさい気もするし。
セルの結合なんてたいそうなことせずにセルに色つければ済むんじゃないかな。
仕事別に色分けすれば見やすいだろうし。
>868 10分で1列となってるセルを手作業で結合させるんなら「細かい作業だからおっさんには無理」なんだろうけど ユーザーフォームで時間を入れてマクロで結合させる方法なら「細かい作業」はないよ。 オートシェイプの方が位置とサイズをドット(?)単位で指定しなきゃならないし、処理対象のオートシェイプの 判断は大変でしょ。(新規はともかく、変更に伴うサイズ変更対象テキストボックスはどれ?)
質問なのですが、VBAで変数名そのものを文字列として認識させる方法ってありますか?
ないよ
キーワードググったら、とりあえず思った位置にオートシェイプを作成することはでました。
あとはユーザーフォームの勉強をします。
ありがとうございます。
>>869 テキストボックスの中の文字は確かに見にくいですが、
それよりも多くの行を見渡すことでチーム全体の進捗を把握出来ることのほうが重要なんです。
ディスプレイが大きければ解決するんですけどね。
もしくはおっさんじゃなくて若者を起用するかw
>>869 ,870
・やっぱり時間が伸びそうだな → オートシェイプの端をドラッグして幅を広くする
・この仕事は他の人にやってもらおう → オートシェイプをドラッグして移動
工程の計画だけでなく、進捗をモニターしつつ、次の工程を作成するという使い方なので、
頻繁に書いたり消したり、伸ばしたり縮めたり、移動したりします。
オートシェイプの場合はこれらのことを直感的に行うことができるので使っています。
サッカーの作戦会議を、ホワイトボードの上で選手に見たてたマグネットを使ってやるような感じです。
だったらそもそもExcelでやるなという意見も出そうですが・・・・
勤務表がExcelなので、勤務表からその日に出勤している人をピックアップして、
工程表に名前を貼り付けて、シフトごとに並べるということをしています。
というわけでExcelを使っています。
条件によって該当する値を返すVBを作ってみました。 =sif(条件1,値1,条件2,値2,条件3,値3,…,条件n,値n,値n+1) 条件Xを満たすときは値Xを、該当無しの場合は値n+1を返す Public Function sif(ParamArray params()) Dim c As Integer Dim max As Integer max = UBound(params()) For c = 0 To max Step 2 If c = max Then sif = params(c) Else If params(c) = True Then sif = params(c + 1) GoTo Break ElseIf c = max - 1 Then sif = CVErr(xlErrNA) End If End If Next Break: End Function 条件が14個まではOKなのですが、15個以上になるとエラーになります。原因は何でしょうか?
いつも思うんだが、エラーになるって言ってる奴、なんでそのエラーメッセージを示そうとしないのだろうか。 エラーの場所も言わないし
エラー内容は?
VBAってBreakもないのか…
>>876-877 以下のようなエラーメッセージが出ます(>の部分)
>Microsoft Excel ヘルプ(&H)
>
>入力した数式は正しくありません。
>
>・ [ヘルプ] をクリックすると、数式を修正するための情報が表示されます。
>・ 関数の作成に関するヘルプを表示する場合は、[OK] をクリックし、[挿入] - [関数] をクリックします。
>・ 数式を入力していない場合は、等号 (=) やマイナス記号 (-) を使用しないか、または入力した値の
> 先頭にシングル クォーテーション マーク ( ' ) を入力します。
OKを押すとセル内容が表示され、15番目の条件に対応する値15が反転表示されます。
配列の要素=(条件1)0,(値1)1,(条件2)2,(値2)3,・・・、(条件15)28,(値15)29,・・・・)の(値15)
0から数えて29番目の引数のところで反転!
=sif(条件1,値1,条件2,値2,条件3,値3,…,条件14,値14,値15)だとOKで
=sif(条件1,値1,条件2,値2,条件3,値3,…,条件14,値14,条件15,値15,値16)だと上記エラーになります。
引数の個数に30個とか制限あったと思うけど
やっぱりそう言うことですか! ググってみたら一つの関数に使用できる引数は30 までと有りました、お騒がせしました。
882 :
861 :2011/09/19(月) 23:28:18.87
酔ってて質問の意味がよくわからない状態でした・・・すいません ユーザーフォームのコマンドボタンにハイパーリンクを設定したものを複数作ったのですが このマクロを登録しているexcelファイルがアクティブな時は常にユーザーフォームを表示 するように設定したいと思っています。 ブックのイベントでactivateを使用しましたが、ハイパーリンクを実行するときにもう一度 ユーザーフォームを開こうとしてエラーが発生します。 このエラーを回避するためにif〜elselfでユーザーフォームが既に開かれている場合は 次の動作に移るようにしたいのですが、次の動作に移らせる為のコードがわかりません。 説明が分かりにくいかと思いますが、よろしくお願いします。
>>882 このPCにはエクセル入ってないから実際に出来るかどうか試してないんですけど、
ユーザーフォーム開く命令(たしか Userform.Show でしたっけ?)の前に
On Error Resume Next を書いておいて
開く命令の次には On Error Goto 0 で Resume Next の効果を取り消すということで
二重に開こうとしてエラーが出ても無視するように出来ませんでしょうか?
こういうやり方(エラートラップでエラーを回避する手法)は
邪道らしいですけど、とりあえず目的は果たせそうな気がします。
ユーザフォームにはVisibleみたいなプロパティはないの?
フォーム上のリンクボタンを処理するのに、 その処理でフォームを開く必要なんてないと思うんだが
>>883 On Error GotoとかOn Error Resume Nextとか本来の使い方じゃない方法で
問題を解決するという癖はやめておいたほうがいい。
>>886 On Error Resume Nextはいつも後ろめたさを感じる使い方しかしてないな。
エラーを発生させることでしか判定が出来ない状況で使うって事でいいんじゃない?
当然別の判定方法があればそちらを使うべきだが。
VBAで整数Aが下記の範囲の時、Bの値を求めるには、どのようにしたらよいのでしょうか。 A B 0 〜 4 → 0 5 〜 9 → 5 10 〜 14 → 10 15 〜 19 → 15 20 〜 24 → 20 以下続く
>>881 初歩的なことなので既に解決策見つけてるかも知れないけど
こういうのは配列やコレクションで解決できるよ
配列使う場合は2次元配列で、コレクションならクラス使って
条件,値,条件,値,…と交互に入れるのではなく、「条件,値」をセットで格納すると良い
>>888 Int(数値/5)*5
WorksheetFunction.Floorを使うようでは素人。
891 :
888 :2011/09/20(火) 10:52:00.34
>>890 出来ました!
御回答有難う御座いました!
(数値\5)*5 FloorやIntやRoundDownを使うようでは素人。 つーか、これって小学校算数の質問だよね? 計算方法が解ってる上で、VBAで整数商を求める演算子や切り捨てを行う関数名が解らないと言うならまだしも 計算方法、解の求め方を聞いているようでは、素人以前、小学校低学年以下。
>>892 おっしゃるとおり
\演算子をすっかり忘れてたよ。
ちなみに整数じゃなく実数で4.9とかを0にするにはInt(数値/5)*5だからね。
それは実数での質問が来たときに言ってやれ 今回は整数限定での質問なんだから関係ない話だ
予想通りの反応だな。 だめだこいつ。
>>889 元の質問まで辿ると、それで解決できる問題じゃないな
901 :
デフォルトの名無しさん :2011/09/20(火) 15:22:31.37
ソートについて教えてください。 セルに1桁から5桁の数字と名前が入っています。 例 123 佐藤、 54321 鈴木 等というように。 これを数字を除いて名前だけでソートするにはどのような方法がありますか? ヒントを教えてください。お願いします。
スペースでスプリットすればいいんじゃないの
まずそういうデータは列を分けましょう。 区切り位置で区切り文字をスペースにすりゃ簡単に分けることができる。
>>900 ボウヤ、一人で何と戦ってるの?
周りは、君に教えを授けたり諭したりしてるつもりはあっても
君と言い争ったり戦ってるつもりの奴なんていないよ
君は質問者じゃないにしろ、君が知らないこと、忘れていたことを
教えて貰ったんだから、感謝こそすれ、悪態付いたり質問とは全く
関係ない条件出して「俺のやり方だって正しいんだ」とごねたり
するなんて以ての外だぞ
煽りは楽しいよなw ファイヤー!
質問です。 セルA1が数値かどうかを調べるにはどうしたらいいですか? また数値のとき整数かどうかを調べる方法も教えてください。
なぜ調べればすぐ見つかることを聞くのか
>906 ★5 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。 ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。
>>907 お馬鹿なんでしょ
遊ばれてる自覚のない彼と一緒でw
>>907-908 整数かどうかはInt使ってなんとかできました。
数値かどうかを教えてください。
IsNumericだと空白もTrueになってしまいます。
>>909 馬鹿ですいません
911 :
デフォルトの名無しさん :2011/09/20(火) 17:58:45.37
じゃぁLenで長さが <> 0 という条件を付け加えれば
for each を逆に進めるにはどうしたらいいですか?
その発想はなかったわ
For Step Next の -1で逆順する・・・か?
Sub 逆順() Dim a As Range Dim b As New Collection Dim c As Range Dim i As Long Set a = Range("A1:B5") For i = a.Count To 1 Step -1 b.Add a(i) Next For Each c In b MsgBox c.Value Next End Sub もちろん回り道のネタ。
for eachは逆する仕様は無いって事ですね。 ありがとうございます。 もう一つ教えて下さい。 CSVファイルの読み込みをググっていたのですが、 例として 'CSVファイル読込 i = 1 Do While Not EOF(1) '1行読み込む Line Input #ch, csvStr 'カンマ区切りで配列に格納 str = Split(csvStr, ",") 'セルのレンジを指定して、配列の値をセット Range(Cells(i, 1), Cells(i, UBound(str) + 1)) = str i = i + 1 Loop みたいなコードがよく書かれているのですが、 Range(Cells(i, 1), Cells(i, UBound(str) + 1)) = str の意味がよく分からないのです。 UBoundの意味は分かったのですが、何で此で 一気にセルに書き込み留のでしょうか もしかして一気に書き込んでる訳ではないのでしょうか?
918 :
882 :2011/09/20(火) 23:08:16.46
>>883 レス遅くなり申し訳ありません
その方法でできました!ありがとうございました
どうみても一気に書き込んでるでしょう
何故、一気に書き込む事になるのかが分からないのです。 セルに書き込む時に列の指定をfor等でループさせるなら 分かるのですが、UBoundは「引数に指定した配列の、最も大きい要素番号を返す 」 のですよね。 何故、これ Range(Cells(i, 1), Cells(i, UBound(str) + 1)) = str で、i行目の1列からi行目のスプリットされた配列数の列まで 一気に記入されるのでしょうか? そういうものだというのなら、それまでなんですが、 その説明はヘルプに載ってませんよね?
昔は高速化のためにコピペとかしてたのに いつからこんなことができるようになったのか
922 :
920 :2011/09/20(火) 23:26:15.92
読み返したら、何か噛みついてる文章みたいになってしまいました。 そんなつもりはありませんので、よろしく御願いします。
range 配列 でググッてみればいいのに
>>923 ありがとうございます。
配列=配列の考え方なんですな。
スゲー!スッキリしました。
>>892 は小学生だから許されるけどそれ以上の人間なら関数使うよ
名前のない計算より名前の付いた処理の方が保守性に優れるから
そいつに構うな 基地外だからファビョ〜ンってなるぞw
>>924 おれはなんかスッキリしないんだよね、昔から。
そんなもんだって覚えたけど。
ちょっとまて
配列=配列
それは違うぞ!
>>927 VBAばっかやってないでperlとか他の言語やるといい
>>928 > ちょっとまて
> 配列=配列
> それは違うぞ!
えっ!違うの?
RangeはRangeだよ これは特殊な例だね 個人的にはRange.Fill(arr)みたいな仕様の方が分かりやすかったかな
訂正 RangeじゃなくてRange.Value
932 :
デフォルトの名無しさん :2011/09/21(水) 10:13:34.40
VBA始めたばかりの初心者です。
上級者の道へとスキルアップするにはどうしたらいいですか?
とにかくVBAを毎日さわっていじくりまわりたい。
就職ではIT業界は経験が重要と言われるけど、それはもっともだと思う。
オレは理系で高学歴で頭がいいけど
毎日さわって経験を積まないとどうしようもないと思ってる。
でもさわろうと思ってもVBAでやるような作業がないからいつまでたっても経験は積めないまま。
本屋に並ぶ入門書のような解説じゃなくて
いろいろいじれることのできる教材、
例えばサンプルプログラムがいっぱい載ってるやつとか
http://www.amazon.co.jp/gp/product/4844326864/ の本のように実用面重視の自分の力でいろいろコードに改良を加えていけるような
そういう経験が積める教材はないですか?
>>932 そんな事言ってる時点で一生無能のまま
なんで毎日触ってないの?
普通に生活してれば仕事じゃなくてもテキスト処理とかやるだろ
こんな簡単にguiできるツールないよ
935 :
デフォルトの名無しさん :2011/09/21(水) 22:10:21.51
>>932 確かに有名だねその本。
VBAにしろ他のプログラムにしろみんな経験を基に作ってるんだよ
あんたは頭が良いんだろ?逆引きとか本読んでそんなサイトを
立ち上げろよ。
excelで処理せずすべてVBAで作ってみたら?
ピボット・グラフ・図形なんて全部覚えるだけで天才だわ。
理系で頭良いんだったらmougとかの質問にもチャレンジしたら?
経験無いんだったら擬似的に質問答えながら経験も積めるはず。
最後に本なんか人それぞれ価値観違いますねん。
リファレンス型・逆引き・プログラム作成型いろいろあるから
自分で買って実際見て考えろ!
その利口な頭脳で。
>>932 >オレは理系で高学歴で頭がいいけど
>VBA始めたばかりの初心者です。
>上級者の道へとスキルアップするにはどうしたらいいですか?
こう並べると馬鹿極まりない文になるなw
内容も本人も馬鹿丸出しだが
>>936 なんでもできると思ってるような勘違い君じゃないからいいんじゃね?
高学歴で頭がいいのはほんとかも知れないし。
得意分野以外は初心者と自覚するのは大事なことだ。
>>937 頭がいいのと勉強が出来るのは別じゃね?
頭がいい奴は他人に勉強法なんか聞かんと思う
ごく身近に凄い出来る人間がいるとかならともかく、ネットは無いわ
まぁ勉強ができる奴がプログラミングに向いているかというと、
それはまた別の話だとも思うけど
>>932 君のような強者を待ってたよ。
ここのスレで明日からルーキーとして質問に回答してくれいいい。
いい練習になるだろ
>>938 おれも勉強ができても閃きの悪い奴はプログラミングには向いてないと思ってたが
最近は努力して覚えた知識だけでなんとかなること多いような気がする。
自分で編み出す力なんかなくてもなんとかなるし。
>>940 まぁ実際何とかなるというか、要件は満たせる事は多いよね
でも自分でも「こんなんでいいのか…」と思う事も多い
さらにそれも数日もすれば「動きゃいいわ」に変遷していくがw
Googleで回答に辿りつけるキーワードを思いつく能力 2chで回答がもらえるような質問の作成能力 要件を自分のスキルで出来るとこにもってく交渉力とか ソフトウェア工学って職人が集まらなくてもある程度のものが出来あがるように する方法論だよね。 3年で使い捨てていく業務システムなんかはそんな感じが求められてるのかも
>>925 /で除算後、Intで切り捨てる
>>890 \で整数除算し切り捨て不要にする
>>892 WorksheetFunction.Floorを推す
>>925 これで三つ巴か
なら俺は
>>892 を関数化した
function Floor(n as long) as long
Floor = (n \ 5) * 5
end function
を推すぜ
WorksheetFunction.Floorか演算かは、端的にはどちらが良いとも言えないが、
演算の場合に
>>890 より
>>892 の方が優れているのは間違いない
で、
> 名前のない計算より名前の付いた処理の方が保守性に優れる
の指摘は間違ってないけど、三角関数などのメジャー所ならまだしも
プログラムに置いて"名前の付いた処理"ってのは、使うのではなく作るのが基本
なので、名前を付けて関数化してしまえば、その言語内での保守性の高さは
WorksheetFunction.Floorと変わらないし、他の言語にもそのまま移植できる
汎用性の高さは、更なる保守性の高さにも繋がる
>>932 高学歴なあなたには無縁だろうけど中小零細企業で働いて事務や管理の仕事ぶりを覗いてみるとVBAでする事はいっぱい見つかるよ。この規模の会社だとエクセルまともに使える人なんてあんまりいないのが現実だし。
VLOOKUP&MACH使う人が神扱いされてる事務所見たことあるよ。
>>940 自分で編み出したものなんていうのは大抵とっくの昔に誰かが解法を持っている。
基本はプログラミングの定石を勉強してそれをどのように応用するかだけ考えれば
殆どの場合は事足りると思う。
>>941 自分で使うだけの場合は動きゃいいでいいんだけど
業務でしかも皆で使うなんてことになると、そうはいかない。
自分以外の人間がメンテナンスすることもあるし。
そもそもトータルで手を抜きたいと思う人は「動きゃいい」なんて作りは絶対にしない。
>>943 自分で使うなら何でもいいんだよ。
何でもいいっていってもWorksheetFunctionの呼び出しは格段に遅いから俺は使わんけど。
人に使わせるときはそのFunctionは引数は整数に限るとかコメントしとくんだな。
実数だとWorksheetFunction.Floorとは返す値が全然違うからな。
ワークシート関数と同じ仕様の関数にして速度を上げるには
Function Floor(ByVal n As Double) As Long
Floor = Int(n / 5) * 5
End Function
ということになる。
引数に実数のDouble型を渡すとそもそも型の不一致になるか。
ありゃまだ間違ってるわ。 引数が1個しかないよ...orz つられて間違ったと言い訳しとく。
前回も言い訳だらけ 今回も言い訳だらけ この子、ダメだな
と最初間違った基地外が申しておるが、実は間違いなんてたいしたことじゃないんだよな。 コードの間違いは直せばいいだけのことだが、基地外は治らん。
セルに小さい順に任意の数値が入っています。 ある値を指定したときに、最も近い数字を探す方法として、 最短で探す方法を教えてください。 やはり配列に入れてループで比較ですか?
954 :
952 :2011/09/22(木) 21:06:45.01
と、思ったんですが、 配列の中央値と比較してから、 どちらかの方向に比較していけば、 半分ですみますね。 もっと良い方法あったら教えてください。
955 :
デフォルトの名無しさん :2011/09/22(木) 21:17:36.50
>>954 > と、思ったんですが、
> 配列の中央値と比較してから、
> どちらかの方向に比較していけば、
> 半分ですみますね。
>
これを繰り返せばよいです、はい
956 :
952 :2011/09/22(木) 21:26:44.67
>>955 なるほど。ありがとうございます。
ちなみに、指定する値を比例して増幅させる
(任意の数値が0.0〜10000.0の範囲、指定値が0から5刻みで単調増加)
で結果を出したいのですが、更に短縮する方法を探しています。
感覚的には解法がありそうなのですが・・・ヒントあったら教えてください。
よろしくおねがいします。
つ VLOOKUP
>>956 キーワードを挙げると、
>>954 は"二分探索法"と言うアルゴリズムですね。
そこから発展して"バランス木"というデータ構造もあります。
リレーショナルデータベースには必要不可欠なものです。
一定の数ごとにそれを超えるのはどこかを最初に配列に入れとく さらにそこから一定の数ごとに(ry よっぽど膨大なデータじゃなければ普通にループ
現行バージョンのExcelは最大行数が1048576
普通に二分探索でやると最悪19回の比較で答えが出るけど、もっと短縮したいってこと?
>>957 の言うとおり、下手なこと考えるよりWorksheetFunctionが一番早かったりして
961 :
デフォルトの名無しさん :2011/09/23(金) 10:21:15.71
ヘタなコード書いてバグ埋め込むよりはWorksheetFunctionの方がよっぽどいいよ
そもそも近い数字って10に近いものが9と11だったらどっちが欲しいのよ? 検索する側とされる側のデータ量や間隔にもよるが、お互いにのぼり順のデータならそれなりのマッチングアルゴリズムが昔からあるだろう。 データによっては二分探索を使ってもいいだろうが、最初の中央値はそれまでに見つかった位置より後ろの中央にもっていかないとな。 常に同じ中央値では無駄だろう。 ってかこの質問した人っていつも暴れまわってるやつじゃねーのか?
Excelのえのじも知らない者だが… 図and/or表ってなに? Excelのなにかだということしかわからな
「Excelのなにかだ」というのがそもそも間違い つまりスレ違いなんですが・・・
スレチのすの字も知らないらしい
だなw 例えExcelのなにかだとしても、ここではなくBソフ板かPC初心者板のスレの方へ行くべき内容 スレ違い甚だしいにも程があるって話だw
国語/論理学もあやしい
968 :
デフォルトの名無しさん :2011/09/23(金) 23:41:25.06
Setって実体コピーでしょうか? 例えば Dim selections as Range Dim c as Range selections = Selection とやると、選択セルが変わったときに、cも一緒に新しい選択されたセルを見てしまいますか? そして、 Set selections = Selection とやると、今の選択範囲がselectionsにコピーされ、新しくどこか違う場所を選択してもselectionsに影響は無い、 と考えていいのですか? それともSetはぜんぜん違う目的のものですか?
969 :
デフォルトの名無しさん :2011/09/24(土) 00:10:16.28
strCell = "A1" Set r = Range(strCell) でrはA1を指してるとします。 ここでA1の”A”っていうのを文字列で取りたいです ”AX1”なら”AX”を取りたい どうしたらいいですか?
>>968 後者はRange.Selectしてもselectionsの範囲が変わることはないです
前者は仕様上できません
前者後者共に動かせばすぐ分かることでしょう?
なぜ動かさないで質問したんですか?
>>968 実体のコピーではなく実体への参照
しかしSelectionはオブジェクトではなくRange型を返すプロパティなので
=Selectionによって参照代入されるのはSelectionそのものではなく
Selectionが返したRangeオブジェクト
よって、参照代入後に選択セルが変更されても、selections変数には影響ない
>>969 r.Row
>>969 他にもやりようがあるかもだけど とりあえず
Adr_Str = r.Address(True, False)
Col_Str = Left(Adr_Str, InStr(Adr_Str, "$") - 1)
Debug.Print Col_Str
>>970 ありがとうございます。
動かしてその結果だけで判断って危険じゃないですか?w
なので聞いてます。
前者は文法的にダメってことでこちらは失礼しました。
勘違いで出来ると思って書いちゃいました
>>971 >=Selectionによって参照代入されるのはSelectionそのものではなく
>Selectionが返したRangeオブジェクト
それはちょっとちがう
オブジェクトに対して(Setなしの)=で代入、参照されるのはそれぞれの既定のプロパティの値
Rangeの規定のプロパティはちょっとややこしいが、この場合はValueだと思って良い
Dim c As Range
Set c = Sheet1.Range("A1")
Range("B1").Select
c = Selection 'これはc.Value = Selection.Value
これでB1セルのValueがA1セルのValueに代入されるが、cはずっとA1を指したまま
>>973 前者も文法的には問題ないぞ。事実コンパイルは通るだろ
>>968 でselections = Selection が実行時にエラーになるのは、
selectionsの既定のプロパティに値を代入しようとしたんだが、
selectionsは有効なRangeオブジェクトを指して無かったからだ
動かしてその結果から判断するのは、場合によっては必要だが
動かしてその結果「だけ」で判断するのは危険
>>975 つまりDim selections as Range
ってやっただけではselectionsはC言語でいうところの、未初期化のポインタで、
Range ** pRange = NULL;
Range rng;
*pRange = &rng;
みたいな事で、
Setを使うと
Range ** pRange = NULL;
Range rng;
pRange = (Range *)malloc(sizeof(Range));
*pRange = &rng;
みたいなことなんですかね。
>>974 「代入」ではなく「参照代入」ってのはSetを付けた場合の話だから
「ちょっとちがう」というのは不適切
>>971 は参照代入における正解で、
>>974 は代入における正解だから
「ちょっとちがう」という反論ではなく、「
>>971 は参照代入の話だが、代入の場合は〜」と
補足する形を取るのが本当の正解
SelectとActivateの区別が付きません。 画面に表示するのがSelectで オブジェクト操作の対象として選択することが Activateなのでしょうか。 その両方を実現したい時はSelectした後Activate する必要があるのでしょうか。
>>977 参照代入って単語は初めて聞いた
VBA "参照代入" でぐぐると 約 791 件 (0.11 秒)
少なくともVBAでは一般的に通用する用語ではないと思われ
山椒大夫なら知ってる。
A1のセルに入力している最中の文字列を リアルタイムにフォームのテキストボックスに表示する方法を教えて頂けないでしょうか? 使用環境は エクセル2002 OS XP です
ワークシートチェンジ
983 :
981 :2011/09/24(土) 21:05:33.64
>>982 すみません
表現が間違っていたかもしれません
セルに値を入力してエンターを押して変更が確定した後ではなく
確定する前の現在入力中の文字列を取得して
テキストボックスに表示したいのです
APIなどを利用すれば可能なのかもしれませんが
具体的な方法がわからないのです
どなたかよろしくお願いします
984 :
952 :2011/09/24(土) 22:58:52.05
亀だすが、ありがとうございました。 試してみたいと思います。
985 :
332 :2011/09/25(日) 00:58:06.50
>>983 半角英数だけならgetasynckeystateでやればよくね
名前ミスだから気にしなくて良いです
入力をフックして取得するってのは、対象がExcelでも ExcelVBAの分野ではないから、とりあえずスレ違いだね まあ具体的な方法とか聴く前に、自分こそ具体的に何がしたくて そういう動作を求めているのかを書けば、VBA分野で別な方法が あるかもしれないけどね
入力中ならフックするしかなくね
セルが見えてるなら画面キャプチャーするという手も 普通はやらないけど
次スレよろ
991 :
デフォルトの名無しさん :2011/09/25(日) 15:21:28.35
992 :
デフォルトの名無しさん :2011/09/25(日) 15:30:43.80
セルをコピーしてjpgで出力ってできないの?
できないことない
>>992 「図としてコピー」というコマンドで任意のセル範囲を図形としてコピーできる
あとはそのコピーされた図形を頑張ってjpg保存とかすればいいと思う
996 :
デフォルトの名無しさん :2011/09/25(日) 16:15:15.22
ここでいいかな? |::::::::::::::: ∧_∧:::::::::::: __ (´・ω・`) :::::::: すみません、ここでうんこしていいですか? ◎ー) / \::::::::: | | (⌒) (⌒二 ):::::::::::: ~~~ /⌒ヽ( ̄、 ヽ___ / Lヽ \ノ___ ゙ー―――(__)---
梅
梅干
999
終わり
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。