1 名前:デフォルトの名無しさん [2007/05/27(日) 00:06:58 ] ・まじめにExcelの機能を追及してみようと思う奇特なひと ・スキルがないのに無理やりVBAの仕事を押し付けられた普通のひと ・VBAなんていまさらやりたくないのに業務で仕方なく使っているひと ・とにかく漏れにこんな仕事まわすなと怒っているひと そんなM$大好きなひとからアンチM$なひとたちまで幅広くカバーするスレです 前スレ pc11.2ch.net/test/read.cgi/tech/1168308855/
358 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 01:17:06 ] >>357 ↓を付け足す Function Text(a, b) Text = Format(a, b) End Function
359 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 01:25:40 ] >>358 できました。 すばやい、レスありがとうございました。
360 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 01:34:50 ] 超初心者の質問で申し訳ないです。。 VBAを使って、画面に表示された方向キー(↑↓←→)を押して、1分間にどれだけ成功できるか・・・ のような感じのゲームを作ることはできないものでしょうか? 頭の中でふと浮かんだのですが、プログラムを組もうとすると進めなくて困っています。 もしわかる方おりましたら、可能か不可能かだけでも結構ですので教えてくださいm(_ _)m
361 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 01:42:30 ] >>360 cgi30.plala.or.jp/chikada/vba/acd.shtml
362 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 01:48:41 ] >>361 誘導ありがとうございます。 スレ違いでした。失礼しました。
363 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 11:57:18 ] >>361 スレチだが、そこのCell雀の完成度の高さにびっくりした。
364 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 22:35:57 ] ExcelとVBAでマインスイーパー作ったりできますか
365 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 22:39:42 ] やる気と根気があればできるはず がんばれ
366 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 23:20:05 ] 暇で作った事あるけど同等のゲームならすぐ出来るよ。 UIまでコピーしようと思うとそれなりに大変だろうけど。
367 名前:デフォルトの名無しさん [2007/07/11(水) 00:10:18 ] >>339 excelをそのまま基幹で使う会社 なぞ、どうぞ逝ってくれ
368 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 18:47:02 ] medianをVBAで使ってたら特定の数列で無限ループしやがるorz しかも同じ数列単体で検証しても問題なし しょうがないからロジックくんだがこんな経験したことある人いる? XPでも2003でも再現した 数列ったってこんなんだぞ。0, 0, 0.6, 0
369 名前:デフォルトの名無しさん [2007/07/11(水) 21:55:59 ] 携帯から失礼します。 VBAはユーザーフォームを勉強し始めたレベルなのですが Win32 API の存在を知り、エラー音とかに使ってみたくなりました。 具体的にどのように記述すれば良いでしょう? ご教授いただけますか?
370 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 22:31:45 ] >>369 スレ違いもここまで来るか… pc11.2ch.net/test/read.cgi/tech/1181645965/ 嫌味ではなくVBAを勉強し始めたレベルでは意味不明だと思われ。 ざっと教授するだけで数百ページの本になる。
371 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 22:48:02 ] mciくらいならVBAでもすぐできるだろうに
372 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 23:10:39 ] ハマりました〜どなたか助けてください〜(´Д`;) 開発環境: Windows 2000, Excel 2000 要件: ダイアログ(フォーム)を使い、フォルダ名で、または新しいファイル名で、 後に使うファイル保存先パスを取得、変数に格納しておきたい。 追加事項: 保存先を指定してパスを取得するだけで、その時点ではファイルを開かない。 そこで、DialogオブジェクトやFileDialogについて調べているのですが… ・今一般的で情報の多いApplication.FileDialogは、2000にはないっぽい。 ・MSDNでは、Dialogオブジェクトについての説明が極端に少ないっぽい。 ・xlOpenFileでは、実現できないっぽい。xl〜定数は使えたり使えなかったり。 等などで、どっぷりハマッてしまいました。 タスケテー
373 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 23:28:36 ] >>372 ちょっと邪道だけどこんなのでどうかな? 動いたらBrowseForFolderのオプションは調べてくれ。 Dim Shell Dim Ret Set Shell = CreateObject("Shell.Application") Set Ret = Shell.BrowseForFolder(0, "選ばないか", 0) If Not Ret Is Nothing Then Debug.Print Ret.Items.Item.Path End If
374 名前:デフォルトの名無しさん mailto:sage [2007/07/12(木) 11:54:13 ] ごめん 範囲Aと範囲Bの重なっているセルの取得って どうやるんだっけ? プロパティかなんかであった気がしたんだけど ヘルプ見てもみつからなかった(´・ω・`)
375 名前:デフォルトの名無しさん mailto:sage [2007/07/12(木) 13:22:36 ] >>374 Intersect(範囲A,範囲B)
376 名前:374 mailto:sage [2007/07/12(木) 13:38:04 ] >>375 おぉありがとん(`・ω・´)
377 名前:デフォルトの名無しさん mailto:sage [2007/07/12(木) 22:58:16 ] >>373 遅ればせながらレスありがd(・∀・) なんか、GetSaveAsFileNameっていうまんま直球どストレートな メソッド発見しますた〜お騒がせしました〜
378 名前:デフォルトの名無しさん [2007/07/12(木) 23:35:57 ] Sub Bound() ActiveSheet.UsedRange.Clear Columns("A:AO").ColumnWidth = 2 n = 1 Range("A1").Select Do While IsEmpty(ActiveCell.Offset(n, 0)) x = ActiveCell.Offset(n, 0).Row If x < 2 Or 30 < x Then n = -n For chien = 1 To 30 ActiveCell = "" ActiveCell.Offset(n, 0) = "○" Next chien ActiveCell.Offset(n, 0).Activate Loop End Sub 上下運動を2回繰り返して止めるにはどうしたらよいでしょうか? ご教授願います。
379 名前:デフォルトの名無しさん [2007/07/13(金) 00:11:06 ] exit do
380 名前:デフォルトの名無しさん [2007/07/13(金) 00:36:18 ] 378です。 どういう風に入れたら良いでしょうか? すみません、宜しくお願いいたします。
381 名前:デフォルトの名無しさん mailto:sage [2007/07/13(金) 02:19:26 ] >>378 なにげに試したら楽しくなってきたので俺も適当に作ってみた 'API Private Declare Sub Sleep Lib "KERNEL32.dll" (ByVal dwMilliseconds As Long) Const UpperBound As Long = 2 '1以下はエラー Const LowerBound As Long = 30 Const SleepTime As Long = 50 Const ico As String = "○" 'バウンドさせる文字 Const Col As Long = 1 '列(この辺は定数にしない方が斜めとかいけるから指定しない方が良さげ) Private Sub Down(ByVal Speed As Long) Dim r As Long For r = UpperBound To LowerBound Cells(r - 1, Col) = "" Cells(r, Col) = ico DoEvents Sleep SleepTime + Speed Next End Sub Private Sub Up(ByVal Speed As Long) Dim r As Long For r = LowerBound To UpperBound Step -1 Cells(r + 1, 1) = "" Cells(r, Col) = ico DoEvents Sleep SleepTime + Speed Next End Sub
382 名前:381の続き mailto:sage [2007/07/13(金) 02:33:11 ] Private Sub bound2() Dim BoundCount As Long For BoundCount = 1 To 10 Down -(BoundCount * 4) 'Downで表示されっばなのを削除 Cells(LowerBound, Col) = "" Up -(BoundCount * 4) 'Downで表示されっばなのを削除 Cells(UpperBound, Col) = "" Next End Sub updownの引数で加速と減速可能にっ! この調子でいけばブロック崩しとかできんのかね? で、378の質問に全く答えない俺w なんてのは可愛そうなんで、 >>380 上下した時に「1回上下したとカウント」して カウントが2になったらExit Doすればok どこで1回上下したかを判断する場所は 自分でコード組んだならわかるっしょ?
383 名前:デフォルトの名無しさん [2007/07/13(金) 09:46:41 ] >>381 さん・・・ >378です。 学校の課題で・・・ for nextを使用して動いたマス目で2回動いた事にしていたのですが、 それでは不十分と言う事で・・・(TT) 試行錯誤して早7日目・・・ どうしようもなく、皆様にお知恵を拝借しようとした次第です。 宜しければ教えて下さいませ。
384 名前:デフォルトの名無しさん [2007/07/13(金) 10:30:54 ] 不十分の意味がわからない、どうしたいんだ
385 名前:デフォルトの名無しさん mailto:sage [2007/07/13(金) 11:28:40 ] >>383 >If x < 2 Or 30 < x Then n = -n 反転の判定をしている、ここで処理してもらいたかったんじゃないのか?
386 名前:384 [2007/07/13(金) 14:36:56 ] 俺は>>381 じゃないが、そういうことならこれで If x < 2 Or 30 < x Then n = -n: i = i + 1 If i > 3 Then Exit Do
387 名前:デフォルトの名無しさん [2007/07/13(金) 20:01:34 ] 会社での昼休み、 ウイルスバスターが動いててすごく重いけど、 どうしても直したいマクロがあって、開いていじってた。 PCがフリーズした。 PCの電源を切って再起動したら、マクロもろともExcelファイルが破損してた。 「アプリケーションの回復」でも回復できない、深刻な破損との事。修復不可能。 こういう時に限ってバックアップとってない。 マクロもエクスポートしてない。 仕方ないので、いちから作り直した。 バックアップは、きちんと取りましょうという教訓でした…
388 名前:デフォルトの名無しさん mailto:sage [2007/07/13(金) 21:53:28 ] 教訓というか初心者以外では常識だよね というか、うちでは世代別バックアップを取るマクロをExcel起動と同時に自動で回しっぱなし \backup\yyyy_mm_dd\FileName\[yyyy_mm_dd-hh_mm__ss]FileName.xls にバックアップが自動保存され、前日以前の物があれば日付単位で個別圧縮(cab)して 退避ディレクトリにコピー、更に1週間以上前の物は退避ディレクトリの書庫は残して バックアップディレクトリのファイルは削除 ここまでは自動で、退避ディレクトリの書庫を定期的にメディアに焼くのだけは手動 まあメディアに焼いたところで、トラブル時もHDD上の1週間分だけで復旧は事足りることがほとんどだけどね
389 名前:デフォルトの名無しさん mailto:sage [2007/07/13(金) 21:55:37 ] FolderShareをつかって他のパソコンと同期させておくだけでも最低限のバックアップにはなると思う。
390 名前:デフォルトの名無しさん mailto:sage [2007/07/13(金) 22:24:26 ] 俺はソフトで差分バックアップしてる 重要なデータExcelだけじゃないし楽だし早い
391 名前:デフォルトの名無しさん [2007/07/13(金) 23:27:17 ] >>381 さん >>386 さん >378です。 ご教授頂き有難うございます。 >>386 さんのを使用して出させて頂きました。 有難うございました!
392 名前:デフォルトの名無しさん mailto:sage [2007/07/14(土) 09:54:31 ] >>390 外部からだと作業の途中経過のバックアップは取れないからな 問題が起きたときに前回保存時まで戻されるのは勘弁してほしいってデータは 外部の汎用バックアップソフトではなく、内部のマクロで途中経過のバックアップを取った方がいい
393 名前:デフォルトの名無しさん mailto:sage [2007/07/14(土) 12:56:32 ] バックアップとは言え、マクロ動かしっぱなしにしてたらメモリ食わない?
394 名前:デフォルトの名無しさん mailto:sage [2007/07/14(土) 13:32:56 ] >>392 俺の使ってるソフト、圧縮機能はない www.forest.impress.co.jp/lib/sys/file/syncbackup/bunbackup.html 開いているファイルでもバックアップできるし作業途中で保存していればその分更新される Officeのように自動保存機能があるソフトならより万全 途中経過が保存される前にPC固まったら駄目だけど、そのマクロも同じだろ?
395 名前:デフォルトの名無しさん mailto:sage [2007/07/14(土) 18:04:44 ] >>393 当然食うよ 搭載メモリ量の10000分の1以下だから気にならないけどね >>394 マクロの場合 > 作業途中で保存していれば なんて条件は付かない 保存もマクロでやるからね Officeの自動保存機能はバグあるし
396 名前:デフォルトの名無しさん mailto:sage [2007/07/15(日) 10:15:02 ] VBA画面だとスクロールボタンが使えなくて不便だな。 ぐぐったら「Intelipoint 4.1を入れると直る」と出てきたけど、 うちのMicrosoftマウスはこのバージョンに対応してないしな。
397 名前:デフォルトの名無しさん [2007/07/16(月) 12:01:06 ] Excel2000のVBAプログラミングでウィザード形式のユーザーフォームって つくれますか? StarSuiteのBasicにはその仕様があるのですが、 VBAに関してはググってもなかなか直に解説してあるページがみつからなくて。 現在、同じサイズのユーザーフォームをいくつか用意してそれを順番に表示させる ことで「ウィザードもどき」にしているんですが・・・・
398 名前:デフォルトの名無しさん mailto:sage [2007/07/16(月) 20:33:23 ] >>397 コンテナになるコントロール使えば良いだけの話 これで解らなければあとはVBAではなくVBの分野なので そっちの方向で勉強してね
399 名前:デフォルトの名無しさん mailto:sage [2007/07/17(火) 00:11:19 ] >>398 どうも有難うございます。調べてみます。
400 名前:デフォルトの名無しさん mailto:sage [2007/07/17(火) 10:11:14 ] 学校の課題で、セルA1〜A10 にそれぞれ10,20,30……100と表示し、その和をB1に表示するプログラムを作成せよ。 という課題が出て、試行錯誤してたのですが、詰まってしまいました。 ヒントとして、↓が出ていて、その通りにやったつもりなのですが、セルA1〜A10にはゼロしか出てこなくてorz 1.次元数10の配列を宣言し、Forループを利用して数値(10~100)を作成する。 2.Forループを利用して和を計算する 3.Forループを利用して数値(10〜100)を表示する。 4.和を表示する。 ↓がいま現在のプログラムです。 Sub 課題1() Const N = 10 Dim A(N) For T = 1 To 10 A(N) = A(T) * 10 Next T S = 0 For j = 1 To N S = S + A(j) Next j For C = 1 To 10 Cells(C, 1) = A(N) Next End Sub どなたかご教授願います。
401 名前:A(T) * 10じゃなくてT * 10 mailto:sage [2007/07/17(火) 10:40:03 ] >>400 それのどこがVBAの質問なのかと。basicの基本以下のレベルジャマイカ。
402 名前:デフォルトの名無しさん mailto:sage [2007/07/17(火) 11:21:45 ] >>400 debug.printから出直せ。その方が君の為だ。
403 名前:>>401 それを指摘するならA(T) = T * 10だな mailto:sage [2007/07/17(火) 11:27:02 ] >>400 ループ制御変数と個数の定数が混在しているぞ。
404 名前:デフォルトの名無しさん [2007/07/17(火) 14:52:21 ] 最近の学校の課題はエクセルVBAをやらせるのか…。 >セルA1〜A10にはゼロしか出てこなくてorz ↑当たり前だ。403の名前欄を参照。 >Cells(C, 1) = A(N) ↑全部のセルに同じ値が出るに決まってるだろ。 まさかプログラマを目指してるとか言わないよな?
405 名前:400 mailto:sage [2007/07/17(火) 18:14:05 ] 400です。皆さんのレスを参考に17:00から試行錯誤し直してやっと完成したので報告します。 下のプログラムで表示させることができました。本当、ありがとうございました。 Sub 課題1() Const N = 10 Dim A(N) For T = 1 To 10 A(T) = T * 10 Next T S = 0 For j = 1 To N S = S + A(j) Cells(j, 1) = A(j) Next j S = 0 For c = 1 To N S = S + A(c) Cells(1, 2) = S Next c End Sub
406 名前:デフォルトの名無しさん mailto:sage [2007/07/17(火) 18:19:26 ] Dim a(10) For i = 1 To 10 a(i - 1) = i * 10 Next s = a(0) For i = 2 To 10 s = a(i - 1) + s Next For i = 1 To 10 Range("A" & CStr(i)) = a(i - 1) Next Range("B1").Value = s
407 名前:デフォルトの名無しさん mailto:sage [2007/07/18(水) 09:54:41 ] >>405 どう見てもこの後ループを纏めることになるので、先回りしておけ。
408 名前:デフォルトの名無しさん mailto:sage [2007/07/18(水) 13:21:11 ] 開いていないファイルのセルデータをVBAで直接取得する方法ってありますか? 現状はセルに式を入力してから変数に代入、セルを削除 または該当ファイルを開いて取得、ファイルを閉じるみたいな感じです
409 名前:デフォルトの名無しさん [2007/07/18(水) 13:27:58 ] バイナリ解析して直接描くならひらかずにどうぞ
410 名前:デフォルトの名無しさん mailto:sage [2007/07/18(水) 13:44:57 ] >>408 そのファイルがCSVならそれほど難しくないでしょう。
411 名前:408 mailto:sage [2007/07/18(水) 14:12:48 ] >>409 難しくて私には分かりません >>410 ファイルはCSVではなくEXCELブック形式です ファイルを開けば A = Workbooks(ファイル名).Sheets(シート名).Range(範囲) で取得できるのでどこかを少し弄ればどうにかなるのかなと思ったんですけど・・・
412 名前:デフォルトの名無しさん mailto:sage [2007/07/18(水) 14:21:39 ] 内部的に開いていいなら(表示はしない)簡単だけど、全く開かずとなると無理っす バイナリ解析するにも先ずはファイルをOpenしないと始まらないし
413 名前:デフォルトの名無しさん mailto:sage [2007/07/18(水) 16:03:15 ] >>412 どうやら無理そうですね 開かずに済むセルに入力して・・・ の方法で処理しようと思います ありがとうございました
414 名前:デフォルトの名無しさん mailto:sage [2007/07/18(水) 18:48:05 ] >>408 VBAじゃないけど参照で良ければ。 ='c:\Documents and Settings\hoge\My Documents\[book1.xls]Sheet1'!a1 とか
415 名前:デフォルトの名無しさん mailto:sage [2007/07/18(水) 20:21:15 ] >>413 VBA以前のExcel4マクロ(だっけ)なら簡単にできるはず。 Excelの関数と同じくVBAから使用することも可能 ヘルプは英語版ならMSから無料で落とせる。
416 名前:デフォルトの名無しさん mailto:sage [2007/07/18(水) 20:29:52 ] とりあえずサンプル見つけたので>Excel4マクロ Cells(1, 1) = Application.ExecuteExcel4Macro("'C:\My Documents\[Book2.xls]Sheet1'!R1C1") ttp://oshiete1.goo.ne.jp/qa373903.html
417 名前:デフォルトの名無しさん mailto:sage [2007/07/18(水) 21:21:50 ] そのExecuteExcel4Macro使う方法が>>412 も言ってる > 内部的に開いていいなら(表示はしない)簡単だけど の方法でしょ。でも、これだって開いてないわけではないので、この方法では嫌なんだとさ。 内部的に開いて良いなら他にもいくつか方法はあるんだけどね。 因みにExecuteExcel4Macroを使ってセルの値を取得する方法は かなり有名で解説サイトはいっぱいあるから英語版ヘルプなんて必要無いが 空セルを取得すると空文字やEmpty値ではなく0が返ってくるという不都合がある。 つまり、数値の0が入ってるセルと何も入ってないセルを区別出来ない。
418 名前:デフォルトの名無しさん [2007/07/18(水) 22:05:36 ] 皆さん、MSOfficeのスキル高そうですけど、関係する資格などはお持ちですか? 私の勤める会社は、持っている資格を全て棚卸して一覧にまとめよ、なんて御触れが出ました。 ひけらかしたい奴は全部書くし、変なプロジェクトに引っ張られたくない人は応分に隠し、 こんなに資格もってんならウチにいなくてもなんとかなるだろう、とリストラの対象になりたくない人は適当に描いていました。 スキルを保有するのはいいが、ヘタに見せると悪影響があるなんて、初めて知った2007年の夏でした。
419 名前:デフォルトの名無しさん mailto:sage [2007/07/18(水) 22:11:08 ] >>417 > この方法では嫌なんだとさ。 たぶん内部的に開くの意味よくわかってないだけだと思うが >または該当ファイルを開いて取得、ファイルを閉じるみたいな感じです これが嫌なんだろう
420 名前:デフォルトの名無しさん mailto:sage [2007/07/19(木) 00:00:30 ] VBAで配列の宣言時に初期化ってできないのですか? 下のようにできると聞いたのですが、実際やってみると「=」が駄目なのか コンパイルエラーになってしまいます。 Dim Moji() As String = {"ABC", "DEF", "GHI"}
421 名前:デフォルトの名無しさん mailto:sage [2007/07/19(木) 00:37:15 ] VBならできるけどVBAは駄目です
422 名前:デフォルトの名無しさん mailto:sage [2007/07/19(木) 11:03:09 ] そんなことはない
423 名前:デフォルトの名無しさん mailto:sage [2007/07/19(木) 11:06:18 ] 正確にはVBの2002以降ね VBでもVB6では出来ないし、当然VB6準拠のVBAでも出来ない VB6で出来ることはコントロールと特殊なオブジェクト絡み以外ほとんどVBAでも出来るから問題ないが VB2002で大きく変わったので、VB2002以降用の解説読んでそれをVB6やVBAでやろうとして 出来なくて混乱しちゃう奴って結構居るみたいだね
424 名前:デフォルトの名無しさん mailto:sage [2007/07/19(木) 11:13:42 ] Dim Moji() As Array("ABC", "DEF", "GHI")
425 名前:デフォルトの名無しさん[ mailto:sage [2007/07/19(木) 21:44:55 ] VB6でもArray使えば、配列の初期化できるのか。でも、多次元は無理なのかな
426 名前:デフォルトの名無しさん mailto:sage [2007/07/19(木) 22:25:34 ] VBAでSub プロシージャでは値渡しも参照渡しもできるのですが Func プロシージャでは値渡ししかできません。参照渡しのやり方ってどうやるのでしょうか。
427 名前:デフォルトの名無しさん [2007/07/19(木) 23:29:02 ] ByVal?
428 名前:デフォルトの名無しさん [2007/07/19(木) 23:29:40 ] ごめんちがた
429 名前:デフォルトの名無しさん mailto:sage [2007/07/20(金) 00:00:33 ] >>426 普通にできるだろ
430 名前:426 mailto:sage [2007/07/20(金) 00:25:26 ] ↓こんな感じの作ってやってみたけど、表示されるのは"A" ちなみにFunction→Subに変えたらちゃんと"B"が表示されます。 使い方がまずいのでしょうか? Sub test() Dim tmp As String tmp = "A" func1 (tmp) MsgBox tmp End Sub Function func1(ByRef tmp As String) tmp = "B" End Function
431 名前:デフォルトの名無しさん mailto:sage [2007/07/20(金) 00:31:45 ] Sub test() Dim tmp As String tmp = "A" c=func1(tmp) MsgBox tmp End Sub Function func1(ByRef tmp As String) tmp = "B" End Function
432 名前:426 mailto:sage [2007/07/20(金) 00:45:38 ] >431氏の通りにしたらできました。 式にしないと駄目ということなんですかね。
433 名前:デフォルトの名無しさん mailto:sage [2007/07/20(金) 00:46:22 ] func1 tmp
434 名前:429 mailto:sage [2007/07/20(金) 00:47:32 ] >>430 136 デフォルトの名無しさん mail:sage 2007/02/02(金) 00:10:24 > VBAは自分で作った関数を使う際、 > 引数にかっこをつけてはいかんのです。 ハズレ 自作関数の場合ではなく、基本的にSub、Functionプロシージャ(メソッド)を呼ぶ場合、 戻り値を取る場合とCallで呼ぶ場合以外は()を付けない。MsgBox関数の場合だとこんな感じで使う。 [1] MsgBox "test", vbOkOnly [2] Call MsgBox("test", vbOkOnly) [3] ret = MsgBox("test", vbOKCancel) 自作関数の場合でも戻り値を取る場合とCallで呼ぶ場合は()付けなきゃダメだし 自作関数じゃなくても、[1]のように使うときは()付けてはいかんのです。 ややこしいのは、引数一つの関数の場合。 [4] Inc hoge [5] Inc (hoge) Sub Inc(Value As Long) Value = Value + 1 End Sub [4]の方だと変数hogeが+1され、[5]の方だと変化しない。 引数一つの関数をCallを省略し引数に()を付けて呼ぶと、引数は値渡しになる。 基本的に参照渡し値渡しは呼び出される側で指定するので、[5]は殆ど使われない。 意味も知らずに間違って使ってる奴は居そうだけどな。。
435 名前:デフォルトの名無しさん mailto:sage [2007/07/20(金) 01:12:19 ] 回答ありがとうございます。 VB独特の仕様なんで覚えるしかないみたいですね。 また間違えそう・・・
436 名前:デフォルトの名無しさん mailto:sage [2007/07/20(金) 01:20:28 ] func(tmp) func (tmp) とは違うだろ 下はc=func((tmp)) のようなもの 上のような書き方は存在しない
437 名前:デフォルトの名無しさん mailto:sage [2007/07/20(金) 02:51:18 ] >>430 引数に何もしなければ参照渡し ()でくくると値渡し Sub test() Dim tmp As String tmp = "A" func1 tmp MsgBox tmp End Sub Function func1(tmp As String) tmp = "B" End Function
438 名前:デフォルトの名無しさん mailto:sage [2007/07/20(金) 06:55:09 ] つまり、外せる括弧は外せと言うことだな。
439 名前:デフォルトの名無しさん mailto:sage [2007/07/20(金) 17:44:58 ] func1 -tmp としたら誰もtmpで値が受け取れるとは思わないだろ 同じことだよ
440 名前:デフォルトの名無しさん mailto:sage [2007/07/21(土) 18:13:02 ] つまり、外せる演算子は外せと言うことだな。
441 名前:デフォルトの名無しさん mailto:sage [2007/07/22(日) 01:49:28 ] エクセルの処理を一瞬だけ止める命令ってどんなのがありますか? 調べたところ、waitを使って、現在時間を調べてそこから1秒待ちをする、などは分ったのですが、 私がやりたいのは、コンマ1秒だけ処理を止めるというものをやりたいんです。 ですが、いまいちコンマ何秒だけ処理を一時停止させるという方法が分かりません。 初歩的な質問で申し訳ないのですが、教えていただけないでしょうか。
442 名前:デフォルトの名無しさん mailto:sage [2007/07/22(日) 02:44:42 ] >>441 Win32APIのSleep使えばいいだけだよ _秒指定なので、コンマ1秒なら100_秒指定で
443 名前:441 mailto:sage [2007/07/22(日) 07:24:57 ] 解決しました。ありがとうございます。
444 名前:デフォルトの名無しさん mailto:sage [2007/07/22(日) 12:21:00 ] 444
445 名前:初心者☆ [2007/07/22(日) 16:04:23 ] DataAdd関数のところで 「コンパイルエラー: SubまたはFunctionが定義されておりません」 と出るのですが、なぜエラーになるのかがわかりません。 わかる方おしえてください。 ちなみに、 DataAdd("d", data_length, Now) みたいなカンジで使ってます。
446 名前:デフォルトの名無しさん mailto:sage [2007/07/22(日) 16:50:00 ] そんな関数あるのか?
447 名前:デフォルトの名無しさん [2007/07/22(日) 16:56:25 ] >>445 クリティカルで答えを言ってやる。おまいさんが参考している本が分かった DataAdd × DateAdd ○ こういうこった
448 名前:デフォルトの名無しさん mailto:sage [2007/07/22(日) 17:10:15 ] 教えて下さい。 10品目 月の入荷から各個人に日々の払い出しを行い。 入荷数から払い出しを引いた在庫数がわかるようなマクロはどうすればいいでしょうか? シートを分けたいです。
449 名前:デフォルトの名無しさん mailto:sage [2007/07/22(日) 19:24:12 ] エスパーじゃない普通の人間に判るように書け。
450 名前:デフォルトの名無しさん [2007/07/23(月) 14:55:39 ] VLOOKUPで検索して参照している値を変更したいのですが どうやったらいいのでしょう? ------------- 1 AAA 2 BBB 3 CCC 4 DDD ------------- 3 CCC ↑ 3って入力すると右にCCCって出てくる そのCCCをXXXって変えると元のデータのが 1 AAA 2 BBB 3 XXX 4 DDD ってなるようにしたいです。VBA使わないと出来ないですかね? なるべくExcel関数だけで作りたいのですが・・・
451 名前:デフォルトの名無しさん mailto:sage [2007/07/23(月) 19:12:45 ] >>450 ここはVBAでやりたい人の為のスレだよ まあExcelの本スレにも書かれている通り、関数では値の書き換えは出来ないので どっちにしろVBAでやるしかないけどね
452 名前:デフォルトの名無しさん mailto:sage [2007/07/23(月) 20:51:08 ] このスレ初めて見つけたときエクセルとVBAの質問スレだと思った。 スレタイいじったほうがいいんじゃないスかね
453 名前:デフォルトの名無しさん mailto:sage [2007/07/23(月) 20:58:14 ] 板見りゃわかるっちゃわかるけど、スレタイだけ見るとそうだね。
454 名前:デフォルトの名無しさん mailto:sage [2007/07/23(月) 21:53:41 ] まあExcelでプログラム技術系の話と言ったらVBAしか無いもんな
455 名前:デフォルトの名無しさん[ mailto:sage [2007/07/23(月) 22:05:50 ] バイナリファイルを作るマクロ作成したんですが 常に新規作成で作ることできますか? Open "ファイル名" For Binary As #1 ↑こんな感じで最初やってみたんですが、新規ファイルがある場合でも 単純に頭から上書きするみたいで困っています。
456 名前:デフォルトの名無しさん mailto:sage [2007/07/23(月) 22:49:33 ] kill
457 名前:デフォルトの名無しさん mailto:sage [2007/07/23(月) 23:12:51 ] >>454 いやいやExcelとプログラムを絡めるだけなら、 オートメーションで他言語から操作するなんてこともあるぞ。 まあその言語特有の事情を除けば、VBAでやるのと何も変わらないが。
458 名前:デフォルトの名無しさん [2007/07/23(月) 23:36:53 ] UserFormのUserForm_Initializeで変数と画面の 初期化をしていますが、ここのロジックを通ってUseeFormが 表示されたあと、画面をUnload Meしてブックを保存して閉じると、次回起動時に 「問題が発生したため、Microsoft Office Excelを終了します。 ご不便をおかけして申し訳ありません。」 と出て、強制終了してしまいます。 ただし、次の場合はエラーが出ずに起動できます。 ・保存せずに閉じた場合。 ・マクロを無効にして起動し、保存した場合(orしない場合) ・VBEを表示させて実行した場合。 デバッグしたらエラーにならず実行されるので、原因がつかめず困っています。 いろいろ手探りでやってみたところ、2回目の起動の時、 UseeFormにあるコントロールにアクセスすると落ちてしまうようです。 例えば、、 UserForm.lb_KUBUN.Caption = "" とか、 cb_Save.Enabled = True といった感じです。 UseeFormには200近いラベルがあります。 あとは22のフレームと、14のコマンドボタン、リストボックスとコンボボックスが1つずつで、 テキストボックスはありません。ブックの大きさは1Mくらいです。 Office Updateは最新状態にしてます。 最初は起動できるので、実行後の保存の時になんか悪いもんが残ったりしてるのかなぁという感じです。 みなさま、お心当たりあればどうぞご教示ください。
459 名前:デフォルトの名無しさん mailto:sage [2007/07/23(月) 23:53:34 ] そのフォームをいい時と悪いときでエクスポートして比べてみたらいいんじゃ
460 名前:458 [2007/07/24(火) 00:24:55 ] エクスポートして比べてみたけど、同じでした。。
461 名前:デフォルトの名無しさん mailto:sage [2007/07/24(火) 07:16:30 ] 最小限の再現出来るソースを出せ
462 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 23:45:28 ] 検索をするプログラムをもっと簡潔にしたいのですが。 いま2次元配列NK_ryuu(1 To 50, 1 To 15)で NK_ryuu(x.1)にID NK_ryuu(x.2)に項目A NK_ryuu(x.3)に項目B NK_ryuu(x.4)に項目C と入っていてxは1から50まであります。 ここであるシートの中から項目ABC全部を持っている行を抜き出すのですが、 今は下のようになっていてforとifを2重3重に使っていてちょっと見た目が汚いです。 しかも項目やxが増えた場合に処理がものすごい勢いで重くなりそうです。 もうちょっと賢いやり方ありませんでしょうか?お願いします。 配列honban()に取得した行番号を格納しています。
463 名前:462続き mailto:sage [2007/07/25(水) 23:46:08 ] Sub test() With ActiveSheet For x = 1 To 50 For i = 1 To 500 If .Cells(i, 2).Value = NK_ryuu(x, 2) Then If .Cells(i, 3).Value = NK_ryuu(x, 3) Then If .Cells(i, 4).Value = NK_ryuu(x, 4) Then honban(j) = i End If End If End If Next i Next x End With End Sub
464 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 08:24:32 ] すいません、質問をさせてください。 VBAではなく普通の関数なんですが、 3人の1ヶ月の勤務表があるとします。 A B C D E 1 Yさん Mさん Aさん 2 1日 0 2 休 3 2日 0 休 休 : : 31 30日 休 0 1 とした時、(勤務表の数字は出勤時間を意味しており、0が朝、1が昼、2が夕方から出勤) E列にその日の出勤が1人の場合のみ名前を出力するようにしたい場合、 現在は=IF(COUNT(B2:D2)=1,INDEX($B$1:$D$1,1,MATCH(0,B2:D2,0)),"") と入力しておりますが、 これを一つの関数で行うことはできるのでしょうか? VLookupの場合テーブルでないとエラーがでるので、 あれば教えていただけないでしょうか。 よろしくお願い致します。
465 名前:464 mailto:sage [2007/07/26(木) 08:31:02 ] 追記です。 出勤する人が1人の場合は、 必ず勤務は朝からになります。(勤務表には0が入ります。)
466 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 12:16:14 ] >>465 >464では何故いけないの? つーか、「1や2が存在しない」ことと「0の人の名前を得る」ことの 両方を同時に満足するような関数なんてあるわけないじゃん。
467 名前:デフォルトの名無しさん [2007/07/27(金) 01:13:41 ] VBAはいつまで存続するんでしょ
468 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 01:39:11 ] >>467 キミが痴呆になるまで
469 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 10:08:25 ] エクセルで、 テキストファイルの印刷 を実行する方法を 教えてくれませんか? pdfと同じようにシェルでやろうとしたらダメでしたorz
470 名前:デフォルトの名無しさん [2007/07/28(土) 19:38:44 ] Private Sub CommandButton1_Click() For i = 1 To 48 If Cells(1, 1) = Cells(i, 4) Then Cells(1, 2) = Cells(i, 5) If Cells(3, 1) = Cells(i, 4) Then Cells(3, 2) = Cells(i, 5) If Cells(5, 1) = Cells(i, 4) Then Cells(5, 2) = Cells(i, 5) If Cells(7, 1) = Cells(i, 4) Then Cells(7, 2) = Cells(i, 5) If Cells(9, 1) = Cells(i, 4) Then Cells(9, 2) = Cells(i, 5) If Cells(11, 1) = Cells(i, 4) Then Cells(11, 2) = Cells(i, 5) If Cells(13, 1) = Cells(i, 4) Then Cells(13, 2) = Cells(i, 5) If Cells(15, 1) = Cells(i, 4) Then Cells(15, 2) = Cells(i, 5) If Cells(17, 1) = Cells(i, 4) Then Cells(17, 2) = Cells(i, 5) If Cells(19, 1) = Cells(i, 4) Then Cells(19, 2) = Cells(i, 5) If Cells(21, 1) = Cells(i, 4) Then Cells(21, 2) = Cells(i, 5) If Cells(23, 1) = Cells(i, 4) Then Cells(23, 2) = Cells(i, 5) Next End Sub セルの値があらかじめ用意しているリストのと一致すると、 特定の文字を入力しようと こういうのを作りました で、うまくいったのですが、 これだとそれぞれ1つのセルにしか記入できません。 たとえば1列目で、Cells(1, 3)にも何か書きたい場合はどうしたらよいでしょうか? 質問の意味が分かりづらかったらスマソ
471 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 19:48:59 ] For i=1 To 48 For m=1 To 12 j=2*m-1 If Cells(j,1)=Cells(i,4) Then Cells(j,2)=Cells(i,5):Cells(j,3)="何か" Next Next
472 名前:デフォルトの名無しさん [2007/07/28(土) 19:53:23 ] >>471 速攻レスありがとうございます。 今仕事中でこっそり送信してるんで、時間ができたらやってみたいと思います。
473 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 20:18:42 ] 記法とかオブジェクトの基本的な質問がちょくちょく出てくるのを見るに VBAからプログラミングに入った人はある程度理解出来てきたなと思う頃 初心に返ってヘルプを一通り眺めてみるのが良さそうだね。 ランゲージリファレンスのメソッド・キーワードあたりの意味が一通りわかった時とか、 ウォッチウィンドウの使い方を理解した時涙出そうになったのを思い出した。 チラ裏スマソ。
474 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 20:25:55 ] >>471 For m = 1 To 12 j = 2 * m - 1 ↓ For j = 1 To 23 Step 2
475 名前:デフォルトの名無しさん [2007/07/28(土) 21:10:24 ] 470ですが >>471 >>474 氏 サンクス 今やって見たら解決しました。 :(コロン)を使うというのを初めて知りました。 特に仕事でVBAが必要というわけではないので、1年に一回くらいしか使わないのですが たまに使うと初歩的なことも忘れてしまいます。 ちなみに競馬のデータ分析に使いましたw 1万レース近くあるのでVBAというかマクロというか分からんけど役に立ちます。
476 名前:デフォルトの名無しさん mailto:sage [2007/07/29(日) 00:26:53 ] >>473 割と共感した
477 名前:デフォルトの名無しさん mailto:sage [2007/07/29(日) 23:01:37 0] 0〜11までの数字をランダムに、かつかぶらないように代入したいんですが 以下のコードだと数字が代入されない場合があるんです。何が原因なんでしょう・・ __________________ n1k = Int(Rnd * 12) Do n2 = Int(Rnd * 12) Select Case n2 Case n1k Case Else n2k = n2 End Select Loop Until n2k = n2 Do n3 = Int(Rnd * 12) Select Case n3 Case n1k Case n2k Case Else n3k = n3 End Select Loop Until n3k = n3
478 名前:デフォルトの名無しさん [2007/07/29(日) 23:09:29 0] 書ききれないので・・実際はn8kまであります。
479 名前:デフォルトの名無しさん mailto:sage [2007/07/29(日) 23:29:12 0] Empty = 0がTrueになるから。 その冗長的なコーディングにはやむを得ない事情があるの? あと抜粋でもせめて宣言部は書こうよ。
480 名前:デフォルトの名無しさん mailto:sage [2007/07/29(日) 23:37:30 0] n*kが数値型変数やVariant型変数の場合 Int(Rnd * 12)の結果が0ならCase Elseでの代入を行わなくても「n*k = n*」がTrueになるからでは? そういうのは配列に順に数値を代入してからランダムソートするといいよ というか、そうするのが普通だろ
481 名前:デフォルトの名無しさん mailto:sage [2007/07/29(日) 23:51:51 0] {0,1,2,3,4,5,6,7,8,9,10,11} {0,1,2,3,4,5,7,8,9,10,11} {0,2,3,4,5,7,8,9,10,11} {0,2,3,4,5,7,8,9,11} こういうイメージで配列を操作せよ
482 名前:デフォルトの名無しさん mailto:sage [2007/07/29(日) 23:51:52 0] >>480 >>477 に便乗で悪いんだけど、 0〜11までの数字をランダムに、かつかぶらないように代入したい て時に俺は Dim RndNum As Long Dim NumCnt As Integer '抜き出す数字の個数 NumCnt = 3 Set Dic = CreateObject("Scripting.Dictionary") RndNum = Int(Rnd * 12) Dic.Add RndNum, RndNum Do While Dic.Count < NumCnt RndNum = Int(Rnd * 12) If Not Dic.Exists(RndNum) Then Dic.Add RndNum, RndNum End If Loop みたいなやりかたするんだけどダメ?
483 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 00:40:48 ] ダメではないけどDictionaryなんて使う必要ない
484 名前:482 [2007/07/30(月) 01:43:37 ] >>483 そか。 ちとランダムソートについて調べてみるよ レスさんくす
485 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 02:31:58 ] 全然詳しくないので質問させてください。 いつも仕事中にWebばかり見てる派遣クンが 「VBAがプログラムどおりに動かない原因を調べるのは僕の仕事ではありません。」 と言っています。 彼のVBAプログラムが動かないのを調べるのは誰の仕事でしょうか?
486 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 02:39:18 ] プログラムが失敗作と確定してるのだったら そういうやつは辞めてもらえ
487 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 03:17:02 ] >>485 契約内容に因る 派遣ではなく業務請負なら間違いなくそれも彼の仕事のうちだけどね 一般的にはその派遣クンが悪いように見る人が多いかも知れないけど 契約内容によっては正しいことを言ってるかも知れない それとこの質問において「Webばかり見てる」なんて情報は全く持って不要 彼の印象をなるべく悪くしようとしているようで浅ましい限りだ
488 名前:デフォルトの名無しさん [2007/07/30(月) 10:34:02 ] vba おすすめ参考書は?
489 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 19:54:34 ] 参考書とは言えないかもしれんが 「Excel VBA 実用サンプルコレクション」 異常にオブジェクト偏重なサンプル集だけどこの考え方は持っておくべきだと思う。 完全な入門ならちょっと敷居が高すぎるだろうけどね。 >>485 って日本語の問題?動く物を作れで終了なんじゃw
490 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 19:59:21 ] セル範囲を画像化して保存する方法はありますでしょうか?
491 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 20:29:53 ] あるよ
492 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 22:57:49 ] 素人な聞き方でスマソ たとえば、 セルD1に「=A1&B1&C1」と入力したら「あいう」と表示されるとします。 (A1, B1, C1 にそれぞれ、あ、い、う が入っている) セルD1 をセルD2に、paste spacial → values(*英語エクセルです)で コピペしたら、セルD2には「あいう」というテキストが入ります。 このpaste spacial → values の作業を省略できるような関数があったら教えてください。 例えば、A1の値を「わ」に変えるだけで、自動的に 「わいう」というテキストの入ったセルを ゲットできるようにしたいのです。
493 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 23:07:07 ] 質問させてください。 UserForm上にComboBoxを配置して Initializeで初期値とRowsourseによってリストを与えるようにしています。 ComboBoxのリストを開くと最初は一番上のリストの値から順に表示され、 一度リストから値を選択してComboBoxに入れ、 再度リストを開くとその値があらかじめ選択されており、 その値の前後が表示されるようになってます。 ( 1 〜12月がリストにあり、5月を選び再度リストを開くと 5月が選択された状態で リストをスクロールせずとも 3〜 7月の値が選択可能な範囲にある ような状態です。) 最初からComboBoxの初期値の付近のリストを表示させるようにしたいのですが、 方法はありますでしょうか? 説明が不十分で分かりにくいかと思いますが、宜しくお願いします。
494 名前:492 mailto:sage [2007/07/30(月) 23:19:05 ] 自己解決しそうです。 PASTE.SPECIAL 関数っていうのがあるみたいですね。 でも手元にある 2003 のエクセルにはないみたいですが・・・ 調べてみます。
495 名前:492 mailto:sage [2007/07/30(月) 23:27:31 ] やっぱり分からなかった。 たぶんマクロでやるんですかね。素人レベルには難しいことならば諦めます。
496 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 23:28:20 ] Private Sub UserForm_Initialize() ComboBox1.Value = "5月" End Sub
497 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 23:30:30 ] >>496 ただ単にValueで値を持たせてもできないのですが・・
498 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 23:31:24 ] >>492 d2に=d1じゃだめなん?
499 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 23:34:48 ] >>497 五月になってない?
500 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 23:43:09 ] >>499 正確には1〜12の値のみで初期値に5を入れて ComboBoxの値は5になっている状態でリストを見ても 1(リストの一番上の値)から5くらいまでが表示された状態になってます。 要は値は入っていてもリスト上は何も選択されていない状態です
501 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 23:45:30 ] >>500 それは値は入っていても値は入っていない状態だからお手上げだな
502 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 23:55:44 ] >>501 お手上げですか なにか手はないものでしょうか・・
503 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 00:03:14 ] >>498 はい。 家計簿を作ってるんですが、 1〜12月までの費目別合計の推移を DSUM 関数で出しています。 =DSUM('1'!A:H,'1'!F1,分類!A1:A2) ←1月 =DSUM('2'!A:H,'2'!F1,分類!A1:A2) ←2月 =DSUM('3'!A:H,'3'!F1,分類!A1:A2) ←3月 (以下12月までつづく) >>492 の例に当てはめると、セルD1に =DSUM('1'!A:H,'1'!F1,分類!A1:A2) と表示されています。 この数式を使えるようにするために、paste spacial → values の作業をしています。 「A1:A2」の部分だけを何度も変更できるように、 セルD1は複数のセルを&でつないでおり、「A1:A2」の位置には特定のセルを指定し、 そのセルに好きなセル範囲を書くだけでいいようにしています。
504 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 00:16:55 ] >>502 Private Sub UserForm_Activate() Me.ComboBox1.DropDown Me.ComboBox1.Value = 5 End Sub こうゆうこと?
505 名前:503 mailto:sage [2007/07/31(火) 00:51:56 ] 当初考えていたやり方じゃないけど解決しました。 有難う御座いました。
506 名前:デフォルトの名無しさん [2007/08/01(水) 13:38:16 ] Excelからメールを送ろうとCDOで組んだのですが宛先があっていれば普通に送れるのですが、アドレスが間違っていて存在しないアドレスに送っていてもエラーが帰ってきません。 このエラーを得る方法はありますか?
507 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 18:43:08 ] あります でもExcelの話じゃないので、ここでは聞かないでね
508 名前:デフォルトの名無しさん [2007/08/01(水) 19:06:24 ] CSVをADOの「Driver={Microsoft Text Driver (*.txt; *.csv)};DBQ=〜」で扱うのは office2000以上だと標準で利用できますか? 参照設定の設定も不要でいいんでしょうか?
509 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 19:07:12 ] 当然参照設定は必要
510 名前:デフォルトの名無しさん [2007/08/01(水) 19:15:24 ] >>509 マジ?なんも設定しなくても使えたんだけど・・・ ちなみに何を設定すればいいんですか?
511 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 19:18:37 ] もしかしてCreateObjectで参照してる?
512 名前:デフォルトの名無しさん [2007/08/01(水) 19:28:25 ] Private Sub CommandButton1_Click() Set rs = CreateObject("ADODB.Recordset") Con = "" Con = Con & "Driver={Microsoft Text Driver (*.txt; *.csv)};" Con = Con & "DBQ=C:\Documents and Settings\Administrator\デスクトップ\新しいフォルダ;" strSQL = "select * from test.csv" rs.Open strSQL, Con, 0 '0=adOpenForwardOnly cols = rs.Fields.Count Do Until rs.EOF Line = "" For i = 0 To cols - 1 Line = Line & rs(i) & vbTab Next Debug.Print Line rs.MoveNext Loop End Sub
513 名前:デフォルトの名無しさん [2007/08/01(水) 19:29:32 ] こんなん書いて 今家でも試したけど出来た CreateObjectだね CreateObjectだと参照設定しなくても出来るということでおk?
514 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 20:05:43 ] >>506 www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_800_080.html ググったら見つけました
515 名前:デフォルトの名無しさん [2007/08/01(水) 22:14:09 ] エクセルを開こうとするといきなりインストールしだしてエラー表示がでました。 プロパティを開いてプログラムを見ると不明なアプリケーションとなっております。 これは何故でしょう? またこれを解決する方法はどうすればいいのでしょうか?
516 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 22:17:30 ] >>513 そうだよ。それが遅延バインディング。 欠点として、参照設定してきちんと型を指定して使う早期バインディングより 速度が遅いと、確かヘルプに書かれているはず。
517 名前:デフォルトの名無しさん [2007/08/01(水) 22:18:02 ] 初心者です。 if,do,for等の分岐式や繰り返しコードを使うと必ずバグが出ます。 バグが出ないように皆さん何か心がけている事ってありますか?
518 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 22:21:59 ] 参照設定しないと遅いのもあるけど、コーディングしにくくない?
519 名前:デフォルトの名無しさん [2007/08/01(水) 22:55:03 ] 参照設定ってexcelファイルにするの? excel環境にするの?
520 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 23:05:13 ] ブック単位だな。 ちなみに、普通のVBだとプロジェクト単位。
521 名前:デフォルトの名無しさん [2007/08/01(水) 23:47:31 ] >>515 VBA関係ねえ
522 名前:デフォルトの名無しさん [2007/08/01(水) 23:53:15 ] >>520 d
523 名前:デフォルトの名無しさん [2007/08/02(木) 07:40:47 ] ADOで csvテーブル(Microsoft Text Driver接続)と Excelシートテーブル(Microsoft Excel Drive?接続)の SQLでの連結ってできる?
524 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 18:21:00 ] VBAでListViewとかTreeViewを組み込んで OLEDragDropとか使うのは、 VBがある環境じゃないとライセンス違反とか聞いたんだけど、ほんと? なんかMSのページ見に行ってもどこに情報があるのか良くわからん。。 使えるのに使っちゃダメとかなんだったらひどい話だよなあ。
525 名前:デフォルトの名無しさん [2007/08/02(木) 18:24:58 ] vbaでSQLite使う方法ある?
526 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 18:28:46 ] あるよ
527 名前:デフォルトの名無しさん [2007/08/02(木) 18:33:07 ] どうやるのか教えて
528 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 21:21:54 ] >>524 > ライセンス違反とか聞いたんだけど、ほんと? うん、ライセンス違反だよ ListViewとかTreeViewはVB6ランタイムを入れるとVBAからも使えるようになるが、本来VB6ランタイムというのは有料ソフトの付属品 VB6で作ったソフトを動かす為に必要なので、特定条件下で無料再配布が許可されているが、当然、使用はライセンスに縛られた範囲になる で、使用して良い範囲が、VB6を持ってない人(VB6ランタイムを借りてる人)ではVB6で作られたソフトからの利用のみで VB6を持ってる人(VB6ランタイムを購入した人)は自分の環境内で好きなように使って良くて VB6Proなどを持ってる人(VB6ランタイムとその再配布権を購入した人)は自環境内で好きなように使って良いのに加えて 自作ソフトに同梱して配布することも出来る 無料で配布されているとは言え、VB6を持ってない人には有料ソフトの一部を条件付きで貸してるだけということをお忘れなく > 使えるのに使っちゃダメとかなんだったらひどい話だよなあ。 世の中、出来るけどやっちゃいけないことで溢れかえっているけど、こんな事にも気付いてないほどお子ちゃまなの? おそらくピッキングが出来れば君の家にある君が所有権を持つ物品類を盗むことも「出来ること」だが この「出来ること」をやっちゃダメだと法的に定めるのはひどい話なのかな? 君の所有物に対して、所有権において他者の使用を制止・制限出来るのと同じで MSの著作物に対しても、著作権において他者の使用を制止・制限してるだけのことなんだけど
529 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 21:47:51 ] >>528 > 特定条件下で無料再配布が許可されているが、 おー、そういうからくりなのか。ぜんぜん知らなかった。 勉強になるなあ。ありがとう。 > 世の中、出来るけどやっちゃいけないことで溢れかえっているけど、 > こんな事にも気付いてないほどお子ちゃまなの? お子ちゃまレベルなのは認めるよ。 趣味でスクリプト組んでいるんであって、 プロで開発やってるわけじゃないもん。 もうちょっと「だめであること」がわかりやすくなっていても いいんじゃないか?と思ったよ。だめならだめでさ。
530 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 21:56:24 ] それを言うなら鍵あいてた家のトイレでウンコしていいかとかそんな所だろ。 どっちもどっちだし窃盗みたいにものすごく悪いって程ではないけど、一応ダメ。 見つかって話がこじれたり目に余るような有様だと裁判沙汰にもなるわなw
531 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 23:37:16 ] >>529 技術や知識レベルとかプロ意識の問題じゃなかろう 約束やルールを守れないのは子どもだってこと ただまあ524がそこまで言われるようなことかと言うと 「そういうもんなんだから諦めな」で済むような気もする
532 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 00:20:16 ] そんなことよりvbaからSQLite使う方法教えろ
533 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 04:43:19 ] ググれカス!
534 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 21:25:19 ] vba sqlite odbc でぐぐって判らんかったら諦めれ
535 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 21:26:25 ] ブレークポイントでプログラム中断した時、変数にマウスポインタあてると 内容が表示されるのが表示されなくなりました 設定とかいじってないのに何ででしょう?
536 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 22:14:43 ] VBAを記述中にカーソルが勝手に戻ったり、コメントを記入中に勝手に変換確定されるのですが どうすれば回避する事が出来るのでしょうか? 例えば Sub | ←このような時に Sub| ←このようにカーソルが戻ってしまうんです。 わーくしー ←このように入力中に勝手に確定されるのです。 よろしくお願いします。
537 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 22:29:04 ] スペースが全角だから自動で半角になってるんじゃないか
538 名前:106 mailto:sage [2007/08/04(土) 07:49:36 ] 'Sub |
539 名前:デフォルトの名無しさん mailto:age [2007/08/04(土) 10:42:33 ] 助けてください。2列目以降をソートしたいのですが、 Range("A1").Sort _ Key1:=Columns("B") _ , Order1:=xlAscending _ , Header:=xlGuess _ , Orientation:=xlTopToBottom だと、 実行時エラー'1004' RangeクラスのAutoFilterメゾットが失敗しました。 Range("A1:L100").Sort _ Key1:=Columns("B") _ , Order1:=xlAscending _ , Header:=xlGuess _ , Orientation:=xlTopToBottom だと、 エラーはでませんが、まったくソートがされません。 F8を叩くと、セルはA1を指しています。 同じファイルをマクロで実行したソースを貼っても駄目でした…。 よろしくお願いします。
540 名前:539 mailto:age [2007/08/04(土) 10:45:32 ] ↑すいません。 ○RangeクラスのSortメゾットが失敗しました。 ×RangeクラスのAutoFilterメゾットが失敗しました。 です。
541 名前:デフォルトの名無しさん [2007/08/04(土) 15:47:25 ] 決められた範囲内(セル内)のデータをcsvファイル形式でセーブしたいのですが… どんなプログラムになるでしょうか?
542 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 16:10:48 ] >>542 マクロ記録でSaveAs...してみれば判ると思う。
543 名前:542 mailto:sage [2007/08/04(土) 16:11:49 ] >542は>>541 ね。
544 名前:536 mailto:sage [2007/08/04(土) 19:19:49 ] 最初にOption Explicitを入れたので、原因はそれっぽいのかな。 まだ、検証してませんが
545 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 19:51:05 ] >Option Explicitを入れたので、原因はそれっぽいのかな。 Option Explicitは常に入れているが、そんな話聞いた事が無い。
546 名前:デフォルトの名無しさん [2007/08/04(土) 23:56:25 ] Sheet1 □ りんご □ みかん □ いちご □ ぶどう Sheet2 ┌─────┐ │りんご │ │みかん │ └─────┘ 図のようにシート1にあらかじめ入力されているデータを選択し シート2にあらかじめ作成しておいた表の特定のセルに自動転記され 表が完成する。 という動作を行いいたいのですが まずシート1でチェックボックスで選ばれた項目だけを 表に反映させるというのがわからないです。。
547 名前:デフォルトの名無しさん [2007/08/05(日) 00:43:42 ] くそ天皇 くそ天皇 くそ天皇 くそ天皇 いい加減死ねっつってんだろ屑ニートくそ天皇が 相変わらず病的な粘着っぷりだな屑ニートくそ天皇が 毎日毎日毎日粘着出来て良いでちゅねくそ天皇 くそ天皇さっさと死にやがれゴミが 東京に在住している精神病珍米糞ニートくそ天皇君の末路 さっさと精神病院逝くか首吊って逝くか選べや糞天皇が 早く死ねよ糞ニート天皇が 粘着精神病屑ニート天皇君は自らニートくそ天皇であると公言しました さっさと死ねやくそ天皇が 早く死ねっつってんだろ屑ニートくそ天皇が お前みたいなゴミクズ天皇は息してるだけで空気が汚れるからさっさと死ねや とっと死に晒せや糞ニート天皇が
548 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 01:09:41 ] >>546 Sheet1.CheckBox1でプロパティ値にアクセスできるし changeイベントもあるからお好きなように
549 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 16:42:45 ] タスクみたいなタイマーで2時間に1回プログラムを実行させるにはどーすればいいの?
550 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 20:56:56 ] タスクを使えばいいんじゃね?
551 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 03:44:01 ] OSはVistaです。 エクセルで完成させた表を印刷しようとするとエラーになります。 通常のインターネットなどのページを印刷するのは可能なのですがエクセル・ワードだけはエラーがでてしまいます。 パソコンでプリンターの状態を見たら「アイドル」になったままで何をしても変わりません。 だれか助けてください。
552 名前:551 mailto:sage [2007/08/06(月) 03:45:26 ] スマソ。 板違いだった。 総合相談所スレにいってきます。
553 名前:デフォルトの名無しさん [2007/08/06(月) 15:13:05 ] お世話になります。 accessからodbcを利用してプロシージャを実行させようとしているのですがエラーになって実行できません。 --ソースの一部---------------------------------- Dim tmp_qd As QueryDef SQL = "exec プロシージャ_hoge" tmp_qd.SQL = SQL Set tmp_rs = tmp_qd.OpenRecordset() ------------------------------------ vbは良く分からない(初めて3日くらいです)のでこれでソースが足りるか分かりませんが、 上記の「tmp_qd.OpenRecordset()」でエラーが発生しています。 内容は 「 ODBC--呼び出しは失敗しました。 」 とダイアログに表示されます。 エラーの原因がなんだかわかりません。 お手数ですが、お願いいたします。
554 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 15:28:04 ] 動いたら奇跡
555 名前:デフォルトの名無しさん [2007/08/06(月) 15:53:57 ] >>554 他のコードです。 Dim db As Database Dim qd As QueryDef Dim rs As Recordset Set db = CurrentDb() qd.Connect = glcnst_ODBCConnect qd.ReturnsRecords = True qd.ODBCTimeout = 0 SQL = "exec pro_hoge" qd.SQL = SQL Set rs = qd.OpenRecordset() 何か文法等間違っている箇所があるのでしょうか? お願いします。
556 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 17:39:57 ] currentdbはaccessでしか使えないし sqlが何かわかってないし どこが間違ってるかとかいうよりも ちょっとずつしっかり勉強したほうがいいよ
557 名前:デフォルトの名無しさん [2007/08/06(月) 18:58:04 ] >>556 了解しました
558 名前:デフォルトの名無しさん [2007/08/06(月) 19:44:23 ] 初めてカキコします。 スキルもないのに仕事を押し付けられた入社1年目の者です。 日報なのですが、日付を入力したら、その日の売上、仕入を表示できるようなプログラムはあるのでしょうか? ご教授お願い致します
559 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 19:47:29 ] 作ろうと思えば作れる。 ここは、そういうものを作る側のスレッド、板。
560 名前:558 [2007/08/06(月) 20:37:56 ] >>559 期限はないので勉強して作ってみます。 ありがとうございます
561 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 20:49:01 ] そんなん関数でやればいいじゃない
562 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 21:56:57 ] >>561 >日付を入力したら、その日の売上、仕入を表示できるようなプログラム を関数で出来んのか?
563 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 22:20:15 ] >>562 横からだけど 関数で引っかかるのはどこだろう? セルに日付を入れると別のシートにある売り上げと仕入れ VLOOKUPでは駄目なのだろうか?
564 名前:デフォルトの名無しさん [2007/08/06(月) 22:54:58 ] VBAを使って自分自身にジェクトのロック・アンロックをかけたいのですが 可能ならば教えてください
565 名前:デフォルトの名無しさん [2007/08/06(月) 22:55:40 ] >>564 プロジェクトのロック・アンロックでした
566 名前:デフォルトの名無しさん mailto:sage [2007/08/07(火) 09:43:03 ] >>564 可能だけど、それを自分で調べられないレベルの奴は プロジェクト自体やモジュールをコードで弄るのはやめた方がいい あと、やるならプロジェクトへのアクセス許可出さないとだめだからね
567 名前:558 [2007/08/07(火) 19:02:10 ] VLOOKUP関数で出来ました! 検索値を日報の日付の部分にしたら解決しました。
568 名前:デフォルトの名無しさん [2007/08/07(火) 19:12:56 ] 初めて質問させていただきます。 XML文書の妥当性チェックをXMLスキーマで行うため、以下のようにXMLSchemaCacheにaddしようとしたところ、Aの段階でエラーが発生します。 @スキーマキャッシュオブジェクトの生成 Dim objScm As New MSXML2.XMLSchemaCache Aスキーマをキャッシュに追加 objScm.add "urn:bookList","C:\book.xsd" 実行時エラー スキーマのルート要素に対する定義が無効です。 どのようにすれば@ITの記事を参考にしてやっているのですが、どのようにして回避できるのかわかりません。環境はExcel2000, MSXML2.6を使用しています。よろしくお願いします。
569 名前:デフォルトの名無しさん mailto:sage [2007/08/07(火) 20:55:54 ] MSXML2使うなら、これはExcelとは関係ないものなのでスレ違い
570 名前:デフォルトの名無しさん [2007/08/07(火) 21:22:30 ] >>569 小さい野郎だな、静かにしろ
571 名前:デフォルトの名無しさん mailto:sage [2007/08/07(火) 21:47:36 ] 何でも斜に構えて、規律なんて糞食らえ、俺は大きな人間さ というスタンスで居るのがカッコイイと思ってる年頃ってあるよねw
572 名前:デフォルトの名無しさん [2007/08/07(火) 22:00:20 ] ゆとりはもう一度文章を読み返してから書き込もうぜ
573 名前:568 [2007/08/07(火) 22:01:44 ] >>569 XML総合と迷ったのですが、Excelマクロを用いてのXML操作ということで、ここはひとつお目こぼしを。 >>570 わたしのほうもスレ違いと言われて当たらずとも遠からずかもしれません。原因の一端は確実にわたしにありますので、あまりお責めにならないよう。 >>571 そういう時期は確かにありました。実際にカッコイイことはないと思うのですが、根拠レスに自分で自分をカッコイイと思える平和な時期だったのだと思います。
574 名前:デフォルトの名無しさん [2007/08/07(火) 22:18:13 ] >>566 そー言わずになんかヒントちょうだい
575 名前:デフォルトの名無しさん mailto:sage [2007/08/07(火) 22:25:08 ] >>573 だまってろカスブタ
576 名前:デフォルトの名無しさん [2007/08/07(火) 23:25:53 ] Dim a, b dim r as range a = Split(Replace(r.Value, "@", " "), " ") b = Split(Replace(r.Value, "a(0)", "*"), "*") bはaで分割した最初の文字列を*に変換、*で分割といった感じにしたいのですが、 素人でよく分りません。よろしくお願いします。
577 名前:デフォルトの名無しさん [2007/08/07(火) 23:30:25 ] "a(0)" -> a(0) じゃだめか?
578 名前:デフォルトの名無しさん [2007/08/07(火) 23:44:11 ] >>577 おお、できましたぁ!!!ありがとうございます〜ペコリ
579 名前:デフォルトの名無しさん [2007/08/07(火) 23:56:01 ] ただ、それだったら a = "*" & mid$(r.Value,instr(r.Value,"@"))とかのが何ぼか軽いんじゃない? (注:offsetの誤差は考慮してない)
580 名前:デフォルトの名無しさん [2007/08/07(火) 23:57:13 ] あ、*でsplitしてるのか、ごめん勘違い
581 名前:デフォルトの名無しさん mailto:sage [2007/08/08(水) 09:40:48 ] >>573 > Excelマクロを用いてのXML操作ということで それはVBAの範疇じゃない VB言語で[A]pplication(Excel)を操作するからVBA これからAを取ったらVBなので、Excel付属のVBE使ったとしてもVBの分野
582 名前:573 [2007/08/08(水) 12:00:35 ] >>581 わかりました。他スレで質問させていただくことにします。お騒がせしました。
583 名前:デフォルトの名無しさん [2007/08/09(木) 21:09:41 ] excelのvbaを使ってます。 ユーザーフォームで作成した複数のtextboxについて、コードを入力するとき 例えば if textbox1 = 〜 then end if if textbox2 = 〜 then end if if textbox3 = 〜 then end if などとせず textboxの連番をうまいこと使ってまとめることってできないでしょうか?
584 名前:デフォルトの名無しさん [2007/08/09(木) 21:21:27 ] あらかじめオブジェクト配列にでもセットしておけば?
585 名前:デフォルトの名無しさん mailto:sage [2007/08/09(木) 21:21:57 ] >>583 〜の内容とThenからEnd Ifの間次第なのに肝心な所を略してどうするの。 for i = 1 to 3 if Controls("textbox" & i) = 〜 Then Stop next こういう事?
586 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 02:31:18 BE:703008239-2BP(218)] SolverAdd CellRef:=constraintCell.Address, Relation:=2, FormulaText:="1.00" これで 拘束条件が 追加されないびょん しかも、あるブックだけ・・・ どいうこと?
587 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 02:35:35 BE:390559853-2BP(218)] しかも、同じブックの その他のSolverAddは 動作するし・・・ なんなの? いやがらせ? > Excel 2003 For Each r In changeRange SolverAdd CellRef:=r, Relation:=3, FormulaText:=0.0002 SolverAdd CellRef:=r, Relation:=1, FormulaText:=0.9998 Next r は 動作するw
588 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 04:29:33 BE:1458089478-2BP(218)] "1.00" の代わりに "R1C10" にすると追加されたw なんで0.0002や0.9998は問題ないのやら?w
589 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 04:44:49 BE:104149722-2BP(218)] "1.00"の代わりに 1 や 1# でも追加されないびょんw 0.999は追加されたw 変な ブックw
590 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 04:48:30 BE:416596782-2BP(218)] "1.00"の代わりに"0.999"にしたら追加されたw そんなに 1が嫌いなのか!
591 名前:デフォルトの名無しさん [2007/08/11(土) 01:19:24 ] あまりにも単純な質問で申し訳ありませんが質問させてください。 VBAでユーザーフォームのテキストBOXにセルの内容を表記 させる事は普通には出来るのですが、セル内容が時刻の場合 上手くいきません。 セル(A1)がActiveとして10:00と入力されています。 それをtexttbox1に表記させるため Userform1.textbox1.value = Activecell とすると、表示されるのは「0.416666666666667」という不可解な 表記なんです。 「10:00」と表記させる方法をご教示下さい。
592 名前:デフォルトの名無しさん mailto:sage [2007/08/11(土) 01:46:00 ] >>591 Userform1.textbox1.value = Activecell.Text
593 名前:デフォルトの名無しさん [2007/08/11(土) 02:59:16 ] >>592 > >>591 > Userform1.textbox1.value = Activecell.Text ありがとう御座います。セル側にtext指定するとは気がつきません でした。本当に助かりました。
594 名前:デフォルトの名無しさん [2007/08/11(土) 17:42:24 ] すみません、質問です。 マクロの閲覧などをロックしても、ある種のツールで解除出来たりしますが これを回避する方法は、他のツールソフトなどを利用するしか、 手段は無いのでしょうか? その場合、出来ればフリーで良いツールは有りませんか?
595 名前:デフォルトの名無しさん mailto:sage [2007/08/11(土) 18:00:28 ] 変数名をランダム&グローバルにして クラス使わずすべて標準モジュールに記述 標準モジュールもランダムな名前で100個ぐらい作る 関数も全く関連性のないものを各々10個ぐらい用意 さらに関数もgoto文多用で1000ステップ このくらいやれば自分も解析する気にならない マジおすすめ
596 名前:デフォルトの名無しさん mailto:sage [2007/08/11(土) 18:54:45 ] >>594 VBAプロジェクトの保護は、初心者の不用意な改変を防ぐ「ロック」であって 閲覧や漏洩を阻止する「セキュリティー」ではありません そもそも、Excelは開発環境ではないのでソースの漏洩を防止しようとすること自体が間違い Microsoftは強固なセキュリティーを付けることよりも、万が一パスワードを紛失しても、 膨大な時間を掛けて製作したマクロコードを失う結果に繋がらないように配慮しました 開発環境ではないExcelでは、ソースを書いたモジュール自体が、パスを付ける対象に組み込まれているので モジュールのエクスポートなどをしていない状態でパスを紛失してパス外しが出来なかったら コードを全て失うことになってしまうからね その結果、普通にパスを掛けただけはもちろん、パス解除防止ツールでロックしても、 ちょっと面倒になるだけでパス外し自体は出来るようになっています 君が言う「ある種のツール」はコレ( ttp://passmaster.fujigoma.com/passmas/index.htm ) じゃないかもしれないけど、コレで「VBAパスワード保護」した程度ならちゃんと外せます 因みにコレくらいならVBAでも作れますよ そして、コードが漏洩しない形でアドインなどを作りたい人には専用ソフトを用意しています (Visual Studio Tools for Office) あとは、専用ソフトを使ってでもセキュリティーを付けたいか、専用ソフトを使うくらいなら、 解除できる状態でも良しとするかはあなた次第なので、どうぞお好きなように
597 名前:デフォルトの名無しさん [2007/08/11(土) 20:41:21 ] 質問させてください。 会社で、エクセルを使って報告用紙の作成を命ぜられたのですが、 エクセルの知識は一般常識的なものしか持ち合わせていないので、 どなたかご教授願います。 C1の値が、A1〜A5のいずれかの値と一致したならば、 E1に、その一致したA1〜A5のいずれかのセルの右隣のセルに入力されている値(B1〜B5のいずれか) を表示する。 というような内容の関数を作りたいのですが、ネットで検索して1日悩みましたが、結局分かりませんでした。 私の予想では、IF関数とOR関数を使うような気がするのですが。。。 ちなみに関数は今まで使ったことがありません。プログラムの知識もありません。 どうぞ宜しくお願い致します。
598 名前:デフォルトの名無しさん mailto:sage [2007/08/11(土) 20:54:08 ] >>597 E1に式を突っ込むだけでできると思うのだが。よって、スレ違い。
599 名前:597 [2007/08/11(土) 20:58:50 ] >>598 この板ははじめて来るので、よく分かりませんでした。 どこで質問すれば良いでしょうか?
600 名前:デフォルトの名無しさん mailto:sage [2007/08/11(土) 21:12:30 ] >>599 さぁ? Excelの使い方の質問ができるのならどこでもどうぞ。 #あ、鼬害か。
601 名前:597 mailto:sage [2007/08/11(土) 21:21:27 ] 他の板で聞いて解決しましたのでwww お前らダッセwww
602 名前:デフォルトの名無しさん mailto:sage [2007/08/11(土) 22:49:41 ] セルに関数入れるのを プログラムと呼べなくもないような
603 名前:デフォルトの名無しさん mailto:sage [2007/08/11(土) 22:51:42 ] >>602 それでもスレ違いであることには変わりない。
604 名前:デフォルトの名無しさん [2007/08/11(土) 23:55:49 ] >>596 質問した香具師じゃないが VSに何故VBAの開発環境があるんだ?と不思議に思ってたが そーゆー事なのかぁ、ためになった
605 名前:デフォルトの名無しさん [2007/08/11(土) 23:57:38 ] >>604 VBAと書いたが、確か違う名前だったね
606 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 19:08:40 ] 質問です。 エクセルで、印刷ダイアログを表示させて、そのときの印刷のページ範囲を任意で決めたいのですが、VBAで制御できますか? 一応、PrintOutメゾットは知っているのですが、このメゾットを実行させると印刷が自動的に行われてしまうようで、今回の利用の用途には合いませんでした。 あらかじめページ設定に印刷の範囲を指定できればいいのですが・・・ ご教授願います。
607 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 19:16:56 ] printpreview
608 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 22:02:15 ] >>607 いや、それだとダイアログが出ないから合わないんです。 詳しく書くと 1.何かしらの計算をして、ページ範囲(ページの枚数:1〜3ページまでとか)が既に決まっている。 2.印刷する前にダイアログを出す。 3.ページ範囲は、1.より範囲を代入する。 4.ダイアログから印刷プレビューを出す。 5.印刷をする。 この場合、PrintOutメゾットだとFromとToで範囲を決めれたけど、このメゾットだと自動的に印刷までいくので、今回の目的に合わなかったわけです。 一応printpreviewもやってみたけど、このメゾットだと範囲をあらかじめ決めれないらしいので、どうしたものかと困ってしまってます。
609 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 22:25:21 ] >>606-608 Application.Dialogs(xlDialogPrint).Show 〜
610 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 22:56:53 ] >>609 おおなるほど、これなら思い通りに行けそうです。 ありがとうございます!
611 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 17:34:19 ] 教えて下さい。 マクロで、「エクセルのメニューを操作(開いてる)」 という状態を 判断する方法って有りますか?
612 名前:デフォルトの名無しさん [2007/08/15(水) 01:03:01 ] InputBoxとかでとりあえず何かを入力させて、 その中にある文字列が入っているかで 分岐させるのはどうすればいいんですか? ある文字列が入っているか調べる関数とかあれば教えてください。
613 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 01:08:29 ] >>612 InStr関数 ある文字列の位置を返す関数だが 含まれてなければ0を返すので、0が返ったか1以上が返ったかで 含まれてるか否かを判断できる
614 名前:612 [2007/08/15(水) 01:27:20 ] >>613 ありがとうございます。参考にします。
615 名前:デフォルトの名無しさん [2007/08/15(水) 03:12:18 ] 散布図のグラフで、Y軸の範囲を1つ右の列にずらすVBAを作りたいのですが 方法がわかりません。例で示すとY軸の値 =Sheet1!$B$2:$B$11 を =Sheet1!$C$2:$C$11 =Sheet1!$D$2:$D$11 =Sheet1!$E$2:$E$11 : と実行するたびにずらしていくマクロです。 固定値でよければ、Y軸を指定するには ActiveChart.SeriesCollection(1).Values = "=sheet1!R2C2:R11C2" などとすればよいことがわかりましたが、相対移動のためにたとえば、 ActiveChart.SeriesCollection(1).Values = ActiveChart.SeriesCollection(1).Values.Offset(0,1) とはできません。 調べたところ、.Values を参照するとバリアント型で配列が返るところまではわかったのですが、 そこで力尽きました。。
616 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 05:28:39 ] 自己レスです。 その後、検索したところ指定範囲が .SeriesCollection(1).Item(1).Formula で 文字列で得られることがわかりました。ですので、文字列処理をひたすらやって、 .SeriesCollection(1).Values に突っ込むことでなんとかできるようになった感じです。 お騒がせしました。 # 結局、これで徹夜になったなぁ。
617 名前:nanashi mailto:sage [2007/08/15(水) 14:09:52 ] 以下のことがしたいのですが、VBAで対応可能でしょうか? シート1で文字列を検索して、検索した文字を違うシート2のB1セルに貼り付けます。 続いて検索した文字の一つ上のセルを違うシート2のA1に貼り付けます さらに検索した文字の一つ下のセルを違うシート2のC1に貼り付けます。 検索された文字をA2,A3...と貼り付けていくようなものをつくりたいです。 できればシート1でのセル情報(セルの色や取り消し線)もあわせてもってこれると うれしいです。 よろしくお願いします
618 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 14:57:08 ] >>617 マクロの記録結果見て考えろ
619 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 14:58:51 ] 充分可能ですね。
620 名前:デフォルトの名無しさん [2007/08/15(水) 15:46:47 ] phpでいうところの変数展開「var_dump()」みたいなものって、vb(vba)にはないのでしょうか? PHPは2年ほど触っているのですが、仕事でvbaをしなければならなくなりました。 質問自体はそれほど難解なことではないのですが、なにしろ、基本的な知識をぶっ飛ばして作成に入っているため、つまらないことで躓いています。 よろしくお願いいたします。
621 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 16:05:41 ] ウォッチ式のことかね
622 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 17:27:02 ] >>620 PHPと違ってデバッガがあるので、それを使えばvar_dumpなんぞ不要。 ブレークポイント、ウォッチ式、イミディエイトウインドあたり調べてみ。
623 名前:デフォルトの名無しさん [2007/08/15(水) 17:34:42 ] >621さん 簡潔なお答え、ありがとうございます。笑 (上段はさておき、そんな言葉すら知りませんでした。) 頂いたヒントをもとに調査した結果、「現在変数に入っている値を見る方法」がわかりました。 「ローカルウインドウ」なるものの存在を知ったので、たぶん、問題は解決。 ありがとうございました。
624 名前:デフォルトの名無しさん [2007/08/15(水) 17:38:01 ] >622さん 立て続けに申し訳ありません。 解決しましたので、そのご報告です。 ずっとphpを触ってきたので、すっかりvar_dumpのトリコになっていました。 開発をしていると値の内容を知ることが重要で、それをもたらしてくれるvar_dump、なんて素敵な関数なんだろう、と感動していたところです。 よくよく考えると、結果を表示する画面というのもエクセルにはなく(たぶん、ないですよね)、結果、ローカルウインドウを使うことに決めました。 ご回答、ありがとうございました。
625 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 22:11:00 ] Debug.Printをフラグ管理して、イミディエイトウインドに値を表示させるのもひとつの手かと コードは多少汚くなるけど、必要な値だけ取り出せる。
626 名前:デフォルトの名無しさん [2007/08/15(水) 22:28:10 ] すいません、VBA初心者なんですが、2点程質問があります。 どなたか教えて頂けたら幸いです。 1、Application.GetOpenFilenameにてファイル名を取得するんですが、 この時、「ファイルを開く」ダイアログボックスに自分が指定した フォルダが最初から開かれているようにしたいんですが、可能なのでしょうか? 例えば C:\test のフォルダを指定したら、ダイアログボックス を開いた時に、testフォルダ内のファイルが見れている状態です。 2、1つの列にロックをかけた場合、他のセルの右クリックの「挿入」、 「削除」、「セルの書式設定」と言ったメニューが使えず、 制限されてしまうんですが、その列をロックをしたまま、上記メニュー を使えるようにする事は可能なのでしょうか? 自分で解決できなかったので、 どなたかご存知の方いましたら、宜しくお願いします。
627 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 22:57:19 ] >>626 ChDrive()やChDir()でカレントフォルダを変更。 ただし、例外の処理をちゃんとしないとうまく動かない。 別に、Application.GetOpenFilenameをやめてWindowsAPIを使う方法もあるが、 ややスキルが必要。 >>1つの列にロックをかけた場合、 これ意味不明。kwsk。
628 名前:デフォルトの名無しさん [2007/08/15(水) 23:17:33 ] >>627 さん ありがとうございます。 今までカレントフォルダを変更しただけで、例外の処理をしてませんでした。 ちょっと例外処理とAPIについて自分で調べてやってみます! >>1つの列にロックをかけた場合、 というのは、例えばB列のセルの内容を編集をできないようにロックした場合、 という意味です。(B列のセルをダブルクリックしたら編集不可のメッセージが出ます。) このB列をロックしてしまうと、他の編集可能なセルにも影響が及んでしまうんです。 編集可能なセルだけ、通常の右クリックのメニューを使えるようにする 事はできるのでしょうか?
629 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 00:15:03 ] >>628 「ロック」というのはデフォルトで全部のセルにチェックがついてる。 おまえさんが言ってるのは「シートの保護」のことか?
630 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 01:10:49 ] 無理してShellコントロールでやってみたがSetdirectoryしてからダイアログ呼ぶ方が綺麗で簡単だわな 'Shellを使うには Microsoft Shell Controls And Automation をインクルードしておくこと Dim objShApp As Shell Dim strPath As String Dim objFld As Folder2 Set objShApp = New Shell Set objFld = objShApp.BrowseForFolder(0, "フォルダを選択してください", _ BIF_SHAREABLE + BIF_NONEWFOLDERBUTTON + BIF_NEWDIALOGSTYLE + _ BIF_RETURNFSANCESTORS, ThisWorkbook.Path) If objFld Is Nothing Then Exit Sub End If strPath = objFld.Items.Item.Path MsgBox strPath Set objFld = Nothing Set objShApp = Nothing
631 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 02:58:56 ] かなりの初心者です セルに格子の表を作りたいのですが、メッセージボックスなどで表示・入力させて、毎回、表の大きさを自由に変えられるような、マクロは作れますか? "A1:J10"と指定して表作れとかなら、何とかわかるのですが・・・ ご指導、よろしくお願いします
632 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 03:33:11 ] マルチページやタブストリップで、ページの背景をかえても、 タブがグレーのままなのです。 タブにも背景色を設定することは出来ないでしょうか
633 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 06:01:24 ] >>631 REFEDITコントロールを使うとか
634 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 11:05:41 ] >>631 言ってる事判んないけど、例えば次のような感じなら簡単だと思う 1 マウスで左上のセルを指定 *** ここからマクロ *** 2 inputbox関数で大きさを指定。例えば、5-10 3 マクロで5行10列の格子を引く *** マクロ終り ***
635 名前:631 mailto:sage [2007/08/16(木) 11:51:07 ] >>633-634 これから、やってみます 本当に有難うございました
636 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 12:32:47 ] >>631 以前、同じことやろうとして、判らなかった。 自分しか使わないマクロだったんで、 マクロ起動前に、処理したいセル範囲を選択しておく、という方法にしてしまった。 お望みの解ではないですが、参考まで。
637 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 13:39:16 ] inputbox関数じゃ無くinputboxメソッド使えばいいじゃん?
638 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 13:50:51 ] inputboxメソッドで始点(左上)と終点(右下)をマウスで指定すれば、 キーボードで入力しないでも出来そうな気がするのだが...。
639 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 18:46:59 ] できた(力作) Sub セルに格子の表を作りたいと思った時のマクロ() Const colwidth = 3 '枠の幅0- Const colcount = 9 '枠の列数1- Const RowHeight = 4 '枠の高さ0- Const rowcount = 3 '枠の行数1- Const セル = "C7" topline = "" bottomline = "" centerline = "" charline = "" topline = "┌" '*** For i = 1 To colcount For m = 1 To colwidth topline = topline & "─" Next If i < colcount Then topline = topline & "┬" Next topline = topline & "┐" '*** centerline = "├" For i = 1 To colcount For m = 1 To colwidth centerline = centerline & "─" Next If i < colcount Then centerline = centerline & "┼" Next centerline = centerline & "┤"
640 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 18:47:43 ] For i = 1 To colcount '*** charline = charline & "│" For m = 1 To colwidth charline = charline & " " Next Next charline = charline & "│" bottomline = "└" '*** For i = 1 To colcount For m = 1 To colwidth bottomline = bottomline & "─" Next If i < colcount Then bottomline = bottomline & "┴" Next bottomline = bottomline & "┘" myspread = topline For i = 1 To rowcount For m = 1 To RowHeight myspread = myspread & vbLf & charline Next If i < rowcount Then myspread = myspread & vbLf & centerline Next myspread = myspread & vbLf & bottomline Set rf = Range(セル).Font rf.Name = "MS ゴシック": rf.FontStyle = "標準": rf.Size = 11 rf.Parent = myspread: rf.Parent.ColumnWidth = (2 + colwidth * colcount) * 3 rf.Parent.RowHeight = (2 + RowHeight * rowcount) * 15 End Sub
641 名前:デフォルトの名無しさん [2007/08/16(木) 23:51:00 ] vlookupの関数でできると思います。 詳細はHELPを参照してください。
642 名前:デフォルトの名無しさん mailto:sage [2007/08/17(金) 22:54:06 ] とりあえず、客の名前と住所が入力されたシートがあるんですが、 膨大な数が入力されてます。 例えば、 「東京都新宿区西新宿」 などと住所を入力したら、その文字が含まれる列、行だけが 表示される、みたいな事って出来ますか?
643 名前:デフォルトの名無しさん mailto:sage [2007/08/17(金) 23:55:20 ] できます。
644 名前:デフォルトの名無しさん mailto:sage [2007/08/17(金) 23:56:45 ] >などと住所を入力したら、 どこに入力するの? 複数該当する時はどうするの? もっと詳しく具体的に! ってゆうか目的は何ですか? いずれにしても、VBAじゃないと出来ないと思う
645 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 00:05:36 ] 目的はわかるだろw
646 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 00:50:13 ] 顧客リストから自分の土地勘のある場所に住んでいる客を抽出して、ストークするんですね?
647 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 12:03:37 ] 何故Accessを使わない
648 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 21:18:47 ] 何故オートフィルタを使わない
649 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 13:39:36 ] 一つの列に順に大量のデータ(人名)を入力していくのですが その際、遊びで一人分入力するのにかかる時間を計るタイマーを ユーザーフォームで表示するというマクロを作っています タイマー部分はOnTime関数を使って基本はできたのですが セルに入力中はタイマーの時計表示が止まってしまいます 入力中はマクロの実行自体が止まってるようなんですが これを動かし続けることはできませんか? (入力して確定「後」にかかった時間を表示するのはできました)
650 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 14:14:45 ] Excelから切り離して動かせばいい 操作はウィンドウメッセージを使うことになるがそう面倒でもあるまい VBAの範疇を出る話なので、あとはご自分で
651 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 14:16:25 ] ユーザーフォームから入力すれば良いかも?
652 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 18:50:37 ] Dim time As Variant Function settime() As Variant time = Timer End Function Function gettime() As Double gettime = Timer - time End Function Private Sub Worksheet_Change(ByVal Target As Excel.Range) mytime = Format(gettime, "####.00") ThisWorkbook.Application.Caption = mytime End Sub Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range) settime End Sub
653 名前:649 mailto:sage [2007/08/19(日) 21:34:16 ] >>650 ありがとうございます。Excelから切り離すってことはVBかなんか使って別アプリにしてしまう ということですよね?VBA以外やったことないんですが・・・これを機に勉強しようかな >>651 ありがとうございます。 あくまで入力作業中のおまけというかアクセサリ的なものとして表示させておくつもりだったので その発想はなかったです。試しにやってみたらフォーム上のtextboxへの入力中ならちゃんと タイマーを表示するマクロも動き続けますね。とりあえずこの方法でやってみます。 >>651 わざわざコードまで書いてもらって恐縮です。 言葉足らずで申し訳ありませんでしたが、入力確定後にかかった時間を表示するだけじゃなく 入力中もかかってる時間を表示させ続けたいのです。
654 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 21:45:48 ] >>639 エラーでます
655 名前:デフォルトの名無しさん [2007/08/20(月) 02:39:20 ] こんな有用なスレがあったんですね。 早速ですが、1つ教えてください。 Excelで、次のようなことがしたいのですが、どのようにしたら良いでしょうか。 ・事前に、ユーザーが新規ブックを開いておく ・そのままの状態で(ボタンなどを押すことなく) ・PCのCOMポートから送られてくる文字を、順番にセルに書き出す。 ボタンを押して....のようなイベントの発生による関数の起動ではなく、 COMポートの受信割込発生をイベントとした関数の起動がしたいのです。 現在は、 シート上に作ったボタンを押すことで、セルに書かれた数字/文字を、PCのCOMポートからRS232Cで送り出したり、 同じくシート上に作ったボタンを押すことで、COMポートを開いて受信状態となり、 数字/文字を受信したら罫表に書き込んだり などは、結構何度も作っているのですが、 今回は、「ボタンを押さなくても」自動的に受信できないかと思うのです。 何か特別な方法が必要でしょうか、あるいは、VBAの関数にすでに用意されているのでしょうか? 宜しくお願いします。
656 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 06:35:04 ] Private Sub Workbook_Open() 処理 End Sub
657 名前:デフォルトの名無しさん [2007/08/20(月) 21:11:30 ] 1,エクセルの左側にあらかじめ設定している列を折りたためる、ボタンがあるシートがあるんですけど、 どのように設定すればいいのでしょうか? 2、functionを使用して、同じ計算式をマクロに計算させようとすると、5倍位時間がかかるようになりました。 どのような対策を取ればいいのでしょうか?
658 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 21:21:42 ] 1 そのまんま。そのボタンに列の表示非表示を切り替えるマクロを登録すればいいだけ。 2 ワークシート関数よりユーザー定義関数の方が遅いのは当然だが、そういうことじゃないのか? 違うなら日本語で質問してくれ。あとそのFunctionの内容も書くこと。
659 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 22:26:26 ] >>657 1.グループ化の事か?
660 名前:631 mailto:sage [2007/08/21(火) 01:22:25 ] 本やみなさんの意見を参考にしながら一応、出来たのですが Sub セル範囲を指定して格子罫線を引く() Dim Rng As Range Set Rng = Application.InputBox("セル範囲を指定してください", "セル範囲の指定", Type:=8) Rng.Borders.LineStyle = xlContinuous End Sub 少し、改造すれば、セル範囲を指定してセルの色を塗り替えるにもできます(せっかく、作ったので、良かったら参考にして下さい) これに、キャンセルしたときに「入力されませんでした」と表示するようにしたいのですが、どうもわかりません Sub セル範囲を指定して格子罫線を引く2() Dim jis As Range Set jis = Application.InputBox("セル範囲を指定してください", "セル範囲の指定", Type:=8) If jis <> "" Then Rng.Borders.LineStyle = xlContinuous else msgbox"シート名が入力されませんでした" End If End Sub 上のソースだとエラーになってしまいます お手数ですが、ご指導お願いします。
661 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 06:33:33 ] サンプル Dim returnData As Variant returnData = Application.InputBox("データを入力してください", Type:=1) If VarType(returnData) = vbBoolean Then MsgBox "キャンセルされました" Exit Sub End If MsgBox "処理を続行します"
662 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 06:58:45 ] >>660 インプットボックスメソッドはエラー処理が必要 On Error Resume Next Set jis = Application.InputBox("セル範囲を指定してください", "セル範囲の指定", Type:=8) On Error GoTo 0 こんな感じ。ヘルプ見てね! あと入力されなかった時はキャンセルにしてしまう場合 If jis Is Nothing Then Exit Sub
663 名前:662 mailto:sage [2007/08/21(火) 11:16:43 ] こんな感じかな? Sub セル範囲を指定して格子罫線を引く662() Dim Rng As Range Application.DisplayAlerts = False On Error Resume Next Set Rng = Application.InputBox( _ prompt:="セル範囲を指定後 [ OK ] を押して下さい。" _ & Chr(13) _ & "【セルを選択しないと [ OK ] は無効です。】", _ Title:="罫線を引くセル範囲を指定してください", _ Default:="", _ Type:=8) On Error GoTo 0 Application.DisplayAlerts = True If Rng Is Nothing Then MsgBox "中止します" Exit Sub Else Rng.Borders.LineStyle = xlContinuous End If End Sub
664 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 17:59:15 ] >>660 あなたにとって自慢したい自信作かもしれないけど?敢えて苦言を >本やみなさんの意見を参考にしながら一応、出来たのですが 何もしないで、OKまたはキャンセル押したらエラーになるよね? これは「出来た」には程遠い!糸口がみつかった程度。 エラーが出るうちは未完成ですね >(せっかく、作ったので、良かったら参考にして下さい) 恐らく参考にならないでしょう Sub セル範囲を指定して格子罫線を引く2() ←コンパイルした? 宣言してない変数があるんだけど。 >If jis <> "" Then これはマズイよね、"" は文字列だから、変数 jis が String じゃないとエラー起こす。
665 名前:657 mailto:sage [2007/08/21(火) 22:49:15 ] >>658 回答ありがとうございます。 1、については、>>657 さんの回答で要領を得ました。 2、ワークシート関数よりユーザー定義関数の方が遅くて当然との事ですが、 なんらかの方法で、処理速度を上げられないだろうかとかんがえております。 内容は、単純な関数です。(セル内に同じ計算を必要とするため、マクロ化を検討しています。)
666 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 23:28:34 ] >なんらかの方法で、処理速度を上げられないだろうかとかんがえております。 ワークシート関数を使え。 マクロ(VBA)でやりたいなら、ワークシート関数を空きセルに貼ってしまえ。
667 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 23:39:03 ] >マクロ(VBA)でやりたいなら、ワークシート関数を空きセルに貼ってしまえ。 遅いんじゃない? ワークシート関数をVBA上で使うと速いけど。 必要なデータは配列に格納し一気に処理(セル参照を頻繁にしないこと)が最速!
668 名前:デフォルトの名無しさん mailto:sage [2007/08/22(水) 00:13:58 ] >>667 そうだね 速度重視ならワークシート上で計算しない設定に。もちろん数式は使わない セル参照も最小限に。理想は、 シート上の必要なデータを配列に一気に格納、 結果は全て配列に格納し一気にシート上に書き込む
669 名前:631 mailto:sage [2007/08/22(水) 00:30:23 ] >>661-663 わざわざ、ソースを全部書いて頂いて、本当に申し訳ありませんでした お騒がせしました
670 名前:デフォルトの名無しさん mailto:sage [2007/08/22(水) 06:36:51 ] >>665 >内容は、単純な関数です。(セル内に同じ計算を必要とするため、マクロ化を検討しています。) 実際のコード晒してみれば? 具体的には、Cells( i ,j ) がコードに頻繁に出ると遅くなります。特にLoopの中は避けるべき。 私が始めて作った物は、データ取る為に2万回、書くために30万回、頻繁にCells( i ,j ) が... おまけに Selectしまくってましたので 処理が終るまで30分以上かかってましたが、つくり直したら20秒ほどで出来た!
671 名前:デフォルトの名無しさん mailto:sage [2007/08/22(水) 11:45:58 ] エクセルでバイナリエディタって作れますか?
672 名前:デフォルトの名無しさん mailto:sage [2007/08/22(水) 12:30:58 ] もちろん作れるよ
673 名前:デフォルトの名無しさん mailto:sage [2007/08/22(水) 18:03:10 ] >>672 ありがとう!
674 名前:657 mailto:sage [2007/08/22(水) 21:00:20 ] >>666 出来れば、マクロ内で処理したいと考えております。 シミュレーションファイルを作成中でして、他セルにも複雑な式が入っているので、 単純な関数なら、マクロに放り込んでしまいたいのです。 >>667 >>668 配列は考えていませんでしたが、計算結果を返すセルが決まってないため、ユーザ定義関数を使おうと思ったしだいです。 >>670 function A(b,c,d,e) b=(c+d)/2 A=b*e end こんな単純な計算を、10〜20個織り込み、かつシート上で近似値を算出する計算式を使っているので、 時間がかかります。
675 名前:デフォルトの名無しさん mailto:sage [2007/08/22(水) 21:20:16 ] >配列は考えていませんでしたが、計算結果を返すセルが決まってないため、ユーザ定義関数を使おうと思ったしだいです。 理由になってないんじゃない? 配列を拒否するなら私は手を引くよ!
676 名前:デフォルトの名無しさん [2007/08/22(水) 21:31:34 ] すみません。どなたかご存知でしたらお教えください。 VBAでsleepに該当する命令ってなんでしょうか? WSHで、WScript.sleep(250)みたいな感じでやっているんですが、 これをVBAでやりたいです。
677 名前:デフォルトの名無しさん [2007/08/22(水) 21:44:35 ] 319 名前:名無したん(;´Д`)ハァハァ[sage] 投稿日:2007/08/22(水) 16:08:34 ID:aEA9W/2t ttp://kissho2.xii.jp/20/src/2yoshi2512.7z.html 目欄 344 名前:名無したん(;´Д`)ハァハァ[sage] 投稿日:2007/08/22(水) 18:55:20 ID:YevU/rPG >>319 はウイルス。拡張子が怪しすぐる らき☆すた 27 sakura03.bbspink.com/test/read.cgi/ascii2d/1187586266/
678 名前:デフォルトの名無しさん [2007/08/22(水) 21:56:37 ] >>676 標準モジュールに Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
679 名前:デフォルトの名無しさん [2007/08/22(水) 22:07:05 ] >>678 ありがとうございます。できました。 こんなテクあるんですね。勉強になりました。
680 名前:デフォルトの名無しさん mailto:sage [2007/08/22(水) 22:08:37 ] >>657 オレも >>656 Timer関数
681 名前:デフォルトの名無しさん mailto:sage [2007/08/22(水) 22:10:12 ] ↑誤爆
682 名前:デフォルトの名無しさん [2007/08/22(水) 22:39:11 ] 恐れ入ります、質問を失礼します。 Dim st4 As String Dim r1 As Range, st4 = Mid(r(1).Offset(2).Value, 5, 10) & "-" & Mid(r(1).Offset(3).Value, 2, 10) こんな感じで13-1とか2-9といったst4にしたいのですが、 -の後が空欄の時があります。 そういったときは13-のようになってしまいますが、 -の後が空欄の時は13といったように-も表示させたくないです。 こういったことは可能でしょうか?
683 名前:デフォルトの名無しさん mailto:sage [2007/08/22(水) 23:03:57 ] 可能です - は変数ハイフンに入れる Dim ハイフン As String 3個の文字列を無条件で&で結合せず IFで条件分岐してから結合すればよい ハイフン = "-" If Mid(r(1).Offset(3).Value, 2, 10) = "" then ハイフン = "" st4 = Mid(r(1).Offset(2).Value, 5, 10) & ハイフン & Mid(r(1).Offset(3).Value, 2, 10)
684 名前:デフォルトの名無しさん [2007/08/22(水) 23:12:03 ] >>683 おお、できましたぁ!!ありがとうございます!!! これでボクの仕事がかなり減りました、感謝です♪
685 名前:デフォルトの名無しさん mailto:sage [2007/08/22(水) 23:16:40 ] while ブロックで breakって出来ないの?
686 名前:デフォルトの名無しさん mailto:sage [2007/08/22(水) 23:47:11 ] Exit使えよカス
687 名前:デフォルトの名無しさん mailto:sage [2007/08/22(水) 23:53:55 ] か、かすう? この俺様に向かって!
688 名前:デフォルトの名無しさん [2007/08/23(木) 00:06:25 ] いつもお世話になります、1点質問を失礼します。無理やり上司から頼まれましたが、自分には無理難題です。 @もし○○○○の後7文字全てが半角英数字だったら、このセルの5文字目〜半角スペースに当たるまでをコピー、「α」とする 例 ○○○○0120123456 ○ ↓ α=0120123456 ○○○○の後7文字に1文字でも全角文字が入っていたら、○○○○の一つ下の行の先頭から半角スペースに当たるまでを全てコピー「α」、さらに2つ下の行の先頭から「か」という文字に当たるまでをコピー、さらに○○○○から先の文字全てを繋げ「β」とする ○○○○あい12うえおあい 0120789123 ○○ Aか ↓ α=0123789123 β=Aあい12うえおあい できればifでやりたいんですが、 Dim α As String, β As String Dim r(1) as range '○○○○の行がr(1)とします If Mid(r(1).Value, 5, 7) = 全部半角英数字 Then α=Mid(r(1).Value, 5)から" "まで Else α=r(1).Offset(1).の先頭から半角スペースに当たるまで全て β=r(1).Offset(2).の先頭から「か」に当たるまでをコピー&Mid(r(1).Value, 5, 99) End if すいません、自分ifの文に弱いものでかなり違うかもしれませんが、こんなマクロにしたいのです。宣言とかの理論は理解してます。お手数ですが、よろしくお願いします。
689 名前:デフォルトの名無しさん mailto:sage [2007/08/23(木) 00:21:56 ] >>688 >>7 文字全てが半角英数字 これって、記号類や半角カナはどうする? とりあえず、半角・全角の判定だけでいいか? それとも、英数字に限定?
690 名前:デフォルトの名無しさん mailto:sage [2007/08/23(木) 00:30:25 ] とりあえず、半角・全角の判定のやり方だけど、 VBAには文字列の長さを調べる関数が3つある。 Len()、LenB()、LenMbcs() の3つ。 Len()とLenMbcs()の結果が同じ→全部半角 Len()とLenMbcs()の結果が違う→全角を含む と判定できる。 ただし、LenMbcs()はVBAには実装されてなくて、自分で書かないといけない。 書き方はMSDNに紹介されてる。 office.microsoft.com/en-us/access/HA012288741033.aspx Function LenMbcs (ByVal str as String) LenMbcs = LenB(StrConv(str, vbFromUnicode)) End Function LenMbcs()は、半角で1、全角で2を返す関数。
691 名前:デフォルトの名無しさん [2007/08/23(木) 00:35:39 ] >>689 失礼しました。 半角数字のみの時です、全角や記号や半角カナは×です。
692 名前:デフォルトの名無しさん mailto:sage [2007/08/23(木) 00:50:08 ] 'とりあえず、文字列strが数字かどうか判定する関数。 もっと少ない行数の書き方もあるんだが、あえてわかりやすく書いてみた。 Function IsNumberString(str As String) As Boolean Dim i As Integer Dim c As String Const Number = "0123456789" For i = 1 To Len(str) c = Mid(str, i, 1) If InStr(1, Number, c, vbBinaryCompare) > 0 Then 'c が数字だったので何もしない Else 'c が数字ではなかった IsNumberString = False Exit Function End If Next i IsNumberString = True End Function
693 名前:デフォルトの名無しさん mailto:sage [2007/08/23(木) 00:57:23 ] 'strの中にある半角スペースを探して、 'その手前までをコピーする関数。 Function LeftEx(str As String) As String Dim i As Integer i = InStr(1, str, " ", vbBinaryCompare) LeftEx = Left(str, i - 1) End Function
694 名前:デフォルトの名無しさん [2007/08/23(木) 21:25:50 ] 今週からエクセルを使う仕事に就いて昨日マクロにはじめて触れた 初心者で申し訳ないのですが ワークシートが2〜32まであり 各ワークシートのたとえばB5に以下のように入力したいのですが ワークシート2のB5に2007/8/1 ワークシート3のB5に2007/8/2 : ワークシート32のB5に2007/8/31 For sht = 2 To 32 Worksheets(sht).Select Range("B5").Select ActiveCell.FormulaR1C1 = "8/1/2007" + (sht-2) Next sht End Sub これでは当然駄目でした。 今週末になれば自分で勉強しますが できれば明日使いたいので よろしければ教えてくださいませ何卒
695 名前:デフォルトの名無しさん mailto:sage [2007/08/23(木) 22:03:21 ] 俺の都合に合わせて、即答しやがれ糞共!! ってわけですか まぁそういうこと言う奴でも、こういう簡単な質問は 答えたくてウズウズしてる教えたがり厨が答えてくれるだろうけどw
696 名前:デフォルトの名無しさん mailto:sage [2007/08/23(木) 22:08:02 ] Microsoft Access VBAの質問もここでおk? Accessのスレないんだものorz
697 名前:657 mailto:sage [2007/08/23(木) 22:45:14 ] >>675 失礼しました。
698 名前:デフォルトの名無しさん mailto:sage [2007/08/23(木) 22:45:18 ] >>696 moug に逝った方がいいんじゃね?
699 名前:デフォルトの名無しさん mailto:sage [2007/08/23(木) 23:46:18 ] 質問させてください。 VBA使って簡単な画像処理をしたいのですが、 画像の輝度値を求める関数って無いのでしょうか? よろしくお願いします。
700 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 00:31:35 ] >>695 わざわざ質問スレに出張ってきて こんな簡単な質問答えるやつは、 教えたがり厨だ!! ってわけですか?
701 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 01:08:05 ] >>694 未テストだがこんな感じ Public Sub SheetLoop() Dim wksSheet As Worksheet Dim dtDate As Date Dim intOffset As Integer Dim strbuf As String dtDate = "2007/08/01" For Each wksSheet In ThisWorkbook.Worksheets strbuf = wksSheet.Name If 2 <= CInt(strbuf) And CInt(strbuf) <= 32 Then wksSheet.Cells(5.2).Value = Format$(dtDate + intOffset, "yyyy/mm/dd") intOffset = intOffset + 1 End If Next Set wksSheet = Nothing End Sub
702 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 01:24:03 ] >>701 の注意点 シートの名称がイマイチ意味不明なのでとりあえずcintしたが、 これがSheet1とかのパターンが出てくると間違いなくエラーになるので、 isnumericで事前に回避するか、Sheet1系統でOKの場合は "Sheet"&カウントで文字列連結してstrcompで見てやる必要がある。 今後の注意点 ・1文字変数は使わない ・Activate,Select系は使わずオブジェクト経由でアクセスすること ・A1形式は極力使わない ・上記に伴いRangeを使う場面ではCellsで展開してから使用する ・セルに入れる値が日付や文字列や数値など、フォーマットが決まっている場合は 表示形式をNumberformatなどで事前に指定してやる
703 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 01:32:20 ] >>702 これって2月とかエラーにならね? 普通にDateAdd使えば?
704 名前:703 mailto:sage [2007/08/24(金) 01:33:57 ] うっは流し読みしすぎた >dtDate = "2007/08/01" で8月限定にしてんのか。すまん
705 名前:デフォルトの名無しさん [2007/08/24(金) 02:46:23 ] X軸の数値 Y軸の数値 0 -1.5e-9 10 2.5e-8 20 4e-8 30 5e-7 40 6e-5 50 9e-3 のようなデータををX軸は普通、Y軸を対数にしてグラフ化しようとすると、 負の数を入力しようとしています。対数には負の数が入りませんとかエラーが 出ます。(それは当然分かります) 強行すると、この場合、X軸が0の場合を除いてグラフにしてくれます。 動作としてはそれで問題ないのですが、大量にグラフを作成しようとすると、 毎回エラーが出てうざったいのです。なんとかエラーメッセージを消去 して出なくしたいのですが、いい方法はないでしょうか。
706 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 02:53:19 ] >>705 事前に負の値を取り除く。
707 名前:705 [2007/08/24(金) 03:00:08 ] >>706 やはり、そういう感じでやるしかないのですか・・・ 今はABSで絶対値にして逃げてるのですが。
708 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 05:38:20 ] そもそも負の値をとりうるデータを対数変換するってデータ処理としてどうよ?
709 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 07:38:02 ] >>707 それはおかしいだろう。対数を取りたいってことは負値はIllegalなんでないの? 或いは全体にオフセットを足すべきだったりはしない?
710 名前:デフォルトの名無しさん [2007/08/24(金) 11:13:05 ] EXCEL VBAでフォームを使用して、ユーザーに ファイルを選択してもらう仕組みを作りたいんですが可能でしょうか? 「参照」ボタンを用意して、ユーザーがクリックすると フォルダ内のファイルが一覧表示されて、指定できるようなイメージです。
711 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 12:05:25 ] 出来ますよ 必要なコントロールを配置して > 「参照」ボタンを用意して、ユーザーがクリックすると > フォルダ内のファイルが一覧表示されて、指定できる をコードにすれば良いだけです
712 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 12:06:32 ] >>710 Dialogsオブジェクト
713 名前:710 mailto:sage [2007/08/24(金) 13:12:05 ] >>711 ,712 ありがとうございました! ちょっと調べてみます!!
714 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 22:40:24 ] "俺の関数"というファイルにあるテーブルをVlookupした値を加工するユーザー定義関数を、"俺の関数.xla"の標準モジュールに作成しました。 他のファイルから"俺の関数"アドインを有効にしてみましたが、利用できません。どうすればいいですか? Public Function 俺の関数(key) fjFilename = "D:\Settings\俺\Application Data\Microsoft\AddIns\俺の関数.xla" 俺の関数 = WorksheetFunction.VLookup(key, Workbooks(fjFilename).Range("テーブル"), 2, 0)+1+2+3 End Function
715 名前:デフォルトの名無しさん mailto:sage [2007/08/25(土) 10:10:50 ] >>710 Application.GetOpenFilename
716 名前:デフォルトの名無しさん [2007/08/26(日) 09:28:40 ] sv2.st-kamomo.com/loader/dat/file17227.42952.jpg ↑ 競馬の出走馬が並んだデータなのですが これをレースごとに他のシートにコピペすることはVBAで可能でしょうか? ちなみにレース場所は毎回異なります。
717 名前:デフォルトの名無しさん [2007/08/26(日) 09:33:42 ] 可能
718 名前:デフォルトの名無しさん [2007/08/26(日) 09:34:33 ] >>717 可能だとするとどう命令すべきでしょうか?
719 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 09:41:35 ] >>718 「やれ!」
720 名前:デフォルトの名無しさん [2007/08/26(日) 09:47:09 ] (・c_・` )ソッカー
721 名前:716 [2007/08/26(日) 11:23:09 ] マクロではできましたが今週の競馬開催の場所が毎回変わりますから そこができないですね・・・
722 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 11:50:17 ] 出来るけど、何か? 君が出来ないなら努力不足
723 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 11:54:41 ] >これをレースごとに他のシートにコピペすることはVBAで可能でしょうか? ↓ これをレースごとに他のシートにコピペすることはVBAで可能ですが、 どうやったらいいでしょうか?
724 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 12:09:18 ] マクロまでできたらそのマクロをいじれ どういじればいいかは学べ
725 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 12:20:18 ] 手でコピペは出来るんでしょ。 レースごとに分割する基準は何? それをマクロに書けばいいだけ。
726 名前:デフォルトの名無しさん [2007/08/26(日) 12:23:37 ] >レースごとに分割する基準 場所+レース番号 例) 札幌 9 または 馬番1〜大外枠 ・・・
727 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 12:45:05 ] まずシートを作って Sheets.Add ActiveSheet.Name = 場所+レース番号 例) 札幌 9 あとは判るだろ
728 名前:デフォルトの名無しさん [2007/08/26(日) 12:53:39 ] >>727 いやそれは分かるんだけどさ 競馬って毎週「札幌」があるわけじゃないのよ 10箇所以上の場所から2つ3つあるわけで・・・
729 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 13:04:45 ] 変数 ヘルプ これ以上書くことないな!
730 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 14:25:56 ] VBAマスターするコツってありますか? 反復演習・努力ですかね?
731 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 14:29:24 ] そもそも何を持ってマスターしたと言えるのか 誰もわからない(あるいは人によってマスターの基準が大きく異なる)ので、 誰もマスターしたなんて言わない。
732 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 14:53:26 ] 初心者用の1冊をマスターしても実用性はないよな
733 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 16:24:13 ] 最初は初心者用の入門書のとおりに実際に動かしてみる。 (一週間程度) 次は、簡単なオリジナルのコードを沢山作る。その際 他人に質問しないで自力で検索したりヘルプを見たりする。←最も重要 同時にVBA掲示板を閲覧し自分のレベルにあった質問で勉強する。 未だ、自分で質問はしない方が良いと思う。 (一ヶ月程度〜数年以上) そのうち、ヘルプを見れば理解できるようになる。このレベルになれば 他人に質問しても相手に失礼じゃないと思う。 スクール行ったって資格は取れるかもしれないが実力がつくとは限らない。 やる気があれば独学で十分だとおもう。
734 名前:デフォルトの名無しさん [2007/08/26(日) 16:46:44 ] 俺の頭脳じゃ100年経ってもできないっぽい 実現させるには達人に出会ってお金を出して作ってもらう他ないな・・・
735 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 18:08:50 ] >>733 それ以前に、一般機能をひと通り理解してないと無理じゃない?
736 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 18:14:25 ] 何を馬鹿なことを… 初心者用の本は斜め読み。 必要そうなとこだけを重点的に。 使いたいときだけさっと調べ(本屋、GOOOOOOOGLE) 出来そうじゃなかったらあきらめる。(どうしてもVBAでMSNメッセンジャー作りたいんです >< )
737 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 18:26:56 ] VBA本は初心者本ばかりか上級者向けとされている本ですら、 変数の命名規則が不明(どころか明示すらしない)だとか、見やすいコーディングを 考えないとか、速度に触れていないとか、後始末を省略してるとか、コレクションとか クラスの使用法が全く記載されてないとか、そんなのばっかだから、その手の本の まんまのコーディングはあんまり業務としての実用性はない Excelレガシー問題ってこういう本の氾濫が大きいと思う 結局、リファレンスだけあればいいってことになる
738 名前:デフォルトの名無しさん [2007/08/26(日) 18:35:13 ] 初心者はプログラム自体にとっつきにくさと わかりづらさから飽きがきやすいので かなり偏った内容でも、とにかく楽しく、とにかく簡単で 実際にプログラミングしてみて動かせるような本が好ましい。 サンプルのついた本は腐るほどあるけど 一生使いもしないような題材だと萎えるから そこのとこも吟味してほしい。
739 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 18:40:28 ] だからこそ>>736 なんだが。 それにね、途中で興味がなくなったらそれはそれでいいんだよ。 VBAは何かの手段であって目的じゃないはず。 C++やc#でもやればいいんだよ。
740 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 20:57:33 ] >>735 そうですね。 一般機能のIF関数やVLOOKUPを使いこなせない人は苦労しそうだね?
741 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 21:36:12 ] 自分に降りかかる/手が出せる範囲の仕事で滞りなく使えること。 VB「A」なら、↑でマスターしたって言っていいでしょ。 ということは「自分の仕事でVBA使って自動化/効率化したいこと」が 最高の教材になるんじゃないか? 職業プログラマの人は知らんけど。 もしそうなら別の言語マスターした方がよさそうだし。
742 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 21:43:30 ] VBAは簡単なのがいいね C言語に何度も挫折した俺でも使える VBにステップアップしようとしたけど.NET何たらになってて よくわからなくて結局VBAに戻ってきた
743 名前:デフォルトの名無しさん [2007/08/26(日) 22:12:14 ] With Worksheets(1).Range("a1:a500") Set c = .Find(2, lookin:=xlValues) If Not c Is Nothing Then firstAddress = c.Address Do c.Value = 5 Set d = Worksheets(2).Range("a1:a500").Find(2, lookin:=xlValues) Set c = .FindNext(c) Loop While Not c Is Nothing And c.Address <> firstAddress End If End With Loopんところでオブジェクトが無いとかって エラーになるんですけどなんでですか? 途中で違うFindするとcの方のFindが無効になっちゃうのでしょうか?
744 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 23:13:40 ] ちゃんと例外処理しろよ
745 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 23:22:45 ] Loop While Not c Is Nothing And c.Address <> firstAddress 両方評価してからアンドの評価するからアウト
746 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 06:58:40 ] きたねーコードだな
747 名前:743 [2007/08/27(月) 09:52:45 ] >743ですが、Findのヘルプに載っている 使用例に下記一行を加えただけです。 Set d = Worksheets(2).Range("a1:a500").Find(2, lookin:=xlValues) この一行が無ければ、動きます。 この一行を追記しただけでエラーになる理由が知りたいです。
748 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 12:55:18 ] なんで解らないのかが知りたいです。
749 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 14:11:31 ] >>747 むしろヘルプをコピっただけで エラーになる俺に動く方法を教えてけれ >c.Value = 5 をコメントアウトしないと >Loop While Not c Is Nothing And c.Address <> firstAddress のところで cがNothingだから c.Addrssがエラーになる Loopのなかに If c Is Nothing Then Exit Do とか入れれば問題ないけど これってヘルプが間違ってんの? それとも条件しだいでは問題ないの?
750 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 14:34:19 ] >>743 > Loopんところでオブジェクトが無いとかって > エラーになるんですけどなんでですか? エラーメッセージを正確に書き写せばいいのに。 簡単な英語もわからないと不便だね。
751 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 18:21:56 ] エラーって日本語だろ?
752 名前:デフォルトの名無しさん [2007/08/27(月) 20:16:40 ] 屁理屈ばっかごねてるヴァカ
753 名前:デフォルトの名無しさん [2007/08/28(火) 20:15:47 ] Excelのオートフィルタ機能を関数で表したいと思うのですが可能でしょうか 教えて下さい
754 名前:デフォルトの名無しさん mailto:sage [2007/08/28(火) 22:05:01 ] ググレカス
755 名前:デフォルトの名無しさん mailto:sage [2007/08/28(火) 22:05:53 ] >>753 > 可能でしょうか お答えします、可能です やり方は自分で調べてください
756 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 09:31:53 ] これを日本語訳に直してもらえないでしょうか? Sub TTT() Dim iR As Integer, iT As Integer, iK As Integer, iM As Integer For iR = 1 To Cells(1, "A").SpecialCells(xlLastCell).Row Select Case Cells(iR, "A") Case "高橋" iT = iT + 1 Sheets("高橋").Cells(iT, "A") = Cells(iR, "A") Sheets("高橋").Cells(iT, "B") = Cells(iR, "B") Case "亀井" iK = iK + 1 Sheets("亀井").Cells(iK, "A") = Cells(iR, "A") Sheets("亀井").Cells(iK, "B") = Cells(iR, "B") Case "道重" iM = iM + 1 Sheets("道重").Cells(iM, "A") = Cells(iR, "A") Sheets("道重").Cells(iM, "B") = Cells(iR, "B") End Select Next End Sub
757 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 09:38:03 ] 潜水艦TTT() 薄暗さ、不-、整数、それ、整数、整数としてのiK、不-、整数 セル(1、「A」).SpecialCells(xlLastCell)の.Rowの選んだケースセルへの不- =1、(不-、「A」) ケース"高橋" それ=それ、+1 シート("高橋").Cells、(それ、「A」) =セル(不-、「A」) シート("高橋").Cells、(それ、「B」) =セル、(不-、「B」) ケース"亀井" iK iK=+1 シート("亀井").Cells(iK、「A」)=セル(不-、「A」) シート("亀井").Cells(iK、「B」)=セル、(不-、「B」) ケース"道重" 不-=不-+1 シート("道重").Cells、(不-、「A」) =セル(不-、「A」) シート("道重").Cells、(不-、「B」) =セル、(不-、「B」)終わりは次の終わ りの潜水艦を選択します。
758 名前:デフォルトの名無しさん [2007/08/29(水) 10:27:52 ] 日本語になってねー
759 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 10:43:53 ] 逆に言えば元の756だって英語か何かになっていたかというと、そうではないということ。 それはVisual Basicという言語なのだから。
760 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 10:53:21 ] それ以前に756動作しないし? 俺も釣られた?
761 名前:デフォルトの名無しさん [2007/08/29(水) 12:42:40 ] >>760 元々別のシートにあるデータをコピペする動作だからね マジで>>756 どう構造か教えて欲しい TTT というのは任意のタイトルだよね Dim iR As Integer は整数型の変数の宣言だよね その後のTo Cells とか SpecialCells(xlLastCell).Row とかが分からん
762 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 12:47:13 ] 元のワークシートから名前別のワークシートにA列とB列の値を転記してるだけやん
763 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 13:54:32 ] >>756 Cells プロパティの記述が変体的?
764 名前:デフォルトの名無しさん [2007/08/29(水) 14:09:33 ] ダメだ全然ワカンネ VBAの初心者向きの本も理解できねぇ('A`)
765 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 14:33:56 ] VBAでプログラムを勉強しようとするのは無謀だな VBの知識があってマクロ記録のソースから覚えれば早い
766 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 14:34:40 ] 初心者向きなのに解かりづらい本が多いからね。 ↓ こっちのサイトが私にはわかりやすい。 ttp://www6.plala.or.jp/MilkHouse/index.html
767 名前:デフォルトの名無しさん [2007/08/29(水) 14:50:44 ] VBAって今後どうするの? フォーマットが公開されていないファイルは、 政府も使わないと言っている。2007でXMLも標準になったが、マクロが 仕込んであるのでは、公的には使えなくなるんじゃないのかな?
768 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 16:13:18 ] > 政府も使わないと言っている。 騙されてる奴が多いが「使わない」とは言ってない 国のやるポーズには、必ず逃げ道仕込んでおくものさw
769 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 18:31:56 ] 通常VBA含んだExcelを他に配ったりしないんじゃないの? 自分の仕事を効率化するために使ってる人が大部分じゃない? 私は他人の作ったロックしたマクロを使ったことないし使うつもりも無い。
770 名前:デフォルトの名無しさん [2007/08/29(水) 21:34:34 ] 恐れ入ります、質問をお願いします。 会社でエクセルのマクロを使用していますが、困っています。 現状、共用ドライブにエクセルファイルを格納し、5人で使用しています。 使用する際は、それぞれ一人一人にパソコンが支給されており、支給された個人のパソコンから共用ドライブにアクセスし、入力 しています。 こういった状況で、マクロで入力する際、人の名前(入力者の名前)を自動的に取得、エクセル表の任意の場所に貼り付けすることはできないものでしょうか? winXP エクセル2000です。
771 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 21:57:06 ] 出来るんじゃないかな?ユーザー名を取得し履歴のように日時と一緒に書き込んだり 入力したセルのコメントに日時とユーザー名を記録する事も。
772 名前:デフォルトの名無しさん [2007/08/29(水) 23:05:23 ] EXCELでVBAでDLLを使う場合、 そのDLLをxlsファイル内に埋め込む方法はありませんか?
773 名前:デフォルトの名無しさん [2007/08/29(水) 23:16:04 ] ActiveSheet.OLEObjects.Add( Filename:= "C:\Documents and Settings\Administrator\デスクトップ\xxx.dll", Link:=False, DisplayAsIcon:=False).Select これはxlsファイル内にdllを保存するということでいい? このファイルを外部に保存するにはどうしたら・・・
774 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 23:34:31 ] >>770 Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long
775 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 23:37:36 ] >>772 ない。DLLはDLL。 素直にDeclare宣言して関数使いましょう。
776 名前:デフォルトの名無しさん [2007/08/29(水) 23:44:06 ] >>775 宣言など使い方は通常通りでいいんだけど 配布ファイルが複数になるのが駄目なんだ xls内にdllを保存し、 起動時にdllをカレントフォルダに保存。 dllを使った処理を行い、 終了時にdllを削除。 っていう流れがやりたい。
777 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 23:50:02 ] >>776 > xls内にdllを保存し、 これの意味が分からん。保存ってなんだ? LoadLibraryしてFreeLibraryすりゃいいんじゃね? そういう話じゃない?
778 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 23:51:09 ] ついでだ。 #If Win32 Then Private Declare Function LoadLibraryEx Lib "Kernel32" Alias "LoadLibraryExA" _ (ByVal lpLibFileName As String, _ ByVal hFile As Long, _ ByVal dwFlags As Long) As Integer Private Declare Sub FreeLibrary Lib "Kernel32" (ByVal hLibModule As Integer) #Else Private Declare Function LoadLibrary Lib "kernel" (ByVal f$) As Integer Private Declare Sub FreeLibrary Lib "Kernel" (ByVal h As Integer) #End If
779 名前:デフォルトの名無しさん [2007/08/29(水) 23:57:50 ] >>777 A.xlsはマクロでB.dllを使用しています。 A.xlsを利用するためには同(又はパスの通った)フォルダにB.dllを置く必要があります。 ですが、 A.xlsの配布時にB.dllを同時に配布すればいいんですが、それは運用的に無理です。 また、ファイルの移動(複写)をする場合には、A.xlsのみの移動(複写)でシステムが動くようにする必要があります。 なので、 A.xls内にB.dllを埋め込み、実行時それをファイルとして抽出保存し、利用する必要があります。
780 名前:デフォルトの名無しさん mailto:sage [2007/08/30(木) 00:03:16 ] いや、DLLはDLLなんだからファイル自体別。 埋め込むってのがよく分からんが、 DLLの配布がNGなら DLLの関数をVBAで組めばいいって話じゃ済まないの? 要するに、DLLは無くして全部VBAで書けって話。 ダメなん?
781 名前:デフォルトの名無しさん mailto:sage [2007/08/30(木) 00:07:13 ] >A.xls内にB.dllを埋め込み テキストとしてシートに書くって事か?
782 名前:デフォルトの名無しさん mailto:sage [2007/08/30(木) 00:08:55 ] とりあえず目的をはっきりさせてくれんと分からん。 DLLの配布が目的なのか、マクロの動作が目的なのか、それともその他、どれだ?
783 名前:デフォルトの名無しさん [2007/08/30(木) 00:15:45 ] VBAで処理書くのは最後の手段。出来れば避けたい DLLの関数を使いたい。 メールの添付ファイルみたいにxls中にdllを入れて、 マクロでそれを、dllファイルに書き出して利用したい。 メールはbase64だっけ マクロの動作が目的
784 名前:デフォルトの名無しさん mailto:sage [2007/08/30(木) 00:18:47 ] オブジェクトの挿入でファイルを添付できるんじゃね?
785 名前:デフォルトの名無しさん mailto:sage [2007/08/30(木) 00:20:24 ] そういうことか。 でもExcelで出来るのかは怪しいな。
786 名前:デフォルトの名無しさん mailto:sage [2007/08/30(木) 00:22:00 ] ぶ オブジェクトの挿入で出来たぞ ちょっと目鱗
787 名前:デフォルトの名無しさん [2007/08/30(木) 00:23:02 ] >>784 添付はできてるんだけど、マクロでそれをファイルに保存ができない
788 名前:デフォルトの名無しさん mailto:sage [2007/08/30(木) 00:45:33 ] 実を言うと、俺も772と同じことを以前やろうとしたんだが、無理だった。 DLLを.xlsファイルに埋め込むことは出来るし、動的にDLL作成することもできるんだけど、 その中から関数を呼び出す方法が無くて。 Declare Function〜は、マクロ実行時にDLLが無いとエラーになるので使えない。 Cなら動的にLoadLibrary()→AddressOf()って方法もあるんだが、VBAの場合、 AdressOf()はコールバックのアドレスにしか使えなくて。 .xlsに埋め込んだ方法だけど、標準モジュールの中に何かの変数(配列)として入れておいた。 それで、実行時にファイルとして書き出す。dllが小さかったから出来た方法だけどね。
789 名前:デフォルトの名無しさん [2007/08/30(木) 00:52:07 ] 標準モジュールの中に何かの変数(配列)として入れておいた。 それで、実行時にファイルとして書き出す。 ここ詳しく教えて @バイナリデータとして入れておいて Aバイナリ書き出しでdll作成?? @がよく分からん
790 名前:デフォルトの名無しさん [2007/08/30(木) 00:52:55 ] 今日はもう落ちるんで、朝確認します よろしくおねがいします
791 名前:デフォルトの名無しさん mailto:sage [2007/08/30(木) 02:39:36 ] hisazin-up.dyndns.org/up/src/42670.xls このエクセルファイルの中にtest()ってマクロがあるから、実行してくれ。 デスクトップにasakusa.jpgっていう画像ファイルができる。 仕組みはソース読め。
792 名前:デフォルトの名無しさん [2007/08/30(木) 07:50:46 ] >>791 落ちてるorz 長持ちするとこに再うpおねがいします
793 名前:デフォルトの名無しさん mailto:sage [2007/08/30(木) 09:01:23 ] >>788 そういうときにはCallWindowProcとかEnumWindowsとかを使えばいいんだよ。
794 名前:デフォルトの名無しさん mailto:sage [2007/08/30(木) 09:21:12 ] >>791 はウィルス? ファイルは存在してるがブロックされる
795 名前:デフォルトの名無しさん mailto:sage [2007/08/30(木) 12:01:12 ] >>792 普通に保存できたよ
796 名前:デフォルトの名無しさん [2007/08/30(木) 17:32:03 ] VBAの変数って多次元の連想配列って無理? PHP的に書くと $hensu['mojiretsu1'][0] $hensu['mojiretsu2'][1] みたいな
797 名前:デフォルトの名無しさん mailto:sage [2007/08/30(木) 17:44:55 ] collectionにcollectionを格納すれば可能 ちょっと辛いけど
798 名前:デフォルトの名無しさん mailto:sage [2007/08/30(木) 17:45:13 ] PHPは知らんからVBA的に書いてくれ
799 名前:デフォルトの名無しさん [2007/08/30(木) 17:57:27 ] >>797 うええめんどくせえ DBのSELECT用の関数とかみんなどうやってんだ $serectData[フィールド名][0] みたいに使えないんでしょ? >>798 hensu("mojiretsu", 1) みたいな感じかなあ
800 名前:デフォルトの名無しさん mailto:sage [2007/08/30(木) 18:41:36 ] const mojiretsu=0 as integer でいいじゃん
801 名前:デフォルトの名無しさん [2007/08/30(木) 19:31:39 ] >>791 これはとりあえず出来ました。 ただ、 340kbのDLLが.basにすると700kbくらいになって それを300kb弱のxlsに入れて保存すると1300kbになって それを他のシートの値を変更して、上書き保存すると2700kbになったorz DLLをxlsにOLEオブジェクトで追加して ActiveSheet.Shapes("Object 1").Copy ってやるとクリップボードにDLL保存出来て、 手作業でどこかのフォルダに貼り付けは出来たんだけど、 それをマクロでやる方法が見つからなかった。 どなかた教えてください。
802 名前:デフォルトの名無しさん [2007/08/30(木) 20:07:43 ] マクロで、オートフィルターの選択を、「すべて」にするようにしたいです。 Selection.AutoFilter Field:=5 でいいのでしょうか?最後の数字の意味がわかりません。
803 名前:デフォルトの名無しさん [2007/08/30(木) 20:50:50 ] >>799 WSHのDictionaryObject使うと似たようなことはできると思ったよ ただ凄く遅かったのと、Vbaからは使ったこと無いので自分で調べてみてくれ
804 名前:デフォルトの名無しさん mailto:sage [2007/08/30(木) 22:05:39 ] >>802 F1でヘルプな
805 名前:デフォルトの名無しさん mailto:sage [2007/08/30(木) 22:20:58 ] Dictionaryは使いにくいので書き換えを伴うときはVariant配列にしてしまう 参照用だけならCollectionで決まりなんだけどねぇ
806 名前:デフォルトの名無しさん mailto:sage [2007/08/30(木) 22:50:33 ] もしご存知でしたら教えてください。 Findメソッドに関してなのですが、検索対象に"/"が文字列間に 含まれていると検出してくれません。 例:2007/8/30 など "/"単体だと検出してくれるのですが、、 これはこのメソッドの使用なのでしょうか? ぐぐってみたのですが参考になるようなものをみつけれなかったので。。
807 名前:デフォルトの名無しさん mailto:sage [2007/08/30(木) 22:59:11 ] >2007/8/30 文字列じゃないだろ?検出しなくて当然!
808 名前:デフォルトの名無しさん [2007/08/30(木) 23:09:34 ] VBAでクリップボードにコピーされてるDLLをファイルに落とす方法はありませんか?
809 名前:デフォルトの名無しさん mailto:sage [2007/08/30(木) 23:17:42 ] >>807 ありがとうございます。 テキストボックスに入力された日付をString型の変数に格納したのですが 文字列にはならないのでしょうか? 2007:OK /:OK 2007/:文字列型じゃない、、 一度SplitしてからFindすることにします。。
810 名前:デフォルトの名無しさん mailto:sage [2007/08/30(木) 23:25:27 ] ___ ./ \ .| ^ ^ | あまり私をやらせない方がいい | .>ノ(、_, )ヽ、.| __! ! -=ニ=- ノ!___ /´ ̄ ̄ .|\`ニニ´/ `ヽ ,.、-  ̄/ | l  ̄ / | |` ┬-、 / ヽ. / ト-` 、ノ- | l l ヽ. / ∨ l |! | `> | i / |`二^> l. | | <__,| | _| |.|-< \ i / ,イ____!/ \ .| {.| ` - 、 ,.---ァ^! | | ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄l __{ ___|└―ー/  ̄´ |ヽ |___ノ____________| }/ -= ヽ__ - 'ヽ -‐ ,r'゙ l | __f゙// ̄ ̄ _ -' |_____ ,. -  ̄ \____| | | -  ̄ / | _ | ̄ ̄ ̄ ̄ / \  ̄| ___`\ __ / _l - ̄ l___ / , / ヽi___.|  ̄ ̄ ̄ | _ 二 =〒  ̄ } ̄ / l | ! ̄ ̄| _______l -ヾ ̄ l/ l| |___|
811 名前:デフォルトの名無しさん mailto:sage [2007/08/30(木) 23:44:08 ] >>808 またおまえか
812 名前:デフォルトの名無しさん [2007/08/31(金) 08:08:37 ] >>811 方法おしえて
813 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 08:24:16 ] >>805 Collectionでも書き換え出来るけどね
814 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 09:23:41 ] >>809 エクセルでは日付は思うように出来ないことも有る。有る意味仕様 一例を挙げると Sub Cstrのテスト() Cells(1, 1) = Date Cells(2, 1) = CStr(Cells(1, 1)) End Sub トンでもない結果が出ると思う。
815 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 14:18:52 ] >>814 (809じゃないけど面白そうなんで試してみた) Cells(1,1) → 2007/8/31 Cells(2,1) → 1931/7/8 ビックリ仕様ですね
816 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 21:55:56 ] > エクセルでは日付は思うように出来ないことも有る。有る意味仕様 ちゃんと理解してないから思うようにいかないだけ
817 名前:デフォルトの名無しさん mailto:sage [2007/09/01(土) 06:59:50 ] >>814 CStrのヘルプみると引数に日付型は有効だけど Cells(2, 1)の表示形式も日付に変わってる? これは仕様というよりバグじゃ?
818 名前:デフォルトの名無しさん [2007/09/01(土) 08:32:29 ] >>814 手元にExcel無いから自信が無いが、確か "'"+CStr(Cells(1,1)) って書けば正常表示された記憶がある 頭が数値の文字列入れるとExcelって数字で判断しちゃうんだよね、バグというより仕様でもいいんじゃね >>809 も頭にアポストロフィを足してやると正常になるかもよ
819 名前:デフォルトの名無しさん [2007/09/01(土) 08:46:18 ] >>818 訂正 2007/8/31→1931/7/8 って単にアメリカ仕様の mm/dd/yy の形で変換されてるだけじゃん こりゃバグだね
820 名前:デフォルトの名無しさん [2007/09/01(土) 09:25:30 ] VBAで別ファイルにあるワークシートへの参照を そのファイルを開かずに取得するにはどうしたらよいでしょうか? ワークシート上ではたとえば「='C:\ABC\[DEF.xls]Sheet1'!$A$1」などと指定すれば 開いていないファイルのセルを参照できますが、 これと同じような方法で、たとえば Dim hoge As Worksheet Set hoge = ******** のような記述で、開いていないファイルのワークシートを参照するには どうすればいいのでしょうか? よろしくお願いします。
821 名前:デフォルトの名無しさん [2007/09/01(土) 12:32:56 ] 試せばいいじゃん
822 名前:820 [2007/09/01(土) 13:09:10 ] >>821 試す、って何をどう試すのですか?? まさか set hoge = worksheets("C:\ABC\[DEF.xls]Sheet1") とかをやれってことですか? エラーに決まってますが。
823 名前:デフォルトの名無しさん [2007/09/01(土) 13:16:54 ] 横着すんな 発想としてはbookのオブジェクトつくって、そっからシートオブジェクトさらってくるだろ 出来るかはしらないけど
824 名前:デフォルトの名無しさん mailto:sage [2007/09/01(土) 18:14:30 ] Executeexcel4macroでってのが定番 ただし参照する量が多いと遅くて使い物にならないので、 結局一回開いてメモリに読みこまないとダメという
825 名前:デフォルトの名無しさん mailto:sage [2007/09/01(土) 18:30:46 ] ブックのあるディレクトリに、そのブックのアクティブなシート上のデータを 例えばファイル名sage.txtとしてANSIのtxt形式で保存するVBAのコード教えてください
826 名前:デフォルトの名無しさん mailto:sage [2007/09/01(土) 18:35:04 ] ここはクレクレスレじゃないです(><
827 名前:デフォルトの名無しさん [2007/09/01(土) 19:50:19 ] >>825 FSOでググッてみ
828 名前:デフォルトの名無しさん [2007/09/01(土) 20:03:02 ] >>711 こういうレスって無価値だな
829 名前:デフォルトの名無しさん mailto:sage [2007/09/01(土) 20:36:55 ] >>823 当然できる、けど扱いが難しい 良くないコードだけどこんな感じ Public Sub MyTest() Dim wbkTarget As Workbook Set wbkTarget = OpenBook MsgBox "シート1の名前は" & wbkTarget.Worksheets(1).Name & "です", vbOKOnly, "Result" wbkTarget.Close False '※ここでブックの実体を閉じないとゴーストプロセスが残ってしまう Set wbkTarget = Nothing End Sub Private Function OpenBook(Optional ByVal iSheetIndex As Integer = 1) As Workbook Dim xlApp As Excel.Application Dim wbkTarget As Workbook Dim wksSheet As Worksheet Dim strPath As String Set xlApp = New Excel.Application strPath = xlApp.GetOpenFilename("Microsoft Excelブック,*.xls") Set wbkTarget = xlApp.Workbooks.Open(strPath) Set wksSheet = wbkTarget.Worksheets(1) Set OpenBook = wbkTarget Set wbkTarget = Nothing '※インスタンスは解放されるが実体のブックは開きっぱなし Set xlApp = Nothing End Function
830 名前:829 mailto:sage [2007/09/01(土) 21:10:43 ] 俺は一体何を示したかったんだ・・・ どうも疲れてるようだ Private Function OpenBook(Optional ByVal iSheetIndex As Integer = 1) As Workbook Dim xlApp As Excel.Application Dim wbkTarget As Workbook Dim wksSheet As Worksheet Dim strPath As String Set xlApp = New Excel.Application strPath = xlApp.GetOpenFilename("Microsoft Excelブック,*.xls") Set wbkTarget = xlApp.Workbooks.Open(strPath) Set wksSheet = wbkTarget.Worksheets(iSheetIndex) wksSheet.Name="ほげ" Set OpenBook = wbkTarget set wksSheet = Nothing Set wbkTarget = Nothing '※インスタンスは解放されるが実体のブックは開きっぱなし Set xlApp = Nothing End Function
831 名前:デフォルトの名無しさん [2007/09/01(土) 21:33:05 ] 丁寧にコードまで書いてお前優しい奴だな 俺はすぐ噛み付く>>820 みたいなの為にそこまでは出来ない
832 名前:デフォルトの名無しさん [2007/09/02(日) 07:28:22 ] ActiveSheet.ChartObjects(3).Chart.Export "hoge.gif" のようなグラフのExportで 「400」とだけ書かれたエラーダイアログが出るんだが・・・何なんだこれはorz ExportをActivateにしても変わらないし・・・
833 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 09:45:41 ] チラシは日記の裏にでも
834 名前:デフォルトの名無しさん [2007/09/02(日) 09:50:02 ] EXCEL2007です。 列を挿入すると、挿入列の書式が、挿入位置の左の列と同じになりますが、 これを挿入位置の右の列の書式になるように挿入するには、 どのように指定すれば良いのでしょうか。 よろしくお願いします。
835 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 09:53:46 ] それはスレ違いだな 手動でできるならそれをマクロ記録
836 名前:デフォルトの名無しさん [2007/09/02(日) 17:36:31 ] 7×7のマスに0〜48の数字をランダムに表示 させることはできますか? D4は0という条件なのですが。 お願いします。
837 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 17:54:59 ] >7×7のマスに0〜48の数字をランダムに表示 と >D4は0という条件なのですが。 が矛盾している罠。 A1-G7からD4を除いたセルに、1-48を割り振ればいいのかな? だとしたら、できる。
838 名前:デフォルトの名無しさん [2007/09/02(日) 18:00:09 ] >>837 お願いします。
839 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 18:10:56 ] 主語と目的語が無いのはゆとりのデフォだよな
840 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 18:15:15 ] ほら Dim s(1 To 48) As Integer Dim a As Integer For i = 1 To 7 For m = 1 To 7 If Not (m = 4 And i = 4) Then Do a = Int(Rnd * 48 + 1) Loop Until (s(a) = 0) Cells(i, m) = a s(a) = 1 End If Next Next
841 名前:デフォルトの名無しさん [2007/09/02(日) 18:19:34 ] >>840 さん。ありがとうございます。 これで、注意配分の練習したいと思います。
842 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 18:23:49 ] ふむ、>837はありがたくないらしい。
843 名前:デフォルトの名無しさん [2007/09/02(日) 18:32:04 ] >>837 と>>840 には感謝してます。 こんな俺のために・・。 >For i = 1 To 7 プロシージャの外では無効です。 とエラーが出ました。 どのように書き換えればよいのでしょうか?
844 名前:デフォルトの名無しさん [2007/09/02(日) 18:33:47 ] あ、自己解決しました。 End Subが抜けてた・・。 失礼しました。
845 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 21:47:03 ] >>844 スレ違いだけど 車掌になるの?
846 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 21:57:47 ] 利用するだけのやつが多い中、ちゃんと報告するだけ偉い
847 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 22:42:13 ] まるで脳トレ……つーか、頭スキャンみたいだな。
848 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 23:32:48 ] >>845 車掌ってそういう特訓するんだ。知らなかった。
849 名前:デフォルトの名無しさん [2007/09/02(日) 23:38:38 ] VBAの入門書は一通り読んだ者です。 Sub Macro1() Dim name(10) As Variant name(0) = Range("A2").Value End Sub のコードが、3行目でエラーになってしまう理由がわかりません。 「修正候補: As」と表示されます。 3行目を Set name(0) = Range("A2").Value にすると、エラーでなくなるようです。 Setって、オブジェクト型のデータの格納に使うと読んだので、 この理由もよくわかりません。 よろしくお願いします。
850 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 23:45:15 ] 名前が悪い
851 名前:デフォルトの名無しさん [2007/09/02(日) 23:57:45 ] nameって変数名はよくない。 試しにA(10)とかB(10)でやってみなよ。うまくいくから。 nameとかtimeみたいに関数の名前とかプロパティであるような 奴は変数名にしないほうがいい。
852 名前:849 mailto:sage [2007/09/03(月) 00:02:46 ] >>850 >>851 変数名を変えたら解決しました。 どうもありがとうございます。
853 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 13:36:09 ] nameが判りやすいから使ったんでしょ? ヤバイ名前にはMyをつけてMyNaneのようにすれば問題ない。
854 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 14:01:09 ] my付けるのって「できる大辞典」ユーザーの特徴なんだっけ? MSの推奨は型名(とスコープ)のプレフィックス付けで、Variant型なら Dim vntName(10) As Variant となるわけで、こういった型名(とスコープ)のプレフィックス付けが VBA(VB言語)以外も含めてコーディング規則では一番一般的なんだが
855 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 14:13:25 ] キモチワルイ
856 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 14:45:06 ] 少なくとも一番ではないと思う。 ハンガリアン記法 [part1] pc11.2ch.net/test/read.cgi/tech/1187669648/l50 コーディング規約 第3条 pc11.2ch.net/test/read.cgi/tech/1170599322/l50
857 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 15:05:13 ] そうでもないか
858 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 21:54:43 ] まあ命名法は数あれど日本語変数と一文字変数だけは認めたくない
859 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 22:22:26 ] Forループ用にiとかjとか使うんだけど。
860 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 22:33:41 ] 整数主にカウント用にijk... 座標等にxyあたりは別に普通だろう。 何かしら1文字が予約されてる言語ならもっともだが。
861 名前:デフォルトの名無しさん [2007/09/03(月) 22:42:23 ] ここに書き込んでいいのか分からないのですが、VBAを使っているのでここに質問させてもらいます。 Levenberg-Marquardt algorithm を使って関数をFittingしたいのですが、英語で書いてあるためか、よく分かりません。 ソースはttp://www.alglib.net/optimization/levenbergmarquardt.phpにあるんですが…。 以下の説明があるんですが、よく分かりません。誰か使い方を教えてください。お願いします。m(_ _)m
862 名前:デフォルトの名無しさん [2007/09/03(月) 22:43:49 ] 'This routines must be defined by the programmer ' Sub FuncVecJac(ByRef X() As Double, _ ' ByRef FVec() As Double, _ ' ByRef FJac() As Double, _ ' ByRef IFlag As Long) 'Routines '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 'The subroutine minimizes the sum of squares of M nonlinear finctions of 'N arguments with Levenberg-Marquardt algorithm using Jacobian and 'information about function values. ' 'Programmer should redefine FuncVecJac subroutine which takes array X '(argument) whose index ranges from 1 to N as an input and if variable 'IFlag is equal to: ' * 1, returns vector of function values in array FVec (in elements from ' 1 to M), not changing FJac. ' * 2, returns Jacobian in array FJac (in elements [1..M,1..N]), not ' changing FVec. 'The subroutine can change the IFlag parameter by setting it into a negative 'number. It will terminate program. ' 'Programmer can also redefine LevenbergMarquardtNewIteration subroutine 'which is called on each new step. Current point X is passed into the 'subroutine. It is reasonable to redefine the subroutine for better 'debugging, for example, to visualize the solution process. ' 'The AdditionalLevenbergMarquardtStoppingCriterion could be redefined to 'modify stopping conditions.
863 名前:デフォルトの名無しさん [2007/09/03(月) 22:44:43 ] 'Input parameters: ' N ・ number of unknowns, N>0. ' M ・ number of summable functions, M>=N. ' X ・ initial solution approximation. ' Array whose index ranges from 1 to N. ' EpsG ・ stopping criterion. Iterations are stopped, if cosine of ' the angle between vector of function values and each of ' the Jacobian columns if less or equal EpsG by absolute ' value. In fact this value defines stopping condition which ' is based on the function gradient smallness. ' EpsF ・ stopping criterion. Iterations are stopped, if relative ' decreasing of sum of function values squares (real and ' predicted on the base of extrapolation) is less or equal ' EpsF. ' EpsX ・ stopping criterion. Iterations are stopped, if relative ' change of solution is less or equal EpsX. ' MaxIts ・ stopping criterion. Iterations are stopped, if their ' number exceeds MaxIts.
864 名前:デフォルトの名無しさん [2007/09/03(月) 22:46:24 ] Output parameters: ' X ・ solution ' Array whose index ranges from 1 to N. ' Info ・ a reason of a program completion: ' * -1 wrong parameters were specified, ' * 0 interrupted by user, ' * 1 relative decrease of sum of function values ' squares (real and predicted on the base of ' extrapolation) is less or equal EpsF. ' * 2 relative change of solution is less or equal ' EpsX. ' * 3 conditions (1) and (2) are fulfilled. ' * 4 cosine of the angle between vector of function ' values and each of the Jacobian columns is less ' or equal EpsG by absolute value. ' * 5 number of iterations exceeds MaxIts. ' * 6 EpsF is too small. ' It is impossible to get a better result. ' * 7 EpsX is too small. ' It is impossible to get a better result. ' * 8 EpsG is too small. Vector of functions is ' orthogonal to Jacobian columns with near-machine ' precision. 'argonne national laboratory. minpack project. march 1980. 'burton s. garbow, kenneth e. hillstrom, jorge j. more ' 'Contributors: ' * Sergey Bochkanov (ALGLIB project). Translation from FORTRAN to ' pseudocode.
865 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 02:27:11 ] 1文字変数主義者は変数の型とかに気を使わないのが定説 Cなんかやらせたらキャスト地獄で気が狂うだろな
866 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 21:59:14 ] マクロ初心者なので教えて下さい。 変数Aを10とするマクロXと変数Aを20とするマクロYがあるとして、 それぞれの変数を生かした上でマクロZを共通して使用するように したいのです。 それぞれでマクロを全文書けば良いだけの話かもしれませんが、 共用できる部分を共用することで容量を減らしたいので… なお、Application.RunでマクロZを呼び出したら、変数が引き継がれず エラーになってしまいました。 うまいやり方を教えて下さい。
867 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 22:00:33 ] ここは初心者育成スレじゃない 最低限のことは覚えてから来てください
868 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 22:33:57 ] 1に >スキルがないのに無理やりVBAの仕事を押し付けられた普通のひと とも書いてありますが。
869 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 23:43:32 ] >>866 何のためにSubやFunctionには引数を追加できると思っている?
870 名前:デフォルトの名無しさん [2007/09/05(水) 00:07:56 ] それはVBAのスキルであって プログラミングのスキルではないだろ
871 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 07:52:48 ] globalにpublic宣言すれば参照できたっけ? X.A Y.Aで
872 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 08:28:05 ] >>868 で?
873 名前:デフォルトの名無しさん [2007/09/06(木) 05:03:58 ] VBAって馬鹿にしてたけど 遅ささえ気にならなきゃ、何でもできるんだな COM使いこなせればの話だけど
874 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 08:30:32 ] COM無しでもなんでも出来るよ VBSだとCOM有っての物種だけど VBAはWin32APIが使えるから、それを使いこなせればCOMなんて不要 ぶっちゃけCOMを使うのではなく、作れる側の言語と同等の仕様なんだから
875 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 12:25:00 ] いや、Win32APIがあっても、COMはCOMで便利だと思うぞ。 両方で機能が重複しているわけでもないし、 時と場合によって使い分けるものだろ。
876 名前:デフォルトの名無しさん [2007/09/06(木) 14:34:50 ] このプログラムを日本語訳してくれ!! ex23.2ch.net/test/read.cgi/morningcoffee/1189055210/
877 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 14:42:03 ] >>876 >>756
878 名前:デフォルトの名無しさん [2007/09/06(木) 18:39:09 ] 初心者な質問ですが、フォームからシートのサブルーチンを呼び出すのはどうしたらよいですか?
879 名前:デフォルトの名無しさん [2007/09/06(木) 19:30:56 ] sheet.subproc("パラメータ")
880 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 20:20:19 ] >>875 COMが不要だとか便利じゃないなんて話はしてないよ COM使わなくても、何でも出来るって話なだけで それに、両方の機能は重複してるというか、COMで出来ることは殆どWin32API(の組み合わせ)で出来る まあ使い分けた方が手軽ではあるけど、スキルさえあればCOM無しでも事足りるのは事実
881 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 21:52:19 ] しつもん htmlファイルを(テキストでも何でもいいけど)普通にテキスト形式で読み込めませんか 今はループさせて1行毎にLine Inputしてるのですが、 (A1に1行目、A2に2行目、・・・をEOFまで) なんかもっとこうてっとりばやいというか File("index.html").copy Sheet1 みたいなの
882 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 21:53:49 ] つ[open]
883 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 22:24:15 ] >>880 例えばExcelブックの中身いじるなんてことを Win32APIで現実的にやれるって言うつもり?
884 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 22:27:13 ] いやさ、COMを使った時点でVBAの範疇から外れるだろw WIN32APIでゴリゴリ書くと整った開発環境で作るより むしろローレベルなプログラムになるよなw
885 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 22:38:02 ] Excel VBAでExcelとVBAだけは参照設定から外せないぞ。 確かに、COMコンポーネント一般の話はVBAから外れるが、 Excelブックを操作するのにCOMを使う以上、 VBAにCOMは欠かせない存在だろ。
886 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 22:45:29 ] そりゃそうだ。 COMを使えば○○が出来る → VBAすげー ではないだろってだけだよ。すごいのはCOMだ。 別にCOMもAPIも有用なもんだ。
887 名前:878 [2007/09/07(金) 03:11:01 ] >>879 サンクス、やってみる
888 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 03:52:09 ] COMってのを学習するために良いサイトを教えてください
889 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 22:06:12 ] 指定したフォルダ配下のサブフォルダ一覧の取得方法を教えてください
890 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 23:33:03 ] Excel2003で作ったVBAのツールをVista + Excel2007の環境にインストールしたら、 読み取り専用として開いてしまい保存ができません。 VBAツールの場合、ユーザー権限の昇格確認を出して管理者権限で実行するには どうすれば良いでしょうか?
891 名前:デフォルトの名無しさん mailto:sage [2007/09/08(土) 00:13:09 ] >>882 やりたかったこと Name index.html As index.txt Workbooks.Open Filename:="index.txt" を、ファイル名を変えずに Workbooks.Open Filename:="index.html" だとタグを勝手に解釈しやがって死ぬ ↓結局今はこう Open "index.html" For Input As #1 行 = 1 Do Until EOF(1) Line Input #1 , buf Cells(行,1) = buf Loop Close #1
892 名前:デフォルトの名無しさん mailto:sage [2007/09/08(土) 00:23:09 ] >>889 Dir(指定するフォルダ, vbDirectory)
893 名前:デフォルトの名無しさん [2007/09/08(土) 07:14:41 ] >>889 Dim FSO As Object Dim Fds As Object Dim Fd As Object Set FSO = CreateObject("Scripting.FileSystemObject") Set Fds = FSO.GetFolder(FdPath) 'Fdpathにフォルダのパスを指定 For Each Fd In Fds.SubFolders Fd.Name '←サブフォルダフォルダの名前。やりたい処理を書く。AddiItemとか Next Fd Set FSO = Nothing Set Fds = Nothing まぁ、間違ってるかもしれないけど。 誰か>>861 スレ違い?
894 名前:デフォルトの名無しさん mailto:sage [2007/09/08(土) 09:28:57 ] >>888 VB系だとあまりCOMそのものを勉強する必要はないと思う。 COMのことは裏に隠蔽して普段は意識せずに済むようになっているから。
895 名前:デフォルトの名無しさん mailto:sage [2007/09/08(土) 11:48:35 ] >>892 >>893 ありがとうございます ためしてみます
896 名前:デフォルトの名無しさん [2007/09/08(土) 14:26:15 ] VBAでワークシート関数を使いたいのですが 範囲のところにVBAの変数を指定することは可能でしょうか? よろしくお願いいたします。 WorksheetFunction.Average(範囲)
897 名前:デフォルトの名無しさん mailto:sage [2007/09/08(土) 15:47:19 ] やってみればいいのに
898 名前:デフォルトの名無しさん mailto:sage [2007/09/08(土) 15:48:08 ] ホントなんでやってみないんだろ? Dim Rng As Range Set Rng = Range("A1:A3") Debug.Print WorksheetFunction.Sum(Rng)
899 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 09:33:31 ] 名前付き引き数に変数(文字列)を使用したいのですが、どう組んだらよいですか? ちなみに、:="名前" って感じのものです
900 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 09:59:50 ] >>899 hlpym!ks!
901 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 14:14:06 ] Sub sample() Dim bbb As Integer Selection.AutoFilter Field:=8, Criteria1:="#VALUE!" bbb = Rows.SpecialCells(xlCellTypeVisible).Select Selection.Delete End Sub フィルターをかけて「#VALUE!」行を削除したいのですが 上のだと項目名も選んでしまうのですが、何を付け加えたらいいでしょうか ご指導お願いします
902 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 14:49:29 ] iserror
903 名前:デフォルトの名無しさん [2007/09/09(日) 15:43:52 ] Excel VBA とFortran どっちが早いでしょうか? コンパイラはフリーのものなんですが。 だいぶ違うのでしょうか?
904 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 15:58:44 ] そりゃぁ、馴れている方が早く書けるだろ。
905 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 16:12:43 ] >>901 項目名を選ばなかったらいいんじゃないか それと6行目は何をしたいのかわからない たぶん不要
906 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 17:31:51 ] >>903 開発されたのは、Fortranの方がずっと"早い"。
907 名前:デフォルトの名無しさん [2007/09/09(日) 18:41:36 ] VBAより遅いコンパイラなんてあんのかいな
908 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 18:47:15 ] 腐るほどある
909 名前:903 [2007/09/09(日) 19:00:03 ] >>904->>908 実行速度です。 使い勝手はExcel VBAがいいんですけど、速さを考えると Fortranのほうがいいのかなと。セルの参照とかしなければ いい線いくのかなと。
910 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 20:47:59 ] なんでもかんでもRange作戦なら実効速度が稼げる しかしソースが汚くなる諸刃の剣 切羽詰まったやつ以外にはオススメできない
911 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 22:51:08 ] >>909 計算精度を求めるのならFORTRAN(もしくはCOBOL) Excelの小数点以下の計算精度は酷い。 VBAで計算するのなら、Currencyとか使うと精度が良いが小数点以下桁数の制限が大きい。
912 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 23:45:16 ] doubleをlongに入れると親切に四捨五入してくれるからなあ ずいぶんはまったよ
913 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 01:20:08 ] >>911 それは、精度がいいんじゃなくて、 Centuryの誤差の出方がDoubleのそれより人間の感覚に近いというだけ。
914 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 01:45:23 ] 世紀の誤差か
915 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 11:08:25 ] >>913 はCurrencyをCenturyと書き間違えて説得力が低いけど、 >>911 が言う「Excelの小数点以下の計算精度は酷い」は嘘っぽい。 根拠があって言ってる?
916 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 11:44:34 ] single、doubleとも本来の精度以上に悪いとは思ったことはないが ただ計算の時にどの型になってるかよくわからないんで 全部cdblにしたりしたな
917 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 18:33:29 ] >>915 Excelに限定すると ttp://pc.nikkeibp.co.jp/pc21/special/gosa/eg1.shtml とか。普通にExcelの参考書類にも載っている話だけれど
918 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 18:56:17 ] ヒント:丸め誤差
919 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 19:03:02 ] >>917 それはexcel限定の話じゃない
920 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 19:18:52 ] >>917 FORTRANでもまったく同じことが起きます。 COBOLは、十進数で計算するのでVBAのCurrencyと同様ですが、 あらかじめ桁数を決めておくのが普通なので、 考えようによってはCurrencyよりも使いにくい場合があります。
921 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 19:24:40 ] >>917 そのページ、怪しくない? 「0.1 は、実は 0.1000…000555115123…625です」みたいな書き方しているけど、 右側(小数点以下20桁以降)は、ただのゴミ。 それだけの桁数をもっているわけじゃない。
922 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 22:23:56 ] >>921 >「0.1 は、実は 0.1000…000555115123…625です」みたいな書き方しているけど、 初心者にも画面上で分かりやすいように画面表示上での最高桁を使っているわけで 説明しやすくするための方便かと。 日経ソフトウェアではなくビジネスマン向けの「日経PC21」だし無駄に厳密にやっても混乱させるだけだし。 一応フォローとして同じ連載中で「IEEE 754浮動小数点数」の仕組みとかもやってるが。 # Excelのワークシート関数利用に関しては結構マニアックな雑誌なので一般ユーザに渡すと結構重宝されたりするけど>日経PC21 あと >>917 の通り、これ以外でもぐぐればいくらでもある。 そういや8bit機であるMSXのBASICの浮動小数点がBCD利用で PC98のN88-BASIC(86)より精度が高かったことを思い出した その分、元々遅いのが更に遅くなっているが。
923 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 22:50:32 ] BCDなら固定小数点じゃないの?
924 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 23:17:50 ] >>922 どんだけぐぐったって、Excelの小数点以下の計算精度がFortranよりも酷い なんてことが書いてあるページは見つからないと思うけど。
925 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 23:21:21 ] 何故10進型を使おうとしない
926 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 23:22:01 ] 922ってそんなこと主張してるか?
927 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 23:22:20 ] >>923 MSXのMATHPACKはBCD浮動小数点が使えたはず。
928 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 23:27:30 ] まあ考えたらBCDでも浮動小数点は可能だな >>925 足し算引き算ぐらいなら使ってもいいが
929 名前:デフォルトの名無しさん [2007/09/10(月) 23:32:37 ] もうちょっとCPUが賢く安くなれば 10進数浮動小数点演算器載せるだろうな、あと何年待てばいんだろ
930 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 23:35:51 ] >>924 明らかに >>921-922 の流れはFORTRANとは無関係です。 Excelに対するFORTRANの計算精度の優位性について言及しているのは >>911 だけだし。 FORTRANはよく知らないが同じBASICでもMSXと98で精度が異なるように、処理系依存の部分も多い希ガス
931 名前:デフォルトの名無しさん [2007/09/10(月) 23:39:59 ] つうか計算精度なんて言語じゃなくてCPUの性能によるんじゃないの? まぁソフトだけで計算すりゃ精度は出るだろうが、馬鹿みたいに遅い気がする
932 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 23:43:21 ] 言及ったってどう酷いかいってくれないとなあ
933 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 23:44:44 ] だから10進型使えっつーの 何が優位性だ半可通が
934 名前:デフォルトの名無しさん [2007/09/10(月) 23:51:30 ] まぁ世の中の殆どは近似値で事足りる 精度のいるモノは高いアプリやらマシーン使ってるだろうし 浮動小数点使って馬鹿みたいなプログラムを組むと引っ掛かる
935 名前:デフォルトの名無しさん [2007/09/11(火) 00:17:13 ] メールについて質問! VBAからダイレクトにメールを打つサンプルはよくあるんですが、 メーラーを開き、新規メール画面にセルの文字列を入れて、送信はしない、 って状態を作りたいのですが、どうすれば良いでしょうか? メーラーはOutlook Expressじゃなく、「通常使うメーラー」を使いたいです。 よろしくお願いします。
936 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 00:30:08 ] >>935 メーラーにコマンドラインで渡せばいいんじゃないか
937 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 02:39:14 ] Select Caseの分岐に変数のリストを渡して使えないでしょうか Dim IntA = "1,3,5" As Integer Dim IntB = "2,4,6" As Integer Select Case Int Case IntA 〜 Case IntB 〜 みたいな。 上のだと当然型エラーが出るし、stringにすると「1,3,5」という文字列にマッチしてしまう たくさんのわりとランダムっぽい数値で分岐させたく、 なおかつよく数値が変更されるので見通しの良いところにおいておきたいのです。
938 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 06:53:59 ] ヒント:偶数、奇数
939 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 06:56:43 ] ってランダムか 規則性がないものは都度判定するか連想配列に登録するしかないと思われ
940 名前:935 [2007/09/11(火) 07:41:35 ] >>936 ありがとうございます。 今、メーラーはBeckyなのですが、Becky側では、コマンドラインから セット出来るのは、宛先To:のみなので、本文を処理出来ません。。 通常使うメーラー、無理なもんですかね?
941 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 08:30:21 ] mailto:で呼び出したらいいんじゃないかな? 本文とかも指定できる。 ttp://www.shurey.com/Soft/JavaScript/mailto.html
942 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 19:04:00 ] >>937 実際の分岐条件イメージが涌かないが、まずはHELPの使用例見ろ その上での話なら、変則ではあるがこのようなやり方もある Select Case True Case 条件式1 〜 Case 条件式2 〜 Case Else
943 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 19:28:45 ] > 変則ではあるが その手法は基本だろ?
944 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 20:51:56 ] 基本は if 条件式 then elseif 条件式 end if
945 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 21:50:07 ] >>944 if 条件式 then elseif 条件式 then end if ね これも基本だし>>942 も基本のうち
946 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 23:17:18 ] elseifなんかソース汚くなるしLIKE演算子に用があるときぐらいしか使わんわ
947 名前:デフォルトの名無しさん [2007/09/11(火) 23:54:01 ] で?
948 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 00:33:43 ] >>937 の例だと select case hoge case 1,3,5 case 2,4,6 end select とかでいいんでないの magic numberだが
949 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 01:27:54 ] >>946 ハゲは黙ってろw
950 名前:デフォルトの名無しさん [2007/09/12(水) 15:29:00 ] >>937 配列渡しの関数作って戻り値をIF文で判定するしかないじゃね select文に拘ってもしょうがない
951 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 20:45:54 ] 質問です。 本日、面接に行ったところ、1週間でVBAで計算機を作って来いと言われました。 ちなみに、VBAどころかプログラム自体、一切触ったことありません。 で、まだソース部分は全く手付かずなのですが、 ユーザフォームに0〜9ボタンや、+、-などのボタンとテキストボックスを貼り付け、 ボタンを押して、値なり結果をテキストボックスに返す感じで行きたいなと。 ただ、ユーザフォーム上で計算機としての動作が可能なのか、 アプローチが最初から間違っていないか、その点を教えていただきたいです。 探し方が悪いとは思うのですが、そういったものを紹介しているサイトも 見つけられなかったものですから…
952 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 20:51:35 ] >>951 ちなみに面接官もここチェックしてるから
953 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 21:10:17 ] vbaじゃなくてvisual basicで探せ
954 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 21:41:02 ] >>951 それを自力で出来るかどうかを見てるわけだから不正をせず自力でやりましょう 不正をして採用されても、能力以上のことばかり要求されて辛い思いをするのは君ですよ 自分の能力に見合ったものを選ぶか、上を目指したければズルすることではなく己を高めることを考えましょう
955 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 22:08:06 ] >>951 ひとつだけ言っておく >ユーザフォーム上で計算機としての動作が可能なのか 可能
956 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 22:09:28 ] >>951 考え方は合ってる 数字ボタン:値の取得 加減乗除などのボタン:フラグ って考えれば良い
957 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 23:15:12 ] "を文字列として扱いたいのですが、例えば "My name is nanashi"という具合に"(半角)まで表示させるにはどうすればいいでしょうか? 環境はExcel2003です。 Dim tk as string tk=""My name is nanashi"" だとエラーが出ます。 たぶん tk=???&"My name is nanashi" &??? が正解であると思うのですが???に何を入れればいいのか思い出せません。 PC-98時代のベーシックならCHR(??)だったような記憶があるのですが、VBAの場合どうすればいいのでしょうか? お願いします。
958 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 23:18:56 ] ググレカス
959 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 23:31:11 ] >>957 Msgbox """ぐぐれ"""
960 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 23:42:44 ] 奇数個をはさんでも偶数個に修正するんだな
961 名前:デフォルトの名無しさん [2007/09/13(木) 01:58:19 ] >>957 実はVBAにもCHRあるから同じように書ける