1 名前:デフォルトの名無しさん [2007/12/12(水) 17:27:44 ] ExcelのVBAに関する質問スレです 質問前に 【 >>2-3 】 あたりを良く読むこと 前スレ pc11.2ch.net/test/read.cgi/tech/1189814602/
908 名前:900 [2008/03/05(水) 21:39:40 ] なんだか偽者出てるみたいですが、900です。 >>905 ループで一度データをコピーするプログラムを作成したのですが、 開始から終了までかなり時間がかかってしまうことが分かりました。 処理時間を軽減できないかと考えて、範囲ごとコピーできないかと考えた のが理由です。
909 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 21:43:04 ] 縦横変換したものを一旦シートに貼り付けて、それから変数に代入しろ
910 名前:デフォルトの名無しさん [2008/03/06(木) 02:28:41 ] >>900 速度向上のためにはSelectするな!withを使え! Rangeで取り込んで配列に一括取り込み。
911 名前:デフォルトの名無しさん [2008/03/06(木) 02:32:43 ] >>903 まず型変換して代入で可能 d=CDbl(rng) あと行列逆転はFor〜Nextで1セル毎にループでできるが、一括でできる方法はないかな?
912 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 08:45:45 ] 速度気にするなら、まずExecuteExcel4Macroでやろうってのが間違いだと気付け
913 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 09:06:42 ] >>908 ExecuteExcel4Macroなんか使って読みにくく、また他に使い途もないコードを書くより、 ADO使って"SELECT * FROM [Sheet1$]"みたいにやった方が、将来的に考えて 色々と応用できて幸せになれる確率が高いぞ
914 名前:900 mailto:sage [2008/03/06(木) 09:50:11 ] 御回答ありがとうございます。 ExdcuteExcel4Macroは使わない方針でいってみたいと思います。
915 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 09:59:52 ] >>911 >>909
916 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 10:11:06 ] Publicで宣言したプロシージャを ツール→マクロ→マクロとメニュー選択した際のダイヤログボックスに 表示させない方法があったと思うのですが、 どうやればいいでしょう????
917 名前:初心者 [2008/03/06(木) 11:40:13 ] 初歩的な質問かと思いますが、可能な限り過去の書き込みを検索しましたが、解決できませんでしたので、質問させていただきます。 A1からA10に数値の値が入っているとします。 もしこのA1からA10までの値がすべて0だったら、○○というプログラムを実行する、というマクロを組みたいと思っています。 If Worksheets("Sheet1").Range("A1:A10") = 0 Then Call ○○ End If というふうに自分では作ってみたものの、うまくいきません。 アドバイスの方よろしくお願いします。
918 名前:デフォルトの名無しさん [2008/03/06(木) 15:42:25 ] >>915 シート作成は速度の関係上できるかぎり避けたいのです。 関数やプロパティで行列を逆に入れ替える方法はないでしょうか?
919 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 15:47:34 ] >>918 計測してから物を言え。
920 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 16:12:20 ] >>917 dim i as integer for i = 0 to 9 if worksheets("sheet1").range("a1")..text <> "0" then exit for next if i == 10 then call *** end if
921 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 16:13:18 ] あ、思いっきり間違ってた。 if worksheets("sheet1").range("a1")..offset(i,0).text <> "0" then exit for が正解。
922 名前:デフォルトの名無しさん [2008/03/06(木) 16:47:13 ] >>919 シート作成するのが通常よく使うよね。 VBAではあまり速度を問われないことがおおいから。 私もそうですし他の方法しか教えられない。 >>918 気長にVBAスペシャリストを待ちましょう。
923 名前:919 mailto:sage [2008/03/06(木) 16:53:13 ] スペシャリストの俺に喧嘩売ってんのか?
924 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 17:02:20 ] 取りうる方法は三つしかない。 ・行列を変換しながら1セルごと配列にコピー ・rangeを配列にまるごとコピーした後に、行列を変換しながら別の配列に代入 ・行列を変換して別のシート(同じシートでもいいが)にコピーしてから、rangeを配列にコピー 実行する内容や量やExcelのバージョンやPCのスペックによって変わるから、 自分で測って一番速い奴を使え。
925 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 17:24:23 ] んなこたーない。 dim rng as range dim d as variant set rng = worksheets("sheet1").range("a1:c3") d = application.worksheetfunction.transpose(rng)
926 名前:デフォルトの名無しさん [2008/03/06(木) 18:43:57 ] 教えて先生!! あたしシートの追加をしたいのぉ Sub Macro1() Dim unko As String unko = "ウンコ" Sheets.Add ????? End Sub 変数名を取得して、その変数名をシート名としたシートを追加したいというかぁ リネームじゃなくて、ダイレクトに追加できればいいなぁとおもうの。 エロイ人おしえてーー。
927 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 20:07:32 ] >>901 dがVariant型でよければ、 d = WorksheetFunction.Transpose(Range("A1:C3")) でdには縦横入れ替えた2次元配列が格納される。
928 名前:927 mailto:sage [2008/03/06(木) 20:10:40 ] よく見たら>>925 でがいしゅつじゃねーか。
929 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 20:38:03 ] >>916 そういう時は、dummyで使わない引数をプロシジャの()の中にセットする様にしているけど邪道か?
930 名前:デフォルトの名無しさん [2008/03/06(木) 21:14:07 ] >>925 dim rng as range dim tmp as variant dim d as double set rng = worksheets("sheet1").range("a1:c3") tmp = application.worksheetfunction.transpose(rng) 最後に forループで tmp(i,j)からCDbl(d(i,j))に代入しました。 かなり速度が改善しました。 ありがとうございました。
931 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 21:15:09 ] クラスを書く習慣を付ける
932 名前:916 mailto:sage [2008/03/06(木) 22:26:58 ] >>929 問題なしです!ありがとうございました!
933 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 23:06:52 ] >>895 book1を開きながらbook1ファイルは削除できまい。 あと、book1は何処に保存してあるのか。
934 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 00:08:32 ] >>931 誰に言ってるの? 必要ならつけりゃいいが、必要ない場合もある。 たとえばシートモジュールでMe.なんてウザイだけ。
935 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 00:24:40 ] >>934 何だよヴォケ! クラスを明示するの当たり前だろ? >>925 みたいなコードもブックから明示してないからまだまだだね。 ブックの上のApplicationも明示しないとね。
936 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 03:21:54 ] 相手の欠点はよくみえるが自分の欠点はみえないんだよ。 こどもじゃあるまいし、書いてることをそのまま実行したりはしないよ。 ヒントがわかれば十分。
937 名前:926 mailto:sage [2008/03/07(金) 05:40:25 ] うぅ・・・分かる方、いらっしゃいましたらhelpです・・・>< もしくは、追加→リネーム の方法がベストなのでしょうか。 bookを開いてから、何枚のシートを追加したかの監査変数を使う事が避けられれば理想なのですが・・。 皆さんどのようにしているのかも興味があります。 何卒よろしくお願いします。 お礼にこれあげます。>+(
938 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 07:08:02 ] >>937 sheets.Add().name="ウンコ"
939 名前:938 mailto:sage [2008/03/07(金) 07:12:38 ] >>937 試してみたら()も省略できた sheets.Add.name="ウンコ"
940 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 08:30:45 ] >>937 一応マジレスしておくと、質問するならふざけるな。 ふざけないで質問してたらきっと即レスついたはずだ。
941 名前:895 [2008/03/07(金) 09:04:48 ] 933さんありがとうございます。 >あと、book1は何処に保存してあるのか。 これは、C:\Documents and Settings\xxx と指定すればいいのでしょうか?
942 名前:895 [2008/03/07(金) 09:17:12 ] それと、例えば、エクセルのファイルネーム”あ”.xlsのファイルにパスワード を設けて(例えばパスワードは10)他の人に勝手に開かれないようにしてるのですが 人のPCのデータを除き見るやから達からデータを守る為、パスワードの入力を 例えば3回失敗したらファイルごと、どこのディレクトリに合っても強制削除したいのですが どうコードを書いたらいいのでしょか?
943 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 10:34:01 ] 自分自身のマクロでそれをするのは無理。
944 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 11:05:26 ] >>935 おろ? 君は>>925 と>>931 じゃなかったの? 似たようなこといつも言ってるMougの馬鹿を一人知ってるんだが。 ってか彼はうるさい割にはいつもシートからしか明示しないがね。
945 名前:925 mailto:sage [2008/03/07(金) 11:16:26 ] なんだか知らんけど、俺を巻き込まないでくれ・・・
946 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 13:19:45 ] 質問です。私の持っているVBA本に 「同一モジュール内に同名の行ラベルを設置できない」 って書いてあったので、検証しようと思い以下のサンプルコードでテストしました。 ' プロシージャ「p1」 Public Sub p1() On Error GoTo ErrHandler Err.Raise 10 Exit Sub ErrHandler: Debug.Print "エラー発生@" End Sub ' プロシージャ「p2」 Public Sub p2() On Error GoTo ErrHandler Err.Raise 10 Exit Sub ErrHandler: Debug.Print "エラー発生A" End Sub 同一モジュール内にプロシージャ「p1」も「p2」も「ErrHandler:」という行ラベルを設置していますが、 それぞれの「On Error GoTo」はきちんとプロシージャ内の「ErrHandler」へ処理しています。 これってどういう事なんでしょう? 私の持ってるVBA本が間違っているのでしょうか???
947 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 13:46:18 ] >>946 はい、その通り間違っているので、書名を公開してみんなが不幸せになるのを防ぎましょう。
948 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 20:56:10 ] マクロの中で自分のファイル名(フルパスで)を取得するにはどうすればよいですか?
949 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 21:02:21 ] thisworkbook.pathとname
950 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 21:29:13 ] >>942 Sub hoge() Dim a As String Dim w As Object Dim v As Object a = ThisWorkbook.Path & "\" & ThisWorkbook.Name Set w = CreateObject("WScript.Shell") Set v = w.exec("cmd.exe /c del """ & a) Application.Quit ' Do Until v.stdout.atendofstream ' MsgBox (v.stdout.readline) ' Loop End Sub
951 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 22:47:43 ] >>950 それ、マクロ無効にすると開けちゃうから。
952 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 23:48:02 ] 「クラスを書く習慣をつける」って書いたの俺なんだけどさ(>>935 じゃない) 別件(Public云々)にレス付けたつもりだったんだが、曲解した挙げ句に意味不明な粘着を発揮してるキチガイが居るな なんだよ「Mougにホゲホゲ」ってよ 見えない敵が見えてる系のキチガイの考えることはマジで分からんw > 934 名前: デフォルトの名無しさん [sage] 投稿日: 2008/03/07(金) 00:08:32 > >>931 > 誰に言ってるの? > 必要ならつけりゃいいが、必要ない場合もある。 > たとえばシートモジュールでMe.なんてウザイだけ。 > 944 名前: デフォルトの名無しさん [sage] 投稿日: 2008/03/07(金) 11:05:26 > >>935 > おろ? > 君は>>925 と>>931 じゃなかったの? > 似たようなこといつも言ってるMougの馬鹿を一人知ってるんだが。 > ってか彼はうるさい割にはいつもシートからしか明示しないがね。
953 名前:デフォルトの名無しさん [2008/03/08(土) 00:04:09 ] Excel2003 XP SP2 ブックを非表示にして、フォームをタスクトレイに常駐させてタイマー処理は実装可能でしょうか? 教えてエロい人
954 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 04:24:55 ] YES
955 名前:944 mailto:sage [2008/03/08(土) 04:39:19 ] >>952 とぼけても無駄無駄w お前はMougでも感じ悪いけどこっちでも感じ悪いな。
956 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 05:04:10 ] NO
957 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 08:28:43 ] とぼけてるのがいるなw
958 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 12:35:40 ] 見えない敵と戦う聖戦士がム板にも湧いてきて、粘着してくるとは思わなんだわ 悪いことは言わないからMougとやらで聖戦に興じてろや 釣りにしてもキモすぎるし、真性だとしても治療に付き合う義務はない
959 名前:デフォルトの名無しさん [2008/03/08(土) 15:06:06 ] アクティブじゃないシートの選択しているセルの値ってとれないでしょうか? シート名が特定できれば、一旦アクティブにして値をとって戻るとか出来るのですが いろいろなシート(名)を対象に出来るようにと思っています よろしくお願いいたします
960 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 16:48:31 ] >>958 いらんおせっかい書くからだよ。 つまらん自説を述べるから粘着される。
961 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 23:07:05 ] VBEで挿入できるものに、ユーザーフォーム、標準モジュール、クラスモジュールの3つがあるけど、 クラスモジュールだけ使ったことがない。これってどういう時に使うもんなんです? Excel2002ですけど。
962 名前:デフォルトの名無しさん [2008/03/08(土) 23:37:13 ] そのまんまクラスを書くモジュール VBAだと継承ができないんで、独自イベントを実装したいときとか、 構造体代わりに使うとか、コントロール配列を実現させたいときに 使うぐらいしかないけどね(^ω^;)
963 名前:961 mailto:sage [2008/03/09(日) 08:10:28 ] んんん、、、判らん w スマソ まだ俺のレベルでは必要ないって事すかね www
964 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 10:25:51 ] ExcelVBAごときにクラスなんかいらん
965 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 10:39:07 ] strategy patternを使いたいときとか
966 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 15:28:15 ] コントロール配列を実現させたいとき=継承 だったと思うから 「継承代わりに使いたいときだけ」 しか使わん
967 名前:デフォルトの名無しさん [2008/03/09(日) 18:58:31 ] CSVの書き出しに関して、教えてください。 EXCELデータを、カンマ区切りの改行コードつきCSV形式で書き出したいのです。 ↓このような感じ 項目1,項目2,項目3,改行コード(vbcrlf)項目1,項目2,項目3・・・ print # でコード記述 データの最後は改行コード(vbcrlf)で終了しなくてはいけないのですが、 そうすると当然のことですが、最後に余分な空白行ができてしまいます。 改行コードで終了するが、最後の空白行はなくす、ということは可能なのでしょうか? 「もう。無理です・・・」と泣きを入れてみたのですが、なんとかしろ、 とのお達しがあり、もし、良い方法があれば伝授いただければ助かります!! 宜しくお願いします。
968 名前:エスパー君登場 mailto:sage [2008/03/09(日) 19:20:08 ] 最後に余分な空白行が出来ているというのは気のせい。
969 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 19:26:29 ] 「余分な空白行」というのは、CRLFCRLFのことだが、もしファイル末尾がそうなっているとしたら、 それはコードのバグ。 ファイルの末尾がCRLFで終わっているなら、余分な空白行など存在しない。
970 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 19:58:51 ] ぐぐれ 最後の改行 vb
971 名前:デフォルトの名無しさん [2008/03/09(日) 20:08:08 ] ありがとうございます 「EXCEL VBA 改行コード」で検索していたのですが、 良い方法を見つけることが出来ず、悩んでいました。 頑張って挑戦してみます
972 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 20:55:39 ] 最後の改行と余分な空白行というのは違う意味だと思う
973 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 21:06:19 ] >>971 ちょっと待て。何をどう挑戦するつもりなんだ?
974 名前:側近中の側近 ◆0351148456 [2008/03/09(日) 21:56:06 ] (っ´▽`)っ EOF直前の改行は本来必要なものと考えるが。 たまにEOF直前の改行がないテキストファイルを見るが、あれはどうなの? ちなみにviだとエラーメッセージが出るぞ。
975 名前:側近中の側近 ◆0351148456 [2008/03/09(日) 22:01:32 ] (っ´▽`)っ??? >>967 のいう「余分な空白行」ってこういうことだよね? "aaa\r\nbbb\r\nccc\r\n"(\r\nは改行コード) これを "aaa\r\nbbb\r\nccc" にしたいってことでしょ?多分。 「『なんとかしろ、』とのお達しがあり」 ってあるけど、その「なんとかする」理由は何だろうね? 何もないのに言ってるなら、その人にもうちょっと勉強しろって言いたいんだけどね。
976 名前:側近中の側近 ◆0351148456 [2008/03/09(日) 22:02:33 ] (っ´ω`)っ おもいっきりスレ違いだね いきててごめんね
977 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 23:01:20 ] 「余分な空行」という夢オチ
978 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 23:18:21 ] CSVファイルはRFC 4180の仕様だと、 最後のレコードの後には改行はあってもなくてもいいらしい。 オレの場合は最後のレコードの後には必ず改行付けるけどね。
979 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 23:25:11 ] 975のようなテキストをメモ帳か何かテキストエディタで開いたとき、 aaa bbb ccc I ← ここにカーソルが移動できる ということを「最後に余分な空白行ができてしまう」と言っているんだと思った。 だとしたら、それは最後にCRLFを置いているからだとしか言いようがない。
980 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 01:26:00 ] excel2003 xp 他のシートの複数セルのSetの仕方がわかりません。 Dim Rng AsRange Sheets("sheet2").Activate Set Rng = Range(Cells(1, 1), Cells(2, 2)) Sheets("sheet1").Activate Set Rng = Nothing こう書けば一応動くのですがWithを使い With Sheets("sheet2") Set Rng = Range(.Cells(1, 1), .Cells(2, 2)) End With と書いてもsheet1のA1: B2が入ってしまいます。 よろしくお願いします。
981 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 01:40:10 ] Set Rng = .Range(.Cells(1, 1), .Cells(2, 2))
982 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 02:39:29 ] Unix文化ではうんたらかんたら
983 名前:デフォルトの名無しさん [2008/03/10(月) 12:48:36 ] 「#N/A」のようなエラーセルの値を変数に入れようとすると 「型が一致しません」というエラーが出るのですが、 例えばエラーセルの値をコンスタントに、「""」として処理するような 事は可能なのでしょうか? VBAがセルのエラー値をどのように扱っているのか、 msgboxで出すことも出来ないので 困っています。 お知恵拝借できると幸いです。
984 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 13:04:33 ] トラップ処理すれば
985 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 13:38:14 ] If(IsError(...
986 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 13:39:51 ] ttp://www.eurus.dti.ne.jp/~yoneyama/Excel/kansu/if_is.htm#is
987 名前:983 [2008/03/10(月) 14:27:26 ] >>984-986 ありがとうございます。 どちらかの方法でやってみようと思います。
988 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 16:59:57 ] Ctrl+セルクリックで選択範囲を追加していけますよね それをVBAで行うにはどうしたらいいですか? 例えば.Cells(i,j)が選択してある状態で、さらにCells(i+10,j)を追加で選択するにはどうしたらいいですか? .Cells(i,j).Select hoge .Cells(i+10,j)Select ←ここで、それまでの選択範囲に追加する形にしたい
989 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 17:23:03 ] selectionでrange取得 rangeに新cellを追加 追加したrangeをselect
990 名前:988 mailto:sage [2008/03/10(月) 18:07:51 ] >>989 >rangeに新セルを追加 はどうやって実現するのですか?
991 名前:デフォルトの名無しさん [2008/03/10(月) 19:46:03 ] Excel2003 XP SP2 結構でかいファイルのI/Oやコピーなどの処理をワーカースレッドで行なうことは可能でしょうか?
992 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 20:46:02 ] >>990 union
993 名前:デフォルトの名無しさん [2008/03/10(月) 20:52:13 ] 勉強中の者です。初歩的な質問で申し訳ないのですが、お力添えをお願いします。 条件分岐で、"A1"セルに何か入っている場合に実行、 空欄の場合はエラーメッセージを出したく思います。 if range("A1") = true then msgbox("実行") else msgbox("空欄です。") end if としてみたのですが、思うように動作致しません。 てっきり、false = 0 、 true は何か要素がある。と頭にあったのでやってみたのですが、 VBAの壁にぶちあたっております。 何卒、ご助力を賜りたく存じます。よろしくお願いします。
994 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 20:57:49 ] =""
995 名前:デフォルトの名無しさん [2008/03/10(月) 21:21:05 ] If Range("a1").Value <> "" Then MsgBox "何か入っている" Else MsgBox "空欄" End If
996 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 21:35:39 ] false = 0 、 true = -1 0 = false、 0以外 = true
997 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 22:03:18 ] if Typename(Range("A1")) <> "Empty" then 〜 ではどうか
998 名前:デフォルトの名無しさん [2008/03/10(月) 22:47:48 ] みなさんありがとうございます。 検証してる間にスレ落ちしてしまうと申し訳ないので、お礼だけ先に。 明日検証いたします。 本当にありがとうございました。
999 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 08:20:17 ] .
1000 名前:小倉優子 ◆YUKOH0W58Q mailto:sage [2008/03/11(火) 08:20:37 ] 1000ならジュースでも飲むか
1001 名前:1001 [Over 1000 Thread] このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。