1 名前:デフォルトの名無しさん [2007/05/27(日) 00:06:58 ] ・まじめにExcelの機能を追及してみようと思う奇特なひと ・スキルがないのに無理やりVBAの仕事を押し付けられた普通のひと ・VBAなんていまさらやりたくないのに業務で仕方なく使っているひと ・とにかく漏れにこんな仕事まわすなと怒っているひと そんなM$大好きなひとからアンチM$なひとたちまで幅広くカバーするスレです 前スレ pc11.2ch.net/test/read.cgi/tech/1168308855/
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 に逝った方がいいんじゃね?