1 名前:デフォルトの名無しさん [2008/06/04(水) 22:56:59 ] すまんが2の人テンプレやって ExcelのVBAに関する質問スレです 質問前に 【 >>2-3 】 あたりを良く読むこと 前スレ pc11.2ch.net/test/read.cgi/tech/1205231499/l50 ★1 質問テンプレ(雛形)は用意しませんが、OSとExcelのバージョンは必ず書きましょう。 ★2 ExcelのVBA以外の部分に関する質問はNGです。 但し、VBA無しでも出来ることだが、あえてVBAでやりたいって物に関してはOK。 ★3 ExcelのVBE(Visual Basic Editor)を使うとしても、VBAの分野以外に関してはスレ違いです。 VBAとは、『Visual Basic for Application』の略で Application ├Workbooks |└Workbook | ├Worksheets | |└Worksheet というApplication以下のオブジェクトを、VB言語で操作するものを指します。 例えExcel付属のVBE(Visual Basic Editor)を利用しようとも、このApplication以下のブックやシート、 セルやオブジェクト等を操作するもの以外はVBA分野の話ではないので、ここでは聞かないでください。 ★4 とりあえず、Excelのインスタンスを作らずにVB6で出来ることは全てスレ違いだと思ってください。 ★5 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。 ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。
643 名前:デフォルトの名無しさん mailto:sage [2008/08/02(土) 18:52:55 ] VBAはブロック単位で変数が初期化されるわけじゃないから、 初期化処理を書かないまま特定の処理部分をループにしたりすると、 前回の内容がそのまま流れてきたりしてしまうんだよなあ。
644 名前:デフォルトの名無しさん mailto:sage [2008/08/02(土) 19:00:17 ] static i が良く分かりません。 関数1で使った変数の続きを関数2で利用する時に、 いったん、ストック用の変数に入れて、関数2の時に呼び出してる人がいたので、 staticで続ければ良いんじゃないですか? と言ったら、無知は黙ってろ。と言われました。 staticは関数間で解放されない変数と記憶していたのですが、間違ってますでしょうか。
645 名前:デフォルトの名無しさん [2008/08/02(土) 19:31:37 ] エクセルからワードに差し込むように エクセルファイル(データ)→エクセルファイル(伝票書式)に差し込みたいけど 伝票書式側のファイルにVBAや関数組んで引っ張ったほうがいいのかな? 差込ボタンを押したら ・(データ)ファイルの一番下の行をコピー ・(伝票)ファイルの適当なところに貼り付け ・でそこをセル参照 ・↑↓ボタンを押したら(データ)ファイルのデータの1行上・下をコピー、以下同 こんな感じでしょうか? もっといい関数とやらはあるのでしょうか? 会社のPCはアクセス無いから大変だ・・
646 名前:617 [2008/08/02(土) 20:18:35 ] >>623 すいません。もう少し詳しく教えて頂けませんか?
647 名前:デフォルトの名無しさん mailto:sage [2008/08/02(土) 20:39:25 ] >>645 >・↑↓ボタンを押したら(データ)ファイルのデータの1行上・下をコピー 押したタイミングで命令をするならイベントハンドラの考え方になるね。 SheetSelectionChangeイベントが良いかな。 右左をとれないようにして、keydownで設定するのも良いかも。 ここまで書いたんだけど、どんな制御にしたいかイメージが難しいです。 すいません。
648 名前:y mailto:sage [2008/08/02(土) 21:16:58 ] >>642 >>643 その後、ループの中から別関数を呼び出し、呼び出し先関数でもループを用いる形が出てきて、 同じPublic iを使い回していたその画期的なシステムは、完全に機能不全に陥りました。 >>645 いろいろなやり方があると思います。私はむしろデータブック側に、 任意のデータを取り出すためのユーザー定義関数を実装し、 伝票書式ブック側から参照設定するやり方をよく用います。 たとえば、データの主キーが「伝票番号」である場合、 「伝票番号」を渡すとその伝票の売上日を返す関数UriageDate(dNum)、 売り先を返す関数Urisaki(dNum)、金額を返す関数Kingaku(dNum)、 などをデータブック側に定義しておきます。 そうして伝票書式ブックから参照設定でそれらの関数を 利用できるようにすれば、任意のセルにその関数を入れるだけで、 お好みのデータを取り出すことができます。 たとえば、伝票書式ブックのA1が伝票番号のセルだとすると、あとは任意のセルに =UriageDate(A1)、=Urisaki(A1)、=Kingaku(A1) という数式を埋め込んでおけば、A1の伝票番号を変えるだけで、 即座にこれらの関数が適切なデータを返してくれます。 伝票書式ブック側にVBAモジュールを実装し、その中で「Cells(3,4)に売り先を書き込む、Cells(4,10)に金額を書き込む」 とやっていると、伝票書式のデザインを変更したいときに柔軟に対応できませんが、 このやり方なら、数式を埋め込むセルを変えるだけで済みます。 また、参照設定さえすれば、さらに別のブックからもこれらの関数を利用できます。
649 名前:デフォルトの名無しさん mailto:sage [2008/08/02(土) 21:28:15 ] 機能不全になる前に気づけよw
650 名前:デフォルトの名無しさん mailto:sage [2008/08/02(土) 21:36:20 ] 他人に迷惑かけない限り別にいいじゃない。 641じゃないけど実際に痛い目にあうとよく覚える。
651 名前:デフォルトの名無しさん mailto:sage [2008/08/02(土) 21:38:18 ] カスタムシート関数の場合は共有設定でも見られるのがいい
652 名前:y mailto:sage [2008/08/02(土) 21:46:37 ] >>649 機能不全の理由が分かるまで3日ぐらいかかりましたw 初めての頃はまずそんなもんです。 >>644 間違っているかどうかは、文章だけではよくわかりません。 関数1を呼び出す関数が、関数2以外にも複数ある場合は、 それら別の関数が、関数1の中の Static i をいじる可能性があります。 本来、Static変数はそういう使い方をされるためにあるのですが、 やはり場合に応じて、いじられても良い時と、いじられたら困る時とがあります。 後者の場合は、とりあえず現在の値をどこかにストックしておく必要が生じます。
653 名前:645 mailto:sage [2008/08/02(土) 22:04:31 ] ユーザー定義関数か・・・ちょっとやってみよう
654 名前:デフォルトの名無しさん mailto:sage [2008/08/02(土) 22:33:09 ] ちなみにユーザ定義のシート関数のパフォーマンスなら↓に載ってた。 まあ、正確だとはいえないが、VBAが決して遅くないことがわかる。 www.spreadsheethell.com/codematic/Excel-development/Excel-Visual-studio/excel-user-defined-functions.htm
655 名前:デフォルトの名無しさん mailto:sage [2008/08/02(土) 23:38:08 ] C#圧倒的だな
656 名前:デフォルトの名無しさん mailto:sage [2008/08/03(日) 00:02:13 ] そうね 圧倒的に遅い
657 名前:デフォルトの名無しさん [2008/08/03(日) 00:12:51 ] マクロでコピー、貼り付けを記録すると Range("A3").Select Selection.Copy Range("C3").Select ActiveSheet.Paste こうなりますが、汎用性を高めるために i=Activecell.row Cells(i,1).Select Selection.Copy Cells(i,3).Select ActiveSheet.Paste としました。 でもコピー貼り付けが多くなったり、列入れ替えがあると列の番号の変更が大変です。 シートの上端行を名前で定義した場合、マクロで名前を使うにはどうすればいいのでしょう? Cells(i,"顧客名").Select のように使えたらいいのですが・・・
658 名前:デフォルトの名無しさん mailto:sage [2008/08/03(日) 00:15:53 ] Range("C3") = Range("A3") でおっけ
659 名前:657 mailto:sage [2008/08/03(日) 00:24:34 ] A3をC3にコピーするだけじゃなく 汎用性を高めるために 選択セルの行の 1列目を3列目にコピーするようにしたいのです。(実際は別ブックへ)
660 名前:デフォルトの名無しさん mailto:sage [2008/08/03(日) 00:45:57 ] do until cells(1,j).value = "顧客名" j = j + 1 loop cells(i,j).copy とか?
661 名前:デフォルトの名無しさん mailto:sage [2008/08/03(日) 00:47:13 ] 普通に[1:1].Find("顧客名").Column??
662 名前:657 mailto:sage [2008/08/03(日) 06:52:56 ] i = ActiveCell.Row j = [1:1].Find("顧客名").Column Cells(i, j).Select Selection.Copy Range("C3").Select ActiveSheet.Paste でうまくいきました。ありがとうございます。
663 名前:デフォルトの名無しさん [2008/08/03(日) 22:25:28 ] 部門テーブル 主キー 01)部門CD 数値 4桁 02)部門カナ 文字 10桁 03)部門名 文字 20桁 04)部門略称 文字 6桁 05)作成日 日付 --桁 06)作成時間 時間 --桁 07)作成端末 数値 7桁 08)作成者ID 文字 10桁 09)更新日 日付 --桁 10)更新時間 時間 --桁 11)更新端末 数値 7桁 12)更新者ID 文字 10桁 部門CD,部門カナ ,部門名 部門略称 作成日 作成時間 作成端末 作成者ID 更新日 更新時間 更新端末 更新者ID 1,エイギョウ 営業 営業 2002/09/01 00:00:00 80001 FUJI 2002/09/01 00:00:00 80001 FUJI
664 名前:デフォルトの名無しさん mailto:sage [2008/08/03(日) 22:28:16 ] おっと
665 名前:デフォルトの名無しさん [2008/08/03(日) 22:53:52 ] 663のを教えて。
666 名前:デフォルトの名無しさん mailto:sage [2008/08/03(日) 23:00:13 ] 富士通もとうとう日本語が喋れないのが標準になったか
667 名前:626 [2008/08/04(月) 03:41:16 ] >>629 >次に、補完したくない要素について、線の色を背景色と同じにし、見えなくします。 一部線が引かれているところがあり、そこは見えてもらわないと困るのです。
668 名前:デフォルトの名無しさん mailto:sage [2008/08/04(月) 04:00:15 ] >>667 データを線形補間して、別のシートに出力、グラフ生成
669 名前:デフォルトの名無しさん [2008/08/04(月) 07:55:36 ] Excelの機能には限界があるんだから、Excelでできない事は自分でやらないと
670 名前:デフォルトの名無しさん mailto:sage [2008/08/04(月) 08:07:21 ] >>667 線全部じゃなくて、要らないところだけ背景と同色にすればいいだろ。
671 名前:y mailto:sage [2008/08/04(月) 14:08:37 ] >>667 >>670 でフォローしてくださっている通り、 線全部ではなく、一部分だけを背景と同色にできます。 >>629 のコード例はそのつもりで書いたもので、 系列1の線の、4つ目の線分だけを見えなくします。 つまり、点1から点4までと、点5から最後の点までは きちんとつながっている状態です。 手作業で(マウスで)試す場合は、ある線をクリックして、 さらにもう一度クリックしてみてください。 クリックされた線分だけがアクティブになるはずです。 その部分だけに、お好みの書式を適用できます。 その動作をマクロ記録すれば、VBAでどう表現するのか 分かりやすいと思います。 >>668 でもいいと思います。
672 名前:デフォルトの名無しさん mailto:sage [2008/08/04(月) 14:14:19 ] マクロ記録はAlt, T, M, Rと覚えてしまったら楽。
673 名前:デフォルトの名無しさん mailto:sage [2008/08/04(月) 15:39:51 ] 一つの変数を複数のユーザーフォームで使いまわす方法ありますかね?
674 名前:デフォルトの名無しさん mailto:sage [2008/08/04(月) 16:15:19 ] >>672 やめてくれ。マクロ記録するたびにあのボーカルの顔が浮かんじまうw >>673 「使いまわす」を詳しく。
675 名前:デフォルトの名無しさん [2008/08/04(月) 21:21:01 ] 久しぶりにマクロ組んで保存して使おうと思ったら・・・・ マクロ有効形式でなければ保存受け付けないだの セキュリティレベルの警告も出ないまま無効だの ファイルが安全な場所になきゃ有効にしてくれないだの すげーむかついた vista視ね
676 名前:デフォルトの名無しさん [2008/08/04(月) 22:03:41 ] visuta厨涙目w
677 名前:デフォルトの名無しさん mailto:sage [2008/08/04(月) 22:12:52 ] それWindows VistaだからじゃなくてOffice 2007だからだろ。
678 名前:デフォルトの名無しさん mailto:sage [2008/08/04(月) 23:57:08 ] 2007のリボンは本当にひどい。 慣れとか言う以前に、慣れても面倒。 クリック回数が増えただけですわ。 Alt+F8 , Alt+F11 で慣れてないとVBE環境もつらい・・。
679 名前:デフォルトの名無しさん mailto:sage [2008/08/05(火) 00:27:38 ] 他に選択肢ないのがつらいね あぁ待てばいいだけか
680 名前:デフォルトの名無しさん mailto:sage [2008/08/05(火) 09:51:05 ] 質問です。現在、ユーザーフォームを.PrintFormを使い印刷しています。 このユーザーフォームは、 上側にボタンが横一列で並んでいて 中央にコメントボックス、 下側にラベル という形になっています。 このユーザーフォームを、コメントボックスとラベルのみを印刷、 又は印刷時にボタンを非表示にする、ということは可能でしょうか? もしできるのであればその方法を教えてください。お願いします。
681 名前:デフォルトの名無しさん [2008/08/05(火) 10:23:10 ] >ボタンを非表示にする、 という事であれば、 userform1.button1.visible = false にすれば 非表示には出来る
682 名前:デフォルトの名無しさん [2008/08/05(火) 11:29:34 ] セルに文字列があり、変数に取り込みメッセージの一部に使いたいのです。 しかしセルに改行が入っていると当然メッセージでも改行されます。 改行を取り除く方法があれば教えてください。
683 名前:デフォルトの名無しさん mailto:sage [2008/08/05(火) 11:38:02 ] vbcrlfを探して取り除く。
684 名前:デフォルトの名無しさん mailto:sage [2008/08/05(火) 17:13:22 ] Alt+Enterでのセル内改行はvbLfのみだぞ .Value = "a" & vbCrLf & "b" みたいにすれば、vbCrLf での改行も不可能では無いが 普通はvbCrLfを取り除いても意味無い
685 名前:デフォルトの名無しさん mailto:sage [2008/08/05(火) 20:01:44 ] excelでデータベースのロジカルチェックを掛ける事を考えておりまして、 つきまして、プログラム構造、モジュール構造についてアドバイスを頂きたく投稿します。 ロジカルチェック自体は、200-300個あります。 今考えているのは、1つのモジュールに、private sub で200個のプログラムを書いておき、 1つの sub で200個のチェックプログラムを call しようと考えています。 そこで質問なのですが、1つのモジュールにたくさん詰める事は好ましくないのでしょうか。 保守を考えると、private sub A010010 のように、チェック番号をプログラム名にしておけば、 Ctrl+Fの検索で、見つけやすいかなぁ。と思っています。 皆様だったらば、どのように構築していくか等、アドバイスを頂ければ幸いです。 よろしくお願いします。
686 名前:デフォルトの名無しさん mailto:sage [2008/08/05(火) 20:19:44 ] ストアド書いて、befor triggerにしろ
687 名前:デフォルトの名無しさん mailto:sage [2008/08/05(火) 21:09:25 ] 勉強不足で申し訳ありません。ストアドプロシージャは初めて聞きました。 データベースはSASで作成されているのですが、SASを使える人が少ない上、 教育に金が掛かる&SASライセンスが高い。と言う理由で、 なるべくコストの掛からない方向を考えている次第です。 統計解析を行うので、データベースをSASから変える事は難しいです。 イメージとしては、SASで作成されたデータセットを1つのブックに統合し、 その統合ファイル上でロジカルチェックを掛けられればと思っています。 当方、ACCESSやSQLの知識が無い為に、ストアドと言う単語も初めて聞いたのですが、 やはりEXCELのみで完結させるのは難しいでしょうか。 もし可能であれば、もう少し詳しく教えていただけますでしょうか。よろしくお願いします。 情報小出しのようになってしまい申し訳ありません。
688 名前:デフォルトの名無しさん mailto:sage [2008/08/05(火) 21:28:12 ] >>687 長い目で見れば、弊社のような専門家にお任せいただくのが一番かと存じます。
689 名前:デフォルトの名無しさん [2008/08/05(火) 21:30:04 ] 難しい言い回しにしなくてもいいと思うよ www005.upp.so-net.ne.jp/aoken/sas/sas_iom_xls.html
690 名前:y mailto:sage [2008/08/05(火) 21:38:27 ] >>685 最適な構造は、最終的にどういう運用をしたいのか なるべく具体的にイメージすることで見えてきます。 細部の仕様も、その過程で決まっていきます。 ・常に全種類のチェックが必要か →状況により、「前半のチェックは省略したい」などの要求が起こりえる場合 →Call文のコメントアウトで対応? →スイッチUI実装? →チェックする項目のプリセットを保存できれば便利? ・エラーレポートはどうしたい? →Excelシートに出力 →テキストファイルに出力 ・修復ロジックも実装したい? そのプロジェクトは一人で担当しているのですか? もし何人かでやっているのであれば、上のような点を 協働者とも相談してみてください。
691 名前:デフォルトの名無しさん mailto:sage [2008/08/05(火) 21:44:58 ] >>689 ありがとうございます。ただ、SASでステップは走らせません:( すいません。私の質問の仕方が悪かったようです。 データベース、解析は一切関係無いとして、 1つのEXCELブック内にあるデータ同士の整合性をチェックするプログラムが200個あります。 この200個はどのように書いて行く、もしくは作成していくべきでしょうか。 個々に呼び出す必要はなく、必ず200個全てを走らせます。 1つの標準モジュールに200個羅列して行くべきか、モジュールを分割するべきか、 はたまたストアドを利用するか・・・。 ストアドプロシージャを調べてもEXCELと関連のあるページは見つけられませんでした。 本当に申し訳ありません・・・。
692 名前:デフォルトの名無しさん mailto:sage [2008/08/05(火) 21:54:01 ] >>690 レスありがとうございます。 組み込んだロジカルチェックは必ず全部実行させます。 エラーレポートに関しては、後々処理が出来るように、別ファイルにダンプし、ログとして集積させます。 そして、レポートを発行する際に、管理番号でオートフィルタを掛け、 マクロでレポートの形にして、発行出来るようにする事を考えています。 プロジェクトとしては、これから提案して変えて行こうと思っている段階です。 その為には、具体的にロジカルチェックをEXCELのみで掛ける事が重要と思いまして、 質問をさせていただきました。
693 名前:デフォルトの名無しさん mailto:sage [2008/08/05(火) 21:56:31 ] >>692 運用がわからんからなんとも言えんが、パフォーマンスなんかは問題にならんの? # そして全く無視される>688w
694 名前:デフォルトの名無しさん mailto:sage [2008/08/05(火) 22:03:04 ] >>693 private sub で200個を1つのモジュールに記載して、 呼び出し用の sub で200個を call する事は問題が無いのか、そこが気になっています。 そこまで多くのプログラムを1つのモジュールに書いた事がありません。 本当に動くのかも悩みの種です。 統合ファイルの内訳としては、その度に変わるので一概には言えないのですが、 平均すると25-30シートで、1つのシートに多くとも2000行程度なので、問題はなさそうです。
695 名前:デフォルトの名無しさん mailto:sage [2008/08/05(火) 22:37:38 ] >>694 ・Subではなくて、FunctionでBooleanを返したほうが良いのでは? ・一つのモジュールに入る大きさのコードなら、どれだけ書こうと全く問題がない(限界を超えたら 実行時エラーとして教えてくれる) ・保守を考えるなら、第三者が見てわかりやすい関数名にしたほうが良い ・関数名には日本語が使えて、さらに日本語を使っても全く問題がないので、日本語を使った 関数名にするというのも一つの手
696 名前:デフォルトの名無しさん mailto:sage [2008/08/05(火) 22:51:41 ] >>695 レスありがとうございます。 functionのboolean戻りは良いですね。 booleanで返した時に、エラー項目を引っ張る際にもう1段踏まないと行けないのがつらそうですが、 何とか対処出来そうです。 やはりモジュールに限界はあるのですか・・・。でも実行時エラーが出るなら安心ですね。 実はチェックリストが存在していて、そのチェックリストを基にプログラムを組むので、 チェックNo.のコードを関数名にするのが良いと思いました。 アドバイスありがとうございます。
697 名前:デフォルトの名無しさん mailto:sage [2008/08/05(火) 23:02:38 ] 200ねえ… そんな量じゃなければ、私ならインタフェース使ってクラス量産かな。 (なんせ200もクラスがあるとウザいので) これなら処理を値として扱える。
698 名前:デフォルトの名無しさん mailto:sage [2008/08/05(火) 23:05:49 ] >>697 ですよねぇ・・・。 一つ一つは小さい処理で、日時の整合性を確かめたりする程度なのですが、 何せ200-300、プロジェクトによってはもっと増える事もあるんですよね。 だから、作成者と保守者が別でもわかりやすいように、と色々考えてはいるのですが、 なかなか纏まらない感じです。 皆様、アドバイスありがとうございました。 2-3日、無い知恵絞って頑張ってみようと思います。 本当にありがとうございました。失礼します。
699 名前:y mailto:sage [2008/08/05(火) 23:09:40 ] >>694 >private sub で200個を1つのモジュールに記載して、 >呼び出し用の sub で200個を call する事は問題が無いのか 私も、これ自体は問題ないように思います。 少し上のほうのレスに、再帰呼び出しの話題がありますが、 数百個ぐらいなら、たとえネスト呼び出ししても大丈夫です。 コードの長さについては、万が一どうしても収まらない事態になれば 別々の標準モジュールに分割してもいいでしょう。 その場合、各ロジックチェックはPublicスコープにする必要がありますが、それが 嫌であれば、クラスモジュールに書いてFriendスコープにしておく手もあります。 いずれにしても、取り返しのつかない結果になる心配はありません。 常に200のチェックを行い、カスタマイズの可能性も無いのであれば、 まず1つのモジュールに羅列しておくのがシンプルで良いかと。 >>695 の >・Subではなくて、FunctionでBooleanを返したほうが良いのでは? と同じことを考えていましたが、エラーログ出力部となるプロシージャをどのように 配置するかによって、2通りの構造が考えられます。 ロジカルチェックをFunctionで書いて、呼び出し元にエラーチェック結果を返し、 呼び出し元からエラーログ出力プロシージャを呼ぶのか、 あるいは、ロジカルチェックをSubで書いて、エラーが検出されたらそのSubから エラーログ出力プロシージャを呼ぶのか。 単純に「エラーがあった、なかった」だけのレポートで済むのであれば、 Bool値を返すFunctionでいいと思いますが、「どのようなエラーなのか」まで 表現したい場合は、後者の方が都合がいいかもしれません。
700 名前:デフォルトの名無しさん mailto:sage [2008/08/05(火) 23:12:36 ] COM経由で呼べる組み込み言語ってないだろうか。 適当にJScriptインタプリタ起動できたりしないのだろうか。厳しいかな。
701 名前:デフォルトの名無しさん mailto:sage [2008/08/05(火) 23:31:26 ] ときどき 0& ってのを見るんだけど、これってどういう意味ですか? If Len(buf) = 0& Then〜 みたいな感じです
702 名前:デフォルトの名無しさん mailto:sage [2008/08/05(火) 23:37:33 ] Long型の0
703 名前:デフォルトの名無しさん mailto:sage [2008/08/05(火) 23:38:51 ] ごめん うそ
704 名前:デフォルトの名無しさん mailto:sage [2008/08/05(火) 23:45:50 ] >>700 Microsoft Script Control
705 名前:デフォルトの名無しさん mailto:sage [2008/08/06(水) 00:27:14 ] >>704 thx!
706 名前:デフォルトの名無しさん [2008/08/06(水) 11:07:42 ] 範囲(行のみ下がる、列数data_nは同じ)が離れているセルの値を、その範囲だけ、二次元配列に格納したいです。 仮に範囲数が4つなら二次元配列は(4,data_n) unionで範囲を結合しても3つまでしか結合できませんでした。 だから1つずつ範囲から値を配列に格納しようとしていますがうまくいきません。 どのように配列定義、範囲から二次元配列への格納をすればよいでしょうか?
707 名前:y mailto:sage [2008/08/06(水) 18:02:38 ] >>706 >範囲数が4つなら、二次元配列(4, data_n) という点から想像すると、それぞれの範囲は1行×data_n列のサイズになっている ということですか? まず配列の定義ですが、特に設定を変えない限り、配列の番号は0から始まるので、 (4, data_n) と定義すると、実際には 5 × (data_n + 1) 個分の配列が 準備されます。本当にそれでいいかどうか確認してください。 次に格納の仕方ですが、 >1つずつ範囲から値を配列に格納しようとしていますがうまくいきません。 この考え方でも大丈夫です。中途半端でも構わないので、 とりあえず書いたコードを貼ってみてください。
708 名前:デフォルトの名無しさん mailto:sage [2008/08/06(水) 19:37:01 ] 春日部市1-2-3のような文字列の数字部分のみ半角に変換する方法を探していたら 次のようなマクロを見つけました。 Sub MacroR() Dim idx As Integer, trg As Range Set trg = ActiveSheet.Cells.SpecialCells(xlCellTypeConstants, xlTextValues) For idx = 0 To 9 trg.Replace What:=Right(StrConv(Str(idx), vbWide), 1), Replacement:=Right(Str(idx), 1) Next End Sub ここでRight関数を使っているのは、Str関数だと先頭に符号が付くからですか? これのReplaceの部分を trg.Replace What:=StrConv(CStr(idx), vbWide), Replacement:=idx に変更すると同じ事が出来たのですが、これだと何か不都合が出たりしますか?
709 名前:デフォルトの名無しさん mailto:sage [2008/08/06(水) 19:44:55 ] 変数のスコープについて教えてください。 全ての標準モジュールで使用出来る範囲を付与するには、 どの部分に、どのように宣言したらよろしいのでしょうか。
710 名前:y mailto:sage [2008/08/06(水) 20:06:42 ] >>708 あなたのコードの方が良いように思います。 ReplacementのところはCstr(idx)にするとより丁寧です。
711 名前:y mailto:sage [2008/08/06(水) 20:11:16 ] >>709 付属のヘルプで、 「Public ステートメント」 「Public ステートメントの使用例」 を検索してみてください。
712 名前:デフォルトの名無しさん mailto:sage [2008/08/07(木) 00:01:04 ] >>709 つりですか?
713 名前:デフォルトの名無しさん [2008/08/07(木) 09:47:54 ] >>707 はい1×data_nです。 Dim data AS Variant search=0 if 該当の行が見つかったら then search=search+1 data(search) = range(cells(search,data_n),cells(search,data_n)) endif 複数行をまとめて配列に移したいのです。 unionでダメでした。 妥協するならせめて一行をまとめて移したい。 上記は妥協コードです。
714 名前:y mailto:sage [2008/08/07(木) 17:31:25 ] >>713 やりたいことは、何となくわかりました。 ・セルを上から一つ一つチェックして ・該当の行が見つかったら ・該当の行のデータを配列に書き込む という流れですね。 2次元配列に含まれる、特定の一次元配列に対して、まとめて書き込みを することはできません。 該当の行の値を一つ一つ書き込むことになります。 For i = 0 To data_n - 1 data(search, i) = cells(該当の行 , i + 1) Next ちなみに、「該当の行が見つかったら」とありますが、 該当の行が全部で何行あるかは、あらかじめ分かるのですか。 それとも、見つかった数だけ配列のサイズを増減したいですか。
715 名前:デフォルトの名無しさん [2008/08/07(木) 19:52:23 ] >>714 やりたいことはそうです。 data_nはあらかじめ与えられており、一定です。 配列に一行ずつ入れるのは無理なのですね。 では、見つかったセルを一気に写す方法はないでしょうか? やはり rng=union(rng,見つかった新たな行) で最後に 配列にrngを代入したのですが、3行分しか入らなかったのです。
716 名前:デフォルトの名無しさん [2008/08/07(木) 20:08:25 ] >>714 該当の行の数は決まってません。 1〜240個で変動します。
717 名前:デフォルトの名無しさん mailto:sage [2008/08/07(木) 21:22:20 ] 最近、yって子が頑張ってるね まだまだVBAというかプログラム言語を始めたばかりのようだが 質問に答えるために調べる、質問に答える為に考えるというのは 結構身になるものだから、これからも頑張ろう
718 名前:y mailto:sage [2008/08/07(木) 21:38:52 ] >>715 Unionで結合されたRangeは、内部的にはコレクション(のようなもの)であり、 二次元配列ではないので、直接に代入はできません。全体が連続していれば、 二次元配列と解釈してくれるので代入は可能なのですが、この場合は各範囲が 離れています。3行分入ったのは、Unionされた各範囲のうち、先頭の範囲から 3行分が偶然連続していたためと思われます。 さて、Unionされた範囲を取得ところまではなさっているようですので、 そこからどうもっていくかについてです。上記の通り、全体を直接代入できないため、 ここでもやはり、一つ一つ値を格納していくことになります。 まずは、格納先となる配列のサイズを確定します。dataは動的配列で宣言しておき、 Dim data() As Variant ReDimステートメントを使ってサイズを確定します。 Redim data(1 To 行数, 1 To 列数) 列数は、data_n となります。さて行数はどうなるでしょうか? ヒント:rng.Countで、Unionされた範囲rngに何個のセルが含まれるかを取得できます。 >続きます
719 名前:y mailto:sage [2008/08/07(木) 21:40:46 ] >>715 (続き) 続いて、格納するためのループです。For Each で、 rngに含まれる各セルを1つずつtmpに取り出し、 data(r, c)に代入します。 ここでrは二次元配列の行番号、cは列番号です。 Dim r as Long, c as Integer, tmp as Variant r = 1: c = 1 For Each tmp In rng data(r, c) = tmp c = c + 1 If ??? > data_n Then r = r + 1 c = 1 End If Next ???には何を入れればいいか、考えてみてください。
720 名前:y mailto:sage [2008/08/07(木) 22:24:41 ] >>717 情報系の教育は受けたことはないのですが、 最近、人にVBAを教えなければならない立場になってしまい、 ありとあらゆる質問が投げられてくるこのスレで 修行させていただいています。 自分のレスを見直すために、簡単な名前をつけています。 2年ほど前は、私も>>706 や>>401 のような質問をしていました。 その頃アドバイスしてくださった方々には大変お世話になりました。
721 名前:デフォルトの名無しさん [2008/08/07(木) 23:29:41 ] >>719 ???はc。 ありがとうございます。 やはり一つづつですか。 しかし、それだとCell毎にExcelにアクセスするので速度が遅くなるような気がします。 できないことがわかったので、代案としては Dim data as Variant (一次元配列用) Dim r as Variant (二次元配列用) '-------一行丸ごと配列格納 data = range(cells(search,data_n),cells(search,data_n)) そのあとrからdataへ つまり一次元配列から二次元配列へ一気に代入する方法はないでしょうか?
722 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 00:27:34 ] VBって、配列は弱いんでなかったっけ。 配列数指定しないといけないし。
723 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 00:39:34 ] 1回の格納ごとにredim preserveしていってもそこまで遅くは無い。 というか、あきらめるべき。 ちなみにredim preserveを減らそうがためにVectorみたいな 一度にアロケートする成長リスト形式にしても速くならなかった。
724 名前:デフォルトの名無しさん [2008/08/08(金) 00:46:27 ] >>723 いや、Cellsを毎回使うことが遅くなるということで。。。 tmpに一気に代入されているという解釈になるのかな。。。 【参考】VBA高速化 ttp://officetanaka.net/excel/vba/speed/index.htm
725 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 00:49:48 ] あ、ごめん 上レスぜんぜんみてなかった
726 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 01:39:10 ] >>721 >しかし、それだとCell毎にExcelにアクセスするので速度が遅くなるような気がします。 おまえは馬鹿のクセに試しもせずに答えを求めるな 時間計って試してから出直して来い
727 名前:デフォルトの名無しさん [2008/08/08(金) 02:00:11 ] セルがいくら多くてもシートやオートシェイプのオブジェクトをループする遅さに比べたら全然速い
728 名前:デフォルトの名無しさん [2008/08/08(金) 03:35:17 ] セルを参照する数が多いと遅くなるよ。 だから範囲を全て配列に渡してから配列で演算するのが常套手段。
729 名前:デフォルトの名無しさん [2008/08/08(金) 03:37:08 ] >>721 >>716 >1〜240個で変動します。 つまりMAXで240×data_nのセル参照数となるから data_nが50程度なら感じるほどに遅くなるよ。
730 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 05:46:25 ] >>721 速度を気にするなら >>728 の言う通り一度範囲を全て配列に渡してから処理する方がいい 例えばこんな感じ Sub hoge() Const date_N As Integer = 50 Dim Buf As Variant, Buf2 As Variant Dim iC As Integer, iC2 As Integer, X As Integer With Worksheets("Sheet1") Buf = .Range(.Cells(1, 1), .Cells(250, date_N)).Value End With X = 1 ReDim Buf2(1 To date_N, 1 To X) For iC = 1 To 250 If Buf(iC, 1) = "A" Then ReDim Preserve Buf2(1 To date_N, 1 To X) For iC2 = 1 To date_N Buf2(iC2, X) = Buf(iC, iC2) Next iC2 X = X + 1 End If Next iC ReDim Buf(1 To UBound(Buf2, 2), 1 To UBound(Buf2, 1)) For iC = 1 To UBound(Buf, 1) For iC2 = 1 To UBound(Buf, 2) Buf(iC, iC2) = Buf2(iC2, iC) Next iC2 Next iC End Sub
731 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 10:47:54 ] >>730 速度気にするなら無駄多すぎw Sub hoge() Const DATA_N As Integer = 50 Const DATA_ROW As Integer = 250 Dim Buf As Variant Dim iC As Integer, iC2 As Integer, X As Integer Buf = Sheet1.Range("A1").Resize(DATA_ROW, DATA_N).Value For iC = 1 To DATA_ROW If Buf(iC, 1) = "A" Then X = X + 1 For iC2 = 1 To DATA_N Buf(X, iC2) = Buf(iC, iC2) Next iC2 End If Next iC Sheet1.Cells(DATA_ROW + 2, "A").Resize(X, DATA_N).Value = Buf End Sub
732 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 13:32:19 ] 時間計るのに、ミリ秒まで計る方法ってある?
733 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 19:07:14 ] API
734 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 20:55:33 ] 240個だけw
735 名前:y mailto:sage [2008/08/08(金) 21:05:51 ] 速さへの関心が高いようですね。計測用のマクロを書いて、計ってみましたよ。 あくまで向学心(というか興味本位)です。速さが全てではないはずなので、 あまり過敏に反応しないでくださいね。 >>718-719 85 milliSec >>730 20 milliSec >>731 (セルへの書き込みの部分は含まない) 10 milliSec タイムは、10回計った平均です。 準備したテストデータは、 250行×50列の範囲に、1行おきに該当行(1列目の値が"A")を配置してあります。 つまり、該当行は150行です。 >>731 は、配列変数のサイズが最後まで250行のままである点など、厳密な比較ではありません。 でも、セルへの書き込み時に切り捨てるという解決の仕方がおもしろいですね。勉強になります。 ちなみに、ミリ秒単位の時刻を得るために、 ttp://members3.jcom.home.ne.jp/daruma_kyo/info/getMilliSec.html で公開されているモジュールを利用しています。
736 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 21:18:00 ] >>731 速度気にしてるつもりなのに無駄多すぎ > Const DATA_N As Integer = 50 数値型、文字列型の定数で型指定するな > Dim iC As Integer, iC2 As Integer, X As Integer カウンタはIntegerで桁が足りてもLong使え > Range("A1") 文字列での参照ではなくCells(1,1)とインデックス参照しろ > Cells(DATA_ROW + 2, "A") こちらも同じく "A" ではなく 1 で っていうかこの話、配列クラス自作しちゃった方が早い気がする 無駄に注文多くて我が侭なのに、デフォで用意されてる配列でどうにかしようってのが間違いだろ
737 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 21:18:52 ] ExcelVBAでやる時点で間違っている
738 名前:デフォルトの名無しさん [2008/08/08(金) 21:23:40 ] 今のPCなら数百のシートを操作してもそんなにストレス感じないのに msecオーダーで速度求めるならC++で書けよなと思った。
739 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 21:51:05 ] 正直言って、VBAは速度気にしないで使えるのが気楽で良い。 VBAだしぃー。ってのが免罪符になる。 本当に商用プログラムを作るならばVBAでやる事が前提からして間違い。 マシンパワーに余裕が出てきた今だからこそ、速度は敢えて気にしない。 と言っても、cells選択したり、表示速度が極端に遅くなるのは論外ね。
740 名前:デフォルトの名無しさん [2008/08/08(金) 21:51:07 ] ちなみにC++で書いたことあるけどそんなに劇的には速くならないけど
741 名前:y mailto:sage [2008/08/08(金) 21:57:21 ] >>736 >文字列での参照ではなくCells(1,1)とインデックス参照しろ おー、ほんのちょっと速くなった。 >カウンタはIntegerで桁が足りてもLong使え Longにしてみたら、やはりちょっと遅くなるんですね。 >>737-738 すみません、つい出来心でやってしまいました。 「自分が提案したコードって、実はやたらと遅いの?」と思って確かめたかっただけです。 個人的には85milliSecで完了できれば充分じゃないかと思いますが... >>739 ですよねー >>721 ということでした。「一次元配列から二次元配列へ一気に代入する方法」ですが、やはり 「一気に」は無理です。そのかわり、いろんな別解やアドバイスが出てきて勉強になりましたね。 条件文は c で大正解です。これからも頑張ってください。
742 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 23:01:24 ] VBAでいろいろ書いて「これおっそいだろうなー」って思っても たいがい人間の認識できる速さのプランク長ぐらいで終わってしまう。驚き
743 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 23:14:00 ] ただあれだ。 ページの表示設定を印刷モードだっけか。あれにしてVBA走らせるとむちゃ処理重いな。 screenupdate falseにすりゃ良いんだけど。 あと覚えてるのだと、cells.autofitがむちゃ重い。 その狂ったマクロ作った奴は、流石にクレーム食らってた。
744 名前:デフォルトの名無しさん mailto:sage [2008/08/08(金) 23:22:45 ] FSOでネットワーク上のディレクトリ走査するのをExcel関数にして羅列してもなかなか遅くできる。
745 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 00:51:16 ] データの多いシートのAutoFitoはやばいぞ、VBAじゃなくても普通に遅い
746 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 09:43:06 ] 質問です。 マクロでPCのシャットダウンはできるのでしょうか? 出来たら、やり方を教えてください あと、MsgBoxをのバックを画像にすることは出来ますか? Windows98 Office2000 マクロ初めてまだ間もないです
747 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 09:50:31 ] >>746 >Windows98 そんな過去の遺物を使うのはやめなさい。 >マクロでPCのシャットダウンはできるのでしょうか? WinAPIを使えばできるはずですが。 >あと、MsgBoxをのバックを画像にすることは出来ますか? 日本語でOK。
748 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 10:58:21 ] >>746 API
749 名前:746 mailto:sage [2008/08/09(土) 13:43:59 ] >>747 メッセージボックスの背景を画像にしたいのですが、できますか? よろしかったらマクロのやり方を教えてください。
750 名前:デフォルトの名無しさん mailto:sage [2008/08/09(土) 14:37:09 ] >よろしかったらマクロのやり方を教えてください。 WinAPIを呼ぶだけです。それについては、>1の★4に該当するので教えられません。 >メッセージボックスの背景を画像にしたいのですが、できますか? そんなことをするよりも、画像を貼ったユーザフォームを用意した方が早いと思います。
751 名前:デフォルトの名無しさん [2008/08/09(土) 22:49:35 ] エスセルVBAがすきだたですが
752 名前:746 mailto:sage [2008/08/10(日) 03:48:25 ] >>750 ユーザーフォームでやってみました。 うまく出来ました。 もうひとつお聞きしたいことが、 ボタンを押すとユーザーフォームが出るようにしたのですが、いくつものユーザーフォームを作り、ボタンを押したら、 ランダムでユーザーフォームを表示することは出来ますか?
753 名前:デフォルトの名無しさん [2008/08/10(日) 07:10:45 ] >>626 等でグラフ補完を質問したものです。 そのときの回答>>629 をヒントに いらない部分の線を消すことで解決しました。 しかしExcel2003で開発していたのですが、 Excel2003では異なった場所の線が消えていました。 他のバージョンでも同様の結果を出すためにはどうすればよいでしょうか?
754 名前:デフォルトの名無しさん [2008/08/10(日) 08:26:21 ] シートに写真を複数枚挿入し、そのサイズ変更を一括で行うにはどうすればいいですか? シートには写真以外の図形オブジェクトもあり、それらは選択も変更もしません。 jpgだけを複数選択やワイルドカードなど使えるのでしょうか? 1枚だけマクロ記録するとこうなります。 ActiveSheet.Shapes("Picture 1").Select Selection.ShapeRange.LockAspectRatio = msoTrue Selection.ShapeRange.Height = 150.75 Selection.ShapeRange.Width = 201#
755 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 09:23:27 ] >>754 for each
756 名前:y mailto:sage [2008/08/10(日) 12:04:40 ] >>753 線分を消す部分のコードだけで構わないので、あなたが書いたものを貼ってください。 それに加えて、何番目の点と何番目の点の間の線分を消すつもりだったのかと、 その意に反して、どの線分が消えてしまったのかも書いてください。
757 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 13:00:09 ] ぬるぽですか
758 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 13:07:35 ] y消えろ
759 名前:デフォルトの名無しさん [2008/08/10(日) 13:39:51 ] >>753 訂正します。 >しかしExcel2003で開発していたのですが、 >Excel2003では異なった場所の線が消えていました。 Excel2003で開発してExcel2002では異なる結果でした。 Excel2003でコード実行し計算した結果グラフをファイルに保存し、 それをExcel2002で見るだけで異なる線が消えている。。。 またExcel2002で見た(異なる線が消えている)グラフを、再度Excel2003で見ると正常になる。 どうもグラフの順番のつけ方?の定義のようなものが異なるのではという感じがします。 コードのせいではないと思います。 しかしコレでは駄目なので。。。うーん悩ましい。
760 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 15:16:36 ] 本人に悪気はないんだろうけど、コテハン使うなら、 他の人がせっかく答えてるのに、被せて回答するのはやめた方が良い。 他の答えてる人の面目丸潰れだよ。 んでみんな答える気が失せて行く。
761 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 15:22:20 ] 本人を特定できるコテつけて発言してるなら別だが 名無しで面目もないもんだ
762 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 15:34:27 ] IDもでないしね
763 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 17:29:45 ] >>760 こういう手法もある、とか提示してくれる分にはいいんでない? セオリーや最短の方法イコール最善の方法、になるとは限らないし 傍目でROMってる人のレベルにうまくマッチする場合もあるしね
764 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 19:16:42 ] 勉強のために答えてるんだから大目に見てやれよ それに他の人の面目が潰れるほどの良回答はまだまだ出来てないじゃん 彼に面目潰されるようじゃ、潰された方がレベル低すぎってものだ
765 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 20:41:50 ] マターリやりましょ。 しかし最近は外部関数呼ぶ話が増えてきましたな。
766 名前:y mailto:sage [2008/08/10(日) 21:14:24 ] >>759 そうなんですか。失礼しました。 うちには2003しかないので、残念ながらその状況を再現できません。 2002のほうで、2003で実行したのと同じコードを実行するとどうなりますか? やはり2003とは異なる線分が消えてしまいますか? グラフの書式の仕様というと、Excel的にはとても大切なところなはずなので、 バージョン間でそう簡単に定義が変わるとは思えないのですが...
767 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 21:23:48 ] >>759 一度2002でもマクロの記録でやってみれば それでコードの問題かわかるだろ
768 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 01:13:09 ] TMR!TMR!
769 名前:デフォルトの名無しさん [2008/08/11(月) 09:02:55 ] >>767 2002はもっていないんです。 使用者からのバグ報告なので。
770 名前:y mailto:sage [2008/08/11(月) 19:08:16 ] >>769 2002で試せないなら、残念ですが私はもうお手上げです...
771 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 19:36:35 ] VBAと関係ない話なんでスルーしてもらって構わないんだけどさ。すごく気になったんで。 バージョンが多数存在するソフトの場合、金取って受注するならば、 可能な限り古いバージョンまで持っておかないとダメだよ。 金取って作業するならば、鉄則なんで。
772 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 19:42:22 ] Windows95サポートですね、判ります。
773 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 20:22:25 ] OSって意味じゃない。
774 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 20:52:48 ] > バージョンが多数存在するソフトの場合、金取って受注するならば、 > 可能な限り古いバージョンまで持っておかないとダメだよ。 そんなことは無い クライアントの発注要項に対応できるバージョンが揃ってれば問題ない 逆に考えれば、所有する環境で対応出来ない要項の発注は受けなければ良いだけ プログラムに限った話じゃないが、自分(自社)に何が出来て何が出来ないのかを把握して それに見合った受注をすれば良い、これこそが鉄則 設備、環境、能力以上の受注をしてしまうのは愚の骨頂だが、 何でもかんでも揃えようとするのもまた愚かしくある もちろん、事業拡大、売上向上の為には良い設備環境を整えるというのは大事だが 「可能な限り古いバージョンまで持っておかない」と、金取っての受注が一切出来ないわけでもないし 「可能な限り古いバージョンまで持っておく」ことが、金取って受注する上での鉄則でもない それと、VBAの場合はOSも関係有るよ Office(Excel)自体もOSのコンポーネント使ってるし、VBAからはCOM、Win32API、OCXなど 様々なOSのコンポーネントを任意で呼び出せる 故に、当然ながらOffice(Excel)のバージョンが同じでも、OSが変われば結果も変わることがある 場合によってはOSのSPが変わっただけでも影響があるくらいだからな
775 名前:デフォルトの名無しさん [2008/08/11(月) 23:33:16 ] 別bookの「ホゲ.xls」が開いてればそれをアクティブに、開いてなければ開くというコードを教えてください。
776 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 23:45:03 ] >>775 Sub activate_forcefully_hoge() On Error GoTo hoge_is_none Dim hogePath$: hogePath = "C:\hoge.xls" ' ホゲ.xlsのパス Dim hogeFileName$: hogeFileName = "hoge.xls" 'ホゲ.xlsのファイル名 Dim activated As Workbook Set activated = Workbooks(hogeFileName) GoTo activation hoge_is_none: Set activated = Workbooks.Open(hogePath) activation: activated.Activate End Sub
777 名前:775 mailto:sage [2008/08/12(火) 00:00:21 ] >>776 ありがたいけど・・・わかりやすくダイレクトに if Workbookなんたらこうたら("ホゲ.xls")がない then Workbooks.Open Filename:= "ホゲ.xls" という形で出来ませんでしょうか? if のあとのいいメソッドかなんか無いですか?
778 名前:775 mailto:sage [2008/08/12(火) 00:11:32 ] On Error GoTo hoge_is_none Windows("ホゲ.xls").Activate hoge_is_none: Workbooks.Open Filename:= "ホゲ.xls" Windows("ホゲ.xls").Activate これでうまくいきました、ありがとう
779 名前:デフォルトの名無しさん [2008/08/12(火) 15:40:13 ] VBAに詳しい方お願いします。 A列 B列 C列 D列 E列 F列 G列 H列 I列 J列… 1 1 010 a AB 2 1 010 a 春 夏 秋 冬 3 1 010 a 上 下 4 2 020 b BC 5 2 020 b 花 6 2 020 b 陸 空 6 2 020 b 水 : : ↑を↓に変える記述教えてください。。 A列 B列 C列 D列 E列 F列 G列 H列 I列 J列… 1 1 010 a AB 2 1 010 a 春 3 1 010 a 夏 4 1 010 a 秋 5 1 010 a 冬 6 1 010 a 上 7 1 010 a 下 8 2 020 b BC 9 2 020 b 花 10 2 020 b 陸 11 2 020 b 空 6 2 020 b 水 : :
780 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 15:46:55 ] >>779 いいか。マクロの記録ってやつを使うんだ。 んで、並び替えしてみればほぼ再利用可能なコードが出来るはずだ。
781 名前:デフォルトの名無しさん [2008/08/12(火) 16:52:19 ] マクロの記録をしてからができないんです。。 ifとかDo Whileとか、、、 E1に値が入っていないのでカーソルを下に移動(E2へ移動) E2に値が入っているのでカーソルを右に移動(F2へ移動) F2に値が入っているので下(3行目)に新しい行を挿入し、(A2,B2,C2) を コピーして、(A3,B3,C3)に貼り付け、F2を切り取りE3に貼り付け る これをF2、G2、H2と繰り返してI2で空欄が出るまで続ける。 E8に値が入っていないのでカーソルを下に移動(E9へ移動) : : って感じにしたいんです(TT)
782 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 18:01:50 ] 最近勉強し始めたばかりなので 初歩的な質問かもしれませんが ヒントください。 オートフィルタの抽出で If A.Value = True Then Sheets("○○○").Select Range("A1").AutoFilter Field:=8, _ Criteria1:="*" & A.Value & "*" End If というコードを作ったのですが フィルタがうまくかかりません。 (A.valueはユーザーフォームのテキストボックスです) Aにいれるテキストが全角かな文字であるがために プログラムが反映されてないのではと思うのですが A.valueをA.Textにするとエラーがでます。 (A.text = true というのが無理っぽいです) 解決策があれば教えていただけないでしょうか。 よろしくお願いします。
783 名前:y mailto:sage [2008/08/12(火) 20:28:12 ] >>782 If の条件式についてですが、 「テキストボックスAに、何か文字が入っていれば抽出を行う」 という意図ですか。そういうことであれば、 If A.Value <> "" Then にするといいでしょう。
784 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 21:07:42 ] >>779 質問にやさしく親切に答えてくれるスレ 3 pc11.2ch.net/test/read.cgi/tech/1167125332/886 なんだ、マルチか。
785 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 21:25:02 ] >>783 ありがとうございます!!! うまくいきました!! 2〜3日ずっと悩んでいたので本当に感謝!! ありがとうございましたm(_ _)m
786 名前:y mailto:sage [2008/08/12(火) 21:28:33 ] >>779 Dim r As Long, c As Integer, cc As Integer, dr As Long, dt As Variant, rNum As Long rNum = WorksheetFunction.CountIf(Range("D:IV"), "<>") ReDim dt(1 To rNum, 1 To 5) r = 1: dr = 1 Do While Cells(r, 1) <> "" If Cells(r, 4) <> "" Then For c = 1 To 4 dt(dr, c) = Cells(r, c) Next dr = dr + 1 ElseIf Cells(r, 5) <> "" Then c = 5 Do While Cells(r, c) <> "" For cc = 1 To 4 dt(dr, cc) = Cells(r, cc) Next dt(dr, 5) = Cells(r, c) c = c + 1 dr = dr + 1 Loop End If r = r + 1 Loop With ThisWorkbook.Sheets.Add .Range(.Cells(1, 1), .Cells(1, 1).Offset(rNum - 1, 4)) = dt End With もっと効率的な方法で書ける方もおられると思いますが... それと、マルチ(複数のスレッドで同じ質問をすること)はしないようにしてくださいね。
787 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 23:12:20 ] どなたかプログラマ向けの難しめのVBAの書籍(洋書でも可)を御存知ないでしょうか。 Excel Hacksとかではなく、VBAやらCOMとの絡みなど詳細な事項などが書いてあると嬉しいです。 いざ勉強しても何か心許ない感じになってくるので、 Oreilly的な本を一冊読んできちんと理解しだいです。 御存知でしたら、助言お願いします。
788 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 23:46:38 ] y大人だなぁ
789 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 00:11:46 ] COMってのは不特定多数が制作しているものだから MSが作ったCOM以外を書籍で解説することはまず無いし MSが作ったCOMに関してならMSDNにも情報がある そしてExcel VBAに関しては、>>1 ★3にも有るとおり Excelの操作をGUIではなく言語でやってるだけであり 突き詰めたところでそう難しいものでも無い その先を行きたいならVBAではなくVBの範疇になるので VBの書籍を買え
790 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 02:00:39 ] >>789 すみませんが、VBでもいいので、 VB6互換の環境について、書籍を御存知ないですか?
791 名前:デフォルトの名無しさん [2008/08/13(水) 02:37:31 ] vb6ってたとえば関数のオーバーロードとかクラスのインヘリットとかがない等、 C++とかに比べて言語仕様自体に機能が多いわけじゃないから、アルゴリズムさえ コードにできればリファレンス読むだけで十分な言語なんですよね? 高度な書籍っていっても結局vb6の機能をフルに活用して何が出来るかとかいう書籍がほしい んだったら、結局vb6からAPIやCOM使ってなんかするサンプルコードなんかが沢山載ってる本 をほしいって事と同じようなものだと思うから、結局vbの枠で書籍を探すよりも、むしろ COMの本買うとか、めんどくさいからvbやめて別の言語に手を出して、C++詳説の本買うとか しないといけないんじゃないかなぁと思うんですが。どうなの?
792 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 02:47:33 ] とりあえずここらへんにしておこうかな www.amazon.com/Advanced-Visual-Basic-Techniques-DevelopMentor/dp/0201707128/ www.amazon.com/Programming-Microsoft-Visual-Basic-6-0/dp/0735605580 >>791 言語仕様自体はあまり明確じゃない言語だと思います。 クラスのインヘリタンスはあるにはありますね。ひ弱ですが。 古い言語のせいか、Webにある資料もいまいちどうもパッとしないのです。 C++はまあ別にどうでもよいので(知っているので)、 COMに?興味が出たらCOMの本買うと思います。若干時代に逆行していますが。 私としてはVB6/VBAのバイブルみたいなものを探していたところです。 一応、上記の本読んでみることにします。
793 名前:792 mailto:sage [2008/08/13(水) 02:48:23 ] 古い言語といっても、まあ、新しいわけだけれど、 陳腐化したといったほうがよかったかな。 >>791 さん、お付き合いありがとうございました。
794 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 06:49:43 ] VBA上級テクニック なんちゃらって本があったな。 API関数やVBSの呼び出し方が解説してあってよかったかも。 ただ、具体的なAPI関数についての説明なんかは当然なし。 当時、具体的な呼び出し方が説明してあるのは役に立った記憶があるよ。 あと、何で変数の型が必要か、とかrangeの概念なんかも詳しく説明してあった。 それまで全部variantで使ってた変数の型も、きっちり宣言出来るようになったし、 何となく使ってたfor eachも、何がどう動いてるのかが理解出来たよ。
795 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 08:14:00 ] Range以外は全てVB6分野の話だな
796 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 08:58:00 ] InputBoxを使った入力について教えてください。 セルのコメントをInputBox関数で入力させるマクロを組んでいます。 この入力値を、任意の箇所で改行したいのですが、できますか? 可能な場合、InputBox関数で呼び出される入力ダイアログボックス にはどのように入力すれば良いのでしょうか? ご教示お願いします。
797 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 09:34:30 ] どうしてもInputBox使いたいなら、任意の文字列を改行として扱うしか無いかな Dim strTemp As String strTemp = InputBox("改行したい部分に\nを入れてください。", , "1行目\n2行目\n\n4行目") strTemp = Replace(strTemp, "\n", vbCrLf) MsgBox strTemp 改行扱い文字列は、別に\nじゃなくても本文中に出現しないものなら何でも良い でも、ユーザーフォームで複数行入力できるダイアログを作るのが正攻法だろ
798 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 10:07:04 ] できました。Replaceすればいいのですね。 ありがとうございました。
799 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 10:30:48 ] Aというシートからユーザーフォームのテキストボックス(10個ぐらいある) に入力された内容に従ってデータを抽出して 既存のBシートに貼り付けるような比較的長いコードを作りました。 最終的には、もしユーザーフォームの 「新規シートを作成して貼り付け」という チェックボックスにチェックが入っていた場合は Cシートを新たに作成し、そこにデータを貼り付け さらにDシート・・Eシートとシートを増やせるようにしたいと 思っています。 その場合は 現在作ってある長いコードを使って if checkbox1 = true then worksheets.add 「新しいシートに貼り付けてね」という長いコード 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜 else 「シートBに貼り付けてね」という長いコード end if という風に、指定するシートを変えるだけで ほとんど同じコードを2回記述するしか方法はないでしょうか?? もっと完結にできる方法があれば教えてください。 モジュールがやたら長くなって見にくくなってしまうのを回避したいです。
800 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 11:30:00 ] >>799 共通する部分の処理でプロシージャを作り Callで呼べばいい
801 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 11:50:00 ] >>800 ありがとうございます!! さっそく試してみます。 ステートメントを早くいろいろ覚えないと 後で「こんなステートメントあったんだ!じゃぁあの時 もっと簡単にプログラムできたじゃん!」って思うことが多いです(;; もっとよく勉強します。 本当にありがとうございました。
802 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 11:55:04 ] >>801 >後で「こんなステートメントあったんだ!じゃぁあの時 >もっと簡単にプログラムできたじゃん!」って思うことが多いです(;; それが糧になるんだよ。決して無駄にはならないさ。 # 仕事なら話は別だが。
803 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 10:48:11 ] アクティブシート上にあるすべてのボタンを消去するのって ActiveSheet.Buttons.Delete じゃ駄目なんですか? いくら実行しても何も起こらないんですが。
804 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 10:58:14 ] 画面に向かって「消えろー」って10回叫べば消えるかも
805 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 11:13:52 ] for each
806 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 11:27:47 ] >>803 ゙ボタン゙と言っているのはオートシェイプ?マクロ用のボタン(名前忘れた)?
807 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 11:53:50 ] >>806 オートシェイプです。 すいません、今調べたら ActiveSheet.DrawingObjects.Delete という命令でシート上のボタンはすべて消せることがわかりました。 追加で質問なんですが、一行目に配置されたボタンだけを残し、二行目以降のボタンをすべて消去する方法ってありますか?
808 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 12:07:36 ] >>807 プログラム化するならわからんが、オブジェクトの選択(矢印の付いたアイコン) で範囲選択したら、その領域内に含まれる図形は全て選択できるからデリートで消す
809 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 12:24:34 ] >>808 デリートでセルを消してもそのセル上のボタンは幅が0になるだけで線になって残りません? 完全に消去する方法が知りたいのですが。
810 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 12:48:34 ] >>809 セルの行削除・列削除では消えませんよ。 図形描画のツールバーを出して、オブジェクト選択のボタンを使うべし。
811 名前:デフォルトの名無しさん [2008/08/14(木) 14:23:44 ] 1行1件のデータシートがあります。 顧客 製品 台数 A あ 1 A あ 1 B あ 1 B あ 1 B い 1 これの顧客Bだけ範囲選択して B あ 2 B い 1 という結果を別シートに出したいのです。 ・選択1行目をコピー貼り付け ・2行目以降、前回顧客と製品名が一致したら台数インクリメント ・Activecell.Rows.Count数だけループ という方法でなくもっといいのはありますか?
812 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 17:16:40 ] CountIf
813 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 17:52:52 ] >>811 ピボットテーブル知ってる?
814 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 18:17:46 ] >>811 オートフィルタの抽出を別場所にする
815 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 18:22:52 ] >>811 おいらならオートフィルタで指定の顧客名を抽出して、 if (cells(i,2).value = cells(i+1,2).value) daisu++} ってインクリメントするかな。
816 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 18:24:49 ] すいません。文法間違えました。 javascriptとしても間違えております・・・比較演算子違うし。 if cells(i,2).value = cells(i+1,2).value then daisu = daisu + 1 end if でした。本当に申し訳ない。
817 名前:811 mailto:sage [2008/08/14(木) 18:32:04 ] 目的は別シートに貼り付けるため、なのです。 全体を集計するのであればピボットで済みますが、そうではなく 必要な部分だけ抜き取って(項目も無し)それだけ集計して貼り付けたいのです。 手作業ではコピー、貼り付けしたあと、台数を修正して余計な行を削除 なんですがこれを自動化したいだけです。 標準の集計やピボットを利用するには、項目行もコピーしてシートも新しくせねばならず また、完成した集計表では顧客名や製品名に勝手に空欄が出来てしまうので 使いたい形に修正するだけで作業が余計に感じます。
818 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 18:35:25 ] これはマクロの記録で十分対応できるレベルだろ
819 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 18:52:49 ] ・選択部分を新しいシートにコピペ ・製品を軸に昇順に並べ替え ・製品名が変わるまでloop、んでカウント ・一番上の台数に代入 ・代入した行にフラグ ・フラグ立てた行以外削除 こんな感じ?その情報でやるなら。 操作者が範囲を選択する時点で、選択ミスの可能性があるから、俺ならやらん。 きっと製品名は凄い沢山あるんだろうね。VBAスレで聞くって事は。
820 名前:y mailto:sage [2008/08/14(木) 21:33:06 ] >>817 うーん。ピボットテーブルはなるべく敬遠したいとのことですが、 必要な部分だけ抜き取ったり、ある項目だけの台数を合計したり、というのは やはりピボットテーブルが本領を発揮する場面だと思うんですね。 「項目行もコピーしてシートも新しくせねばならず」とありますが、 ひとつピボットテーブルを作ってしまえば、あとはその設定を変えながら 運用すればいいわけです。 VBAでピボットテーブルも操作できることはご存知ですよね? 抜き出したい顧客に合わせてピボットテーブルの抽出アイテムを変えたり、 抽出結果を任意の別シートに貼り付けたりするような、手作業では 面倒な部分をVBAで自動化すればいいと思うんです。 全体をVBAで実現するやり方で考えていらっしゃる方もおられるので、 そちらも検討した上で、もう1つの考え方として受け取ってください。
821 名前:y mailto:sage [2008/08/14(木) 21:43:08 ] ピボットテーブルで処理する例です。 Sub ch_pivot() Dim item As PivotItem, kName As String kName = InputBox("顧客名を入力してください") With Sheets("Sheet2") With .PivotTables("ピボットテーブル1") .PivotCache.Refresh .PivotFields("顧客").PivotItems(kName).Visible = True For Each item In .PivotFields("顧客").PivotItems If item.Name <> kName Then item.Visible = False Next End With Range(.Cells(5, 1), .Cells(.Rows.Count, 3).End(xlUp)).Copy _ Destination:=Application.InputBox("貼り付け先を指定してください", Type:=8) End With End Sub
822 名前:y mailto:sage [2008/08/14(木) 21:46:09 ] >>822 のコードは、次のような前提で動作します。 (下のように設定されていないと動作しません) ○データシート ・>>811 のデータは"Sheet1"という名前のワークシートにおかれているとする。 ○ユーザー定義の名前 ・任意の名前(ここでは"pivotSource")を定義する。参照範囲は次のようにする。 =OFFSET(Sheet1!$A$1,0,0,COUNTA(Sheet1!$A:$A),3) ○ピボットテーブル ・使用するデータの範囲を"pivotSource"とする ・レイアウトは行に"顧客"と"製品"。データに"台数"(集計方法は合計)。 ・名前は"ピボットテーブル1" ・配置する場所は"Sheet2"という名前のワークシートの$A$3。 ・顧客ごとの集計を非表示に ・列の総計を非表示に
823 名前:y mailto:sage [2008/08/14(木) 21:59:43 ] すみません。「>>822 のコード」→「>>821 のコード」の間違いです。 あとピボットテーブルはピボットテーブルウィザードなどを利用して 自分で設置してください。(セル範囲の名前の定義も自分で。)
824 名前:デフォルトの名無しさん [2008/08/14(木) 22:49:18 ] グラフを複数作成しようとしていますが、速度が10秒/1グラフと遅く 特に書式設定が速度的に遅いと感じます。 書式、データ数は同じで、データ内容だけ異なります。 グラフはチャート毎に1シートに描いているものです。 (埋め込みグラフじゃないほう?) グラフの雛形的なものを使って複数グラフを作成し、 少しでも高速化したいと考えています。 実施したのですがデータの設定の順番が異なるのか、うまくいきません。 何かグラフコピーペーストのセオリーのようなものがあれば教えてください。
825 名前:デフォルトの名無しさん [2008/08/14(木) 23:26:51 ] >>824 screenupdate=Falseは既に実施しております。
826 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 00:29:15 ] データの数とグラフの数が多いと遅くなると思いますよ。 オブジェクト数が多いとExcelの動作が劇的に重くなるのは仕様なのかな? グラフ1つ作成するのに10秒かかるんだったらマクロの記録でグラフ作成するコード作って 比較してみればいいんじゃないですか?
827 名前:デフォルトの名無しさん [2008/08/15(金) 05:25:40 ] >>826 マクロの記録を参考に、いらない部分を削り、作成しました。 それで遅いので、複数グラフ作成で速くする方法はないかと考えました。
828 名前:デフォルトの名無しさん [2008/08/15(金) 05:45:16 ] 質問があります。 正方行列(2×2)を一行(1×4)で表したとき、関数で配列(2×2)を作り、 さらにこの配列を関数で計算する方法が分かりません。例えば 1 2 3 4 の行列をエクセルシート上でA1:D1に1,2,3,4と入力したとき =test(A1:D1)として配列(2×2)を作ります。 Function test(data As Range) Dim A(1, 1) As Double k = 1 For i = 1 To 2 For j = 1 To 2 k = k + 1 A(i - 1, j - 1) = data(k - 1) Next Next test = A End Function このとき行列式(=1*4-2*3)を計算するため =determ(test(A1:D1))とすると、#VALUE!となって困ってます。 Function determ(B As Double) determ = B(0, 0) * B(1, 1) - B(0, 1) * B(1, 0) End Function いろいろ試してみたのですが、どうも配列の扱いがよく分からなくて。 XP Excel2003ですがよろしくお願いします。
829 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 07:13:14 ] 第一要因 determ関数の引数が配列ではない 配列を引数に取る場合は B() As Double のように、配列変数の後ろに () を付けなければならない 第二要因 引数の型が合ってない 配列を返す関数では、関数内で型を指定していても 返される値はVariant型の配列となる 第三要因 配列の要素数が合ってない シート上には0行目0列目が無いので、 配列(1, 1) つまりは 配列(0 To 1, 0 To 1) を関数の結果として返すと、自動的に 配列(1 To 2, 1 To 2) のように下限要素が0から1に変換される 以上を踏まえてdetermの方を Function determ(B() As Variant) determ = B(1, 1) * B(2, 2) - B(1, 2) * B(2, 1) End Function とすれば動くと思う ところで、>>828 の例は質問用に簡素化しただけで、実際は配列要素数を決め打ちではなく精査してるよね? あと、A(i - 1, j - 1) = data(k - 1) で、全部 -1 やってるのは何か意味有るの?
830 名前:828 [2008/08/15(金) 07:54:20 ] >>829 早速ありがトン 急いで試してみたけど、なんかうまくいかない... 全部-1にしてるのは、配列は0から始まるって教わったので。 お察しの通り、本とは大きい行列なので、簡略化したんだけど。 =test(A1:D1)で配列をシートで見たけど合ってた。 ちょっとこれから会社なので、夜にまた試してみるよ。
831 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 08:53:51 ] 最低限、君が書いた例通り、A1:D1に1,2,3,4と入れて =determ(test(A1:D1)) とする分には問題なく動く 上手く行かないとすれば、実際のコードに適応する上で君が何か間違ってるからだろう あと、0から始まるのはそうなんだが、 For i = 1 To 2 For j = 1 To 2 k = k + 1 A(i - 1, j - 1) = data(k - 1) を For i = 0 To 1 '<- 1〜2ではなく0〜1 For j = 0 To 1 A(i, j) = data(k) k = k + 1 '<- 変数kのインクリメントを後回しに とすれば、3カ所の -1 は不要なんだが、何故わざわざi,j,kに1多い数を入れて -1 してるのかなぁと
832 名前:デフォルトの名無しさん [2008/08/15(金) 12:57:16 ] Excelでタブを作るのは無理ですか?
833 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 14:24:13 ] へるぷみー。 テキストボックスに入力された名前を 新規のワークシートに付ける際に、例えば「あいうえお」という 名前のシートが既にあるにもかかわらず テキストボックスに「あいうえお」と書かれた場合は 自動で「あいうえお1」次にまた「あいうえお」と入力されてしまった場合は 「あいうえお2」になるようにしたいと思い、 下記のようなコードを入力してみました。 (sheetnameがテキストボックスのオブジェクト名です) Dim i As Integer, cnt As Integer, n As Integer cnt = Worksheets.Count n = 1 If CheckBox.Value = True Then For i = 1 To cnt Do Until sheetname.Value <> Worksheets(i).Name sheetname.Value = sheetname.Value & n n = n + 1 Loop Next i Worksheets.Add after:=Worksheets(cnt) ActiveSheet.Name = sheetname.Value End if このコードだと 「あいうえお」→「あいうえお1」→「あいうえお11」 →「あいうえお111」 という風になってしまいました。 できるシリーズの本とかで調べたりWeb検索してみたりしたのですが 解決策が見つかりませんでした。 よろしくお願いします。
834 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 15:52:13 ] >>833 どこがVBAの質問なんだか。単純な名前生成の問題じゃないか。 毎回シート名に"n"を継ぎ足すんじゃなくて、都度入力された名前に"n"を継ぎ足せばいいだろ。 オブジェクト変数を使いまわすんじゃなくて、一時変数で処理する癖をつけた方がいいな。
835 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 17:07:40 ] >>832 何のタブかわからんが、ブックのタブならツールバーで作る手がある
836 名前:デフォルトの名無しさん [2008/08/15(金) 18:48:16 ] >>832 ユーザーフォームでタブを云々ならマルチページなりタブストリップなりをコントロールから追加
837 名前:デフォルトの名無しさん [2008/08/15(金) 19:03:27 ] ひとつのシートに複数のタブブラウザーみたいなのを作りたいと思っています。
838 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 19:27:20 ] 複数のシートにしちゃいけないの?
839 名前:デフォルトの名無しさん [2008/08/15(金) 20:10:50 ] ひとつのシートに複数のタブじゃないとダメなんです。できませんかねぇ。
840 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 20:16:54 ] わざわざシートタブがあるのにそれを使わずに更にタブをつける理由も抜きに、「できませんかねぇ」じゃねぇよ。
841 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 20:19:42 ] やろうとすれば出来るけど面倒
842 名前:828 [2008/08/15(金) 20:21:18 ] >>831 たびたびありがとー 朝はバタバタしててできなかったけど解決しますた^^ ご指摘のとおりにFor文は0〜1にした方がすっきりしますね。 教科書とか読むとほとんど1〜だったのでなんか理由があるのかと なんとなくこうしてました。 これで行列のいろんな演算ができそうです。 感謝、感謝
843 名前:デフォルトの名無しさん [2008/08/15(金) 20:38:15 ] ひとつのシートにタブを複数にする理由は本当はプログラムを組んでPOSシステムみたいなものを作りたいのですが知識がなく、それをExcelでと考えています。面倒でも構いませんから教えていただきたいです。
844 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 20:43:01 ] >>843 道具には向き不向きというものがあるよ
845 名前:デフォルトの名無しさん [2008/08/15(金) 21:33:42 ] >>842 配列についてはExcel VBAのヘルプで Option BASE で検索してみて
846 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 21:52:43 ] >>843 ボタンをタブに見立てて仮想的に実装すれば良い これで解らないなら君には無理 諦めるか金払って作ってもらえ
847 名前:828 [2008/08/15(金) 22:03:14 ] >>845 Option BASEで配列の最小値を0か1に選択できるのか これは便利だわ さんくす!
848 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 22:26:03 ] Option BASEは基本使っちゃいけない機能の1つ 初心者がパッと見る限りは便利そうに見えるが コードの明示性が著しく損なわれる Option Private Option Compare も同じく、プロシージャや関数で逐一指定するのが正しい 逐一指定ではコードが長くなり冗長だと言う奴も居るが、冗長とは単に長いだけではなく無駄に長い意味もなく長いということで これらの逐一指定は、それらの参照レベルや比較方式などを明示するという意味を持っているので冗長とはならない グローバル変数の多用を害とするのも同じような理由から
849 名前:y mailto:sage [2008/08/15(金) 23:03:56 ] Option BASE 1 が期待通りに機能しない場合もあるので、それも頭に入れておいたほうがいいかも。 これを宣言していても、「Array 関数またはキーワード ParamArray を使って作成する配列の添字の最小値は 0 」 となってしまいます(ヘルプ参照)。Split関数が生成する配列も同様に Option BASE 1 の影響を受けません。
850 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 23:17:43 ] >>834 ありがとうございます! 一時変数なるものについて勉強してから それをヒントにもう一度よく考えてみます。
851 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 23:19:17 ] それは「期待通りに機能しない」とは違う。 プログラムに置いて「期待通りに機能しない」というのは、 仕様書きに反する結果を返す場合などに使用する言葉。 「仕様通りに機能しない」とほぼ同義である。 Array、ParamArray、SplitなどがOption BASE 1の影響を受けないのは、 確立された仕様で常に同じ結果になるので、これが思惑通りじゃなかった場合は 「間違った期待をしていた」ということになる。 仕様を間違って覚えていたら、思惑通りに動かないのは当然のことだからね。
852 名前:y mailto:sage [2008/08/15(金) 23:33:36 ] あ、なるほど。その通りですね。
853 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 23:43:46 ] 別にそこまで字面にこだわるようなものじゃないと思うが。 期待通りに機能しない、というのは単純に使用者が想定しがちな 一貫性を提供しない、ということだろう。
854 名前:z mailto:sage [2008/08/16(土) 00:21:47 ] Application.Application.Application
855 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 06:50:42 ] OPTION BASEってプロシージャで1回しか宣言出来ないのがなぁ。 ま、OPTIONだから当然なんだけどね。 他の言語はあまり数知らないけど、配列で0からスタートしない言語ってあるのかな。 2系列しか言語知らないけど、配列は0から始まる。って覚えてるから違和感はないな。
856 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 06:57:54 ] >配列で0からスタートしない言語ってあるのかな 最近のCOBOLは違うかどうかまでは知らんけど、少なくともCOBOL85は1からスタート
857 名前:828 [2008/08/16(土) 07:38:49 ] >>848 ご忠告ありがとー Opttion BASE 1だと配列に格納する場合の添字と 配列から取り出すときの添字の値が同じだし、 行列の添字が一致するので便利と思ったけど、 使うときは注意したいと思います。 最終的には数千の行列を計算したいので逐一指定だけでは大変かと 思っていたけど、初心者の私にはまずこれでやってみます。 >>849 yさんありトンです 過去レスで配列のこともいろいろ書かれてますが 読み返すと少しずつ分かってきました。 Array関数などはまだ使ったことがないけど、 使うときにはOption Baseに添字が影響されないことを思い出します。 皆さん大変勉強になりました。初心者の質問に真摯に対応していただいて なんかうれしいです。ありがとうございます。
858 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 10:59:40 ] VBが嫌なのは普通に長さ0の配列を作れないこと
859 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 11:00:38 ] ちょっと古い質問ですまんが、>>736 の >> Const DATA_N As Integer = 50 >数値型、文字列型の定数で型指定するな これってどういうこと? Const DATA_N = 50 の方がいいってこと?
860 名前:y mailto:sage [2008/08/16(土) 11:58:13 ] >>858 長さ0の配列って、どんなことに便利なんですか? アイテムを持っていないCollectionのようなイメージでしょうか。
861 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 12:09:50 ] >>860 こういう一貫性のあるコードを書くことができる: Dim anArray() As String anArray = Split("") ' Variant()ならArray()でよし For Each eachCell In [~~:~~] ReDim Preserve anArray(UBound(anArray) + 1) If pred(eachCell) Then anArray(UBound(anArray)) = eachCell Next eachCell 別に例としてはなんでもいいんだけれども、 とにかく『空』の表現がないといろいろと面倒。
862 名前:y mailto:sage [2008/08/16(土) 12:48:05 ] ありがとうございます。空の状態から1つずつ追加する、みたいなイメージのコーディングが可能に なるわけですね。にしても、Split("")という表現でそれを実現できるとは... ローカルウィンドウで確認すると、代入直後の変数anArrayの型がString(0 to -1)なんてなっているあたり、 Base0の理屈からすれば正しいのかもしれないですが、たしかに普通じゃないですね。
863 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 13:14:19 ] VBAならEnptyでいいのでは?
864 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 13:45:38 ] JAVAあたりだと、配列数をredimする必要もなく、どんどんputして行けるんだよね。 それが良いとは一概に言えないけど、VBだとそこらへんが不便。
865 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 15:58:34 ] Enpty?
866 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 17:16:54 ] >>864 たぶんjava.util.List<E>のことを言っているのだと思うが、Javaでも 配列じゃダメ(というわけでもないがReDim無いので相当に面倒)だがね。 VBは標準でDictionary揃えていないあたりコレクションの取り扱いが面倒。
867 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 17:53:35 ] は?コレクションならあるだろ
868 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 18:02:01 ] エンプティダンプティ
869 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 18:10:33 ] >>867 コレクションっていうのはJavaでいうコレクションのことね。 SetやらMapやらQueueやら。
870 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 21:07:46 ] アホが
871 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 21:08:17 ] Jamaだよ
872 名前:デフォルトの名無しさん [2008/08/17(日) 00:35:10 ] 設定としては再計算を自動にしているのですが、マクロでやると、 エクセルのコマンドバーに「再計算」が表示されます。そこを自動にするため、 SendKeys "{F9}", True を書いてみたものの何の役にも立っていません。 どのようにしたら、いいでしょうか? ご教示願います。
873 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 00:49:14 ] 年月日時間の計算なのですが、 VBAで hoge = cells(1,1).value - cells(1,2).value とすると型が一致しないと怒られますが、 ワークシート関数で、 =A1-B1 とやると、うまく計算してくれます。 ワークシート関数にはVBAには無い自動整形機能などが付いているのでしょうか。
874 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 00:49:59 ] 言い方がおかしかったです・・・・。 どんなVBAの機能で計算されているのでしょうか。
875 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 01:52:48 ] >>872 Sheet.Calculate使えばいいでしょ >>873-874 そもそもVBAとExcelの演算はぜんぜん別物。 Excelの計算はVBAの機能などではない。
876 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 01:54:13 ] あー、わざわざSheet指定じゃなくて、Application.Calculateの方がよさそうだな。
877 名前:y mailto:sage [2008/08/17(日) 02:01:48 ] >>872 ttp://support.microsoft.com/kb/248179/ja ただし、Excel2002や2003でも、再計算をしても「再計算」の文字が消えない、 という状況はよくあるようですし、私も時々経験します。理由は分かりませんが、 シート上の数式の個数が多いと起こりやすい気がします。 しかし実際には、きちんと計算されているようです。 ちなみに、マクロで再計算を実行したい場合は、SendKeysよりもCaluculateメソッド のほうが妥当です。
878 名前:y mailto:sage [2008/08/17(日) 02:03:20 ] >>875 すみません。被りました。
879 名前:872 mailto:sage [2008/08/17(日) 02:52:19 ] 2003 XPです。 再計算はされていません。再計算に続けてワークシートイベントのcalculateが 動くようにしているつもりなのですが、再計算のために手動でのF9キーを 押すと、きちんと再計算後のイベントが働き、目的が達成されます。 ただ、今日は、状況、目論見等の説明がうまく書けてないので、また、来ます。 夜遅くに、ありがとうございました。
880 名前:デフォルトの名無しさん [2008/08/18(月) 17:05:33 ] すみません。ご指導お願いします。。 100万行以上あるテキストファイルを、1万行づつ分割して 元のデータの形式、区切り文字、列のデータ形式 を指定し、エクセルシートに取り込んむVBAは可能でしょうか? 可能であるならどのようにしたらいいのでしょうか?(Accessは使わず) 宜しくお願いします。
881 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 18:19:56 ] >>880 で、幾ら払うの?
882 名前:y mailto:sage [2008/08/18(月) 18:54:52 ] >>880 偶然ですが、ちょうど私も500万件の氏名+ふりがなデータを使って 似たようなテストをやっている最中です(遊びで)。うちの場合は 1シートあたり5万行ずつで100シート分です。理屈としてはできるはずですが、 途中何が起こるかわからないので「可能です」とは言えません。 テキストファイルの取り込み方は、まず「テキストファイル VBA」とかで検索してみてください。 たくさん出てきますよ。
883 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 19:40:16 ] >>880 Excelのバージョンによらない解決法は、 1. テキストファイルを順次読み込み、1万行分のファイルを作る 2. Excelの機能でテキストファイルを読み込む 3. 読み込んだシートをBookのシートにコピー 4. 1にもどる
884 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 19:41:52 ] >>882 どう考えても「可能」だろ。 適当なこと言うなよ。
885 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 19:50:10 ] 名前とふりがなで1件50バイトとして5万行で2.5MB 100シートだから250MB おれはexcelで30MB以上のファイル開いたことないなー
886 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 20:05:49 ] Excelにデータを読み込むのが目的じゃなくて、読み込んだデータを何かに使うのが目的じゃないのか? だとしたら、SQLiteとかの方がいいかもしれんぞ。
887 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 20:09:55 ] いや、だったらmdbでいいだろ
888 名前:y mailto:sage [2008/08/18(月) 20:35:22 ] >>884 あ、可能なんですね。失礼しました。 こんなに件数が膨大だと、メモリの関係で途中で止まってしまうとか、その他不測の事態が 起こったりしないとは言い切れず、従って「可能」とも言い切れず...みたいな心境でした。 氏名生成を16:00頃に開始して、今でようやく400万件です。 テキストファイルで120Mbになっています。どうなることやら...
889 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 20:43:24 ] というか、excelに向いてる事、向いてない事を考えろよ。 出来る。と向いているは全く違うぞ? yみたいに遊びで試すなら何やっても良いけど、 仕事で使うなら、excelで大量のデータ処理をするなんて考えは捨てるべき。 と思ったけど、yは500万件の氏名データ持ってる時点で遊びじゃない。 もっと色々と自覚したほうが良い。
890 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 20:52:46 ] >>880 速度気にせずその条件を実現するなら単にループを二重に回せば良いだけだろ。 外側はDo...Loopで、テキストファイルのデータが終わったら終了。 内側はFor...Nextで、1 To 10000のカウンタループ。 外側のループで新規シート作ったら、内側のループで1行分のデータを読み込み、 シートに入力していけば良い。データが無くなったらExit Doで一気に外側のループも抜ける。 内側のループ内でやることは、データが3行でも100行でも1000000行でも変わらない まあ、データ量が多い場合は1行ずつ読み込まないで、全体を変数に取って処理したり 逐一セルに代入するより配列介した方が早いとかはあるけどな 内側のループ内でやること、つまり1行分を読み込んでExcelに適用することすら解らないと言うなら、 >>1 ★5読んで出直すか、>>881 も言うように金払って作ってもらえ。 因みに、作成できるシートの数はシートの内容や環境依存で、 内容では使用行列数もそうだが修飾が大きく影響し、環境では主に物理メモリのサイズが影響する。 >>889 > と思ったけど、yは500万件の氏名データ持ってる時点で遊びじゃない。 持ってるんじゃなくて、プログラムのテストや勉強用で作る場合もあるだろ。 俺もVBAじゃなういが、自作プログラムのテスト用に住所氏名などの仮想データを数十万件と用意したこともある。 実用ではなくテストや勉強や遊び用なら、データは同じ氏名の繰り返しでも何ら問題ないからな。 俺の場合は10件くらいの適当な住所氏名の繰り返しにしたが。
891 名前:y mailto:sage [2008/08/18(月) 21:03:44 ] >>889 誤解ですよ〜(泣)。500万件の個人情報を握っているわけではなく、 このソフトで氏名を生成しているだけです。 ttp://www.vector.co.jp/soft/win95/amuse/se318543.html >>890 が察してくださった通り、大量の仮想データを使ったテストをしようとしています。
892 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 21:36:25 ] Excelの仕様くらい調べてくれよ・・・
893 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 21:47:54 ] 何勘違いしてるの?
894 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 21:52:50 ] どうしてもExcel VBAじゃないとだめなん? 今時珍しいぞあんな低速言語
895 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 21:54:06 ] yが来るようになってから、このスレが変になった
896 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 22:02:30 ] 依存するのは物理メモリか?
897 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 22:04:15 ] >>895 いいじゃん。活気があって。
898 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 00:04:23 ] >>880 は特に「単一のブックで」といった事は書いていないようだが その辺は暗黙の了解なのだろうか
899 名前:デフォルトの名無しさん [2008/08/19(火) 11:22:06 ] みなさんありがとうございます。。 補足させてください。 フォルダの中に複数のテキストファイルがあります。 それをVBAで1シートに1テキストファイルづつで取り込んで (区切り文字(#)、列のデータ形式(文字列)を指定して) 作成済みのマクロを実行し、出力させたいのですが。。 データが大きいので5シートで1つのファイルにしたいです。 フォルダの中にはテキストファイルが100ほどあるので、結果、エクセルファイルが 20できればいいのですが。。 できればデスクトップに新しいフォルダが作成されて その中に出力されていくようにしたいです。 お力を貸してください。よろしくお願いします。
900 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 11:28:39 ] 現在、ユーザーフォーム上でワークシートを表示させるべく スプレッドシートを設置することはできましたが、 このスプレッドシート上にチェックボックスを表示させる方法が分かりません。 何か良い方法があれば教えてください。お願い致します。
901 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 21:35:33 ] >>899 質問というより丸投げの典型例
902 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 21:37:14 ] >>899 ファイル名は連番のノンブルとか付いてるのかい? フォルダに入ってるバラバラのファイル名のファイルを全部読み込む。 って言うならばVBAの範疇超えてるからスレ違い。
903 名前:y mailto:sage [2008/08/19(火) 22:38:26 ] >>900 SpreadsheetコンポーネントのSheetオブジェクトは、Excelシートと比べてとてもシンプルな機能しかなく、 OLEObjectsプロパティも持っていないため、CheckBoxなどのコントロールを追加する領域自体が見当たりません。 コンポーネントのヘルプにもとくに触れられていないようです。 普通にユーザーフォーム上にCheckboxを配置するだけでは足りないのですか?
904 名前:デフォルトの名無しさん [2008/08/20(水) 14:35:52 ] よろしくお願い致します。 OS:XP エクセル2003 VBAのことは、まったくの初心者です。 質問なのですが、下記のようなチェックボックス7にチェックが入れば、 チェックボックス8〜11に自由にチェックが入れれるようになり、 逆にチャックボックス7にチェックが入ってない場合は、 チェックボックス8〜11のチェックはクリアされ、 チェックできないものを作りました。 ここから、チェックボックス7にチェック入れたあとは、 必ずチェックボックス9〜11のどれかにチェックが入っている状態 (ラジオボタンのような)で、チェックボックス7にチェックが 入ってなかったら、8〜11のチェックがクリアで尚且つ、 チェックができなくなるようにするにはどうすればよいでしょうか? よろしくお願い致します。 Private Sub CheckBox7_Click() If CheckBox7.Value = True Then CheckBox8.Enabled = True CheckBox9.Enabled = True CheckBox10.Enabled = True CheckBox11.Enabled = True Else CheckBox8.Value = False CheckBox9.Value = False CheckBox10.Value = False CheckBox11.Value = False CheckBox8.Enabled = False CheckBox9.Enabled = False CheckBox10.Enabled = False CheckBox11.Enabled = False End If End Sub
905 名前:y mailto:sage [2008/08/20(水) 17:04:59 ] >>904 >ここから、チェックボックス7にチェック入れたあとは、 >必ずチェックボックス「9〜11」のどれかにチェックが入っている状態 とありますが、文脈からすると「8〜11」のつもりでしょうか? 8〜11にラジオボタン的な挙動をさせるには、 @CheckBox8〜11にそれぞれClickイベントプロシージャを作成 A各プロシージャには、自分以外のCheckBoxの値は全てFalse、自分の値だけをTrueにするコードを記述 すればよいかと思います。なお、「自分以外のCheckBoxの値は全てFalse」の部分は、 別にプロシージャを作成して、各イベントプロシージャから呼び出すようにすれば合理化できます。 CheckBox7がTrueになった直後は、8〜11のうちどれをTrueにするのか、とか、 8〜11のうち既にTrueになっているものがClickされたらどうするのか、などの点が はっきりしませんが、方針さえ決めてしまえば簡単に修正できるはずです。
906 名前:デフォルトの名無しさん mailto:sage [2008/08/20(水) 18:53:18 ] こいつの口調、癇に障る。 ただそれだけで、消えてほしいと願う。
907 名前:デフォルトの名無しさん mailto:sage [2008/08/20(水) 19:57:47 ] お前が消えればいいじゃん
908 名前:デフォルトの名無しさん mailto:sage [2008/08/20(水) 20:50:56 ] >>906 お前の方が癇に障って癪だわ。お前が消えろ。
909 名前:デフォルトの名無しさん mailto:sage [2008/08/20(水) 21:22:01 ] 自作自演ヒドス
910 名前:デフォルトの名無しさん mailto:sage [2008/08/20(水) 23:10:50 ] 匿名掲示板でコテハンを長く名乗るって事は、それだけのリスクがあると言う事。 自分の向学の為ならば、コテを名乗る必要はどこにもない。 仮に間違った事を回答したとしても、責任なんてない。逃げるのも簡単。 それが匿名掲示板だから。 自分で退路を塞ぐだけでも愚かな事なり。
911 名前:デフォルトの名無しさん mailto:sage [2008/08/20(水) 23:27:26 ] そんなのどうでもいいわ。ここはExcel VBAのスレだろ
912 名前:デフォルトの名無しさん mailto:sage [2008/08/20(水) 23:27:31 ] コテハンがそんな大層なもんかね 何か勘違いしてるんじゃないの
913 名前:デフォルトの名無しさん mailto:sage [2008/08/20(水) 23:45:02 ] 退路っていうのは間違っても訂正しないことなんだろうか
914 名前:デフォルトの名無しさん mailto:sage [2008/08/20(水) 23:47:48 ] 荒れてますな〜w
915 名前:デフォルトの名無しさん mailto:sage [2008/08/20(水) 23:49:41 ] >>914 マクロだけにねプッ
916 名前:デフォルトの名無しさん [2008/08/21(木) 08:41:58 ] >>905 ありがとうございます。助かりました。
917 名前:デフォルトの名無しさん mailto:sage [2008/08/21(木) 21:14:17 ] すんません。質問させてください。 違う部署の人にヘルプを頼みまして、条件に合致する物にフラグを立ててくれたんです。 後で処理するんで、文字列の最後尾に記号をくっつけといてもらったのですが、 よりによって、アスタリスクが最後尾に付いてました。 適切に指示しなかった私が悪いと思い、今後は別の記号か、 別のセルに数字でフラグを立ててもらう事にしたのですが、 そこで質問です・・・。 autofilterも、replaceも、*はワイルドマークとして機能しているようですが、 エスケープシーケンスは存在しますでしょうか。 文字列としての*を判定させたい場合の処理などが可能でしたら教えてください。
918 名前:デフォルトの名無しさん mailto:sage [2008/08/21(木) 21:22:29 ] [*]
919 名前:デフォルトの名無しさん mailto:sage [2008/08/21(木) 21:43:27 ] ありがとうー
920 名前:デフォルトの名無しさん [2008/08/21(木) 21:59:10 ] 質問です。 他のxlsファイルを読み込んでいろいろ作業するのを、マクロの記録からやると 切り替えごとにWindows("hoge.xls").Activateになりますよね? これだとファイル名を変えると動かなくなるのでなんとかしたいのですが 元の方はThisworkbook.Activateに置き換えすると済みますが 相手ファイルも同様に使いやすくするにはどうしてますか? GetOpenFileで指定したファイルをどこかの非表示セルに書き込んで それを読み込む方法しかないのでしょうか? 他にいい保存場所ないのかなぁ?
921 名前:デフォルトの名無しさん mailto:sage [2008/08/21(木) 22:14:15 ] 起動中のエクセルファイルには、起動順に番号が割り当てられている。 ファイル名を指定しなくても、 Workbooks(n).Activate (nは数字)という形で、n番目に開いたファイルをアクティブにできる
922 名前:デフォルトの名無しさん mailto:sage [2008/08/21(木) 22:16:17 ] 一時的にマクロを停止させ、 その間にワークシートを操作するプログラムを組みたいのですが躓いています。 waitメソッドを使えば実現できるかと思ったのですが、 マクロは停止するけれどもワークシートが操作不可能です。 実現するべく何が良い方法があればご教授ください。
923 名前:デフォルトの名無しさん mailto:sage [2008/08/21(木) 22:18:11 ] doevents
924 名前:デフォルトの名無しさん mailto:sage [2008/08/21(木) 22:25:07 ] >>920 hoge=Activexworkbook.nameで開いたファイル名を取得
925 名前:デフォルトの名無しさん mailto:sage [2008/08/21(木) 22:25:33 ] コントロール配列使えないVBAももうちょっと頑張ってくれればいいのにな。 vbe.netとかつくって欲しい。
926 名前:920 mailto:sage [2008/08/21(木) 22:32:10 ] >>924 それだと毎回ダイアログ画面で指定しなきゃいけませんよね? ファイル名を変えちゃったときに、一度指定してもらうだけで済ませたいのです。
927 名前:y mailto:sage [2008/08/21(木) 22:48:28 ] >>926 非表示セルか非表示シートのセルでいいのでは。 個人用マクロブックとか、外部テキストファイルとか、いろいろ考えられますが、 複雑になるだけだと思うので。
928 名前:デフォルトの名無しさん mailto:age [2008/08/21(木) 23:30:45 ] 総合スレよりこっちの方が良さそうなのでこちらで質問します。 ワークシート上に配置したコンボボックス(フォームではなくActiveXの)に初期値として、 今日から5日前〜今日から10日後の日付をセットしたいのですが、うまくいきません。 ユーザーフォームだとUserform_Initializeの中に記述すればいいんですが、 同じ様にはできません。どうすれば良いでしょうか。 clickイベントでも試しましたがコンボボックスはchangeイベントしかダメなのかな?
929 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 02:32:27 ] >>928 UserformにはUserformのイベントがあり、ThisWorkbookにもイベントがある。 Private Sub Workbook_Open() For i = 4 To 0 Step -1 Sheet1.ComboBox1.AddItem Date - i, 4 - i Next Sheet1.ComboBox1.ListIndex = 0 End Sub
930 名前:928 mailto:sage [2008/08/22(金) 07:23:05 ] >>929 そっか、ブックを開いた時にイベント発生させれば良かったのか。 ありがとうございました。
931 名前:デフォルトの名無しさん [2008/08/23(土) 03:58:17 ] 相対参照を含む数式を位置関係を考慮してずらしてコピーする方法はありますでしょうか コピー元C5セル:=B5 コピー先C10セル:=B10 のようにコピーしたいのですが Range(C10).formula=Range(C5).formula のようにするとC10が=B5になってしまいます。 調べてもFillDownというものしか出てこず離れたところにコピーするやり方が分かりません。 すみませんがご存知の方教えていただけないでしょうか
932 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 06:33:53 ] >>931 Range("C10").FormulaR1C1 = Range("C5").FormulaR1C1
933 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 14:03:39 ] >>932 ありがとうございます 意図したことが出来ました
934 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 15:59:51 ] VBA使って関数や数式のコピーってどうなのよ。 モジュールに数式書いてくれればすぐわかるのに、 数式のコピーって、いちいちプロパティで調べないといけないから面倒なんだけど。 なんでそんな事するの?死ぬの?
935 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 16:14:09 ] >>934 あなたは13日後にしにます
936 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 17:40:05 ] 呪殺予告きたー! これは逮捕だな
937 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 21:27:46 ] >>934 の言っている意味がわからない。 数式コピーされると死ぬの?呪殺されちゃうの?
938 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 21:53:17 ] なれないVBAで苦労しているのですが、オートシェイプ周りの制御はどうすれば 良いんでしょうか。移動や変形どころか、アクセス方法すら分からずじまいで。 取っ掛かりだけで十分なので、教えていただければ幸いであります。 流れ読まずにすまんですたい。
939 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 22:00:01 ] なにがしたいの?
940 名前:側近中の側近 ◆0351148456 [2008/08/23(土) 22:09:37 ] >>938 (っ´▽`)っ マクロの記録でやってみればいいじゃん
941 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 22:20:50 ] >>939 「頂点の編集」がグリッド無視するのをどうにかしたり、直線を他のオートシェイプに置換できないかなと。 >>940 あーなるほどこんな手が。取っ掛かりが掴めました。ありがとうございます。
942 名前:側近中の側近 ◆0351148456 [2008/08/23(土) 22:27:25 ] (っ´▽`)っ テンプレに わからなければ、とりあえず「マクロの記録」をやってみましょう がないことに驚き☆
943 名前:デフォルトの名無しさん [2008/08/23(土) 22:33:10 ] Excell2007でVBAでプログラム組んで動かしたんだけど かなり実行に時間がかかってしまう・・・ 今のパソコンはC2Dの2.4Gでメモリ2GでXP何だけど ハードを新しくするのとOSをVistaにするのどっちが効果的ですか?
944 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 22:34:16 ] 真逆の選択肢に見えるのが面白いw
945 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 22:39:42 ] >>943 64bit Vistaにしたまえ
946 名前:y mailto:sage [2008/08/23(土) 22:50:05 ] >>943 もうご存知かもしれませんが、>>724 もとりあえず参考までに。
947 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 22:50:45 ] >>934 出来てありがとうって言ってるのにその追い討ちはわけがわかりませんww 数式コピーできなくても死にはしませんよ VBAに書くと柔軟性が失われるから外出しにしておきたいのです。 再利用性を高めるのに最も良い方法は命令をコマンドにすることです。数式に限らずSQLなどの柔軟性の高い命令は外出しが良いのです。
948 名前:デフォルトの名無しさん [2008/08/23(土) 22:52:21 ] リストボックスで複数選択した分だけ H列の11行目から4行ずつ下へオートフィルを使ったコピーで展開したいんだけど、 コードがうまく思いつかなくて四苦八苦してます。 リストから複数選択した分をjに入れたとして、 コードは Range("H7:H10").AutoFill Destination:=Range("H7:H10+j") としたけど中々コードが思いつかずわかりません・・・ VBA始めて2週間、本やネットで検索してもリストボックスの扱いがあまりなく苦労してます。
949 名前:側近中の側近 ◆0351148456 [2008/08/23(土) 22:55:51 ] >>947 (っ´▽`)っ それだったら、数式をConst String型にしておいたほうがいいよ☆ 数式のコピーよりも分かりやすいような気がする。 数式のコピーだと、>>934 のように、数式がソース上どこにも出てこないことになるから。
950 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 22:59:06 ] >>943 スレ違いだけど チューニングという選択がいいと思うよ まずは使い終わった計算式を削除してみること
951 名前:側近中の側近 ◆0351148456 [2008/08/23(土) 22:59:11 ] (っ´▽`)っ? >柔軟性の高い命令 今気づいた。動的に数式が変わるっていうこと? それだとConstじゃダメだね。
952 名前:側近中の側近 ◆0351148456 [2008/08/23(土) 23:01:30 ] >>943 (っ´▽`)っ 「マクロの記録」で生成されたプログラムだと、 .selectが多くできるけど、これを無くすとかね。 range("A1").select selection.value = 1 ↓ range("A1").value = 1
953 名前:側近中の側近 ◆0351148456 [2008/08/23(土) 23:20:09 ] >>948 (っ´▽`)っ ほ〜れほ〜れ☆ Range(Cells(7, 8), Cells(10, 8)).AutoFill Destination:=Range(Cells(7, 8), Cells(10 + j * 4, 8))
954 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 23:21:37 ] >>951 動的には変えませんが、数式はユーザに変えてもらうカスタマイズポイントです
955 名前:側近中の側近 ◆0351148456 [2008/08/23(土) 23:30:25 ] >>954 (っ´▽`)っ ほうほう。 じゃあ、セルに名前をつけて、それでアクセスするといいかも。 Range("C10").FormulaR1C1 = Range("C5").FormulaR1C1 これだと、C5ってなんだ?ってことになる。ソース上はわからない。 ワークシートのC5を見ればわかるけどね。 たとえば、セルC5に"カスタマイズSQL"という名前を付ければ Range("C10").FormulaR1C1 = Range("カスタマイズSQL1").FormulaR1C1 と書くことができる。 ソース上もわかりやすくなってイイ!>>934 の不安も払拭される。 セルの名前は「挿入」→「名前」→「定義」で設定できるよ☆
956 名前:側近中の側近 ◆0351148456 [2008/08/23(土) 23:31:13 ] (っ´▽`)っ 間違えた☆ たとえば、セルC5に"カスタマイズSQL"という名前を付ければ Range("C10").FormulaR1C1 = Range("カスタマイズSQL").FormulaR1C1 と書くことができる。
957 名前:948 mailto:sage [2008/08/23(土) 23:32:54 ] >>953 できた!サンキューです♪ 胸のつっかえが取れました(o^-')b Rangeじゃ駄目だったんですね。 これで次の勉強に進められます。 ありがとうございますヾ(o゚∀゚)ノ゛
958 名前:デフォルトの名無しさん mailto:sage [2008/08/24(日) 00:23:56 ] VBAで課長の背骨をヘシ折る事は可能? あと、栗とか剥ける?VBAで。 ググッても全然HITしない。
959 名前:デフォルトの名無しさん mailto:sage [2008/08/24(日) 00:33:29 ] ああ、できるよ。
960 名前:デフォルトの名無しさん mailto:sage [2008/08/24(日) 00:59:57 ] >>956 ありがとう 一応名前付き範囲は知ってるよ 君はのりのりですごい親切だね また今度教えてね
961 名前:デフォルトの名無しさん mailto:sage [2008/08/24(日) 01:06:38 ] うぜーよ
962 名前:デフォルトの名無しさん mailto:sage [2008/08/24(日) 01:35:44 ] >>959 うっそマジ? じゃあ例えば Sub 課長() Dim 課長 As Integer Dim ボディ As Boolean Dim 吐血 As Integer 課長 = 1 吐血 = 101 Do Until 課長 = 吐血 If Cells(課長, 1) = "" Then ボディ = True 課長 = 課長 + 1 End If Loop MsgBox "課長は吐血しました。もうやめて下さい。" End Sub とかで課長吐血する?VBAで吐血する?
963 名前:デフォルトの名無しさん mailto:sage [2008/08/24(日) 01:46:31 ] そのコードじゃ無理だけどな
964 名前:デフォルトの名無しさん mailto:sage [2008/08/24(日) 09:10:49 ] VBAでルーチン組んでから、椅子で殴れば良いじゃん。
965 名前:デフォルトの名無しさん mailto:sage [2008/08/24(日) 10:12:58 ] ハードディスクのデータをクリーンにするプログラムを組んでプレゼントしなさい。
966 名前:デフォルトの名無しさん mailto:sage [2008/08/24(日) 10:20:17 ] VBAでできるけどスレ違い。Excel関係ないから。
967 名前:デフォルトの名無しさん [2008/08/24(日) 10:52:44 ] 2003です。 マクロの記録からオートシェイプをやったけど そのまま実行すると塗りつぶし無しだけがキャンセルされてしまいます。 ActiveSheet.Shapes.AddShape(msoShapeOval, 257.25, 109.5, 39.75, 21.75).Select Selection.ShapeRange.Fill.Visible = msoFalse Selection.ShapeRange.Fill.Solid Selection.ShapeRange.Fill.Transparency = 0# Selection.ShapeRange.Line.Weight = 1.5 Selection.ShapeRange.Line.DashStyle = msoLineSolid Selection.ShapeRange.Line.Style = msoLineSingle Selection.ShapeRange.Line.Transparency = 0# Selection.ShapeRange.Line.Visible = msoTrue Selection.ShapeRange.Line.ForeColor.SchemeColor = 64 Selection.ShapeRange.Line.BackColor.RGB = RGB(255, 255, 255) どうすれば塗りつぶし無しに出来ますか?
968 名前:側近中の側近 ◆0351148456 [2008/08/24(日) 11:07:37 ] >>967 (っ´▽`)っ Selection.ShapeRange.Fill.Solid を削除しましょう。
969 名前:デフォルトの名無しさん mailto:sage [2008/08/24(日) 11:52:21 ] >>968 ありがとうございます
970 名前:デフォルトの名無しさん [2008/08/24(日) 14:41:12 ] CSVファイルの数値を分析したいのですが フォルダ内すべてのCSVファイルにマクロを実行する方法はありますか? 紹介されている本やHPを教えていただけませんでしょうか? よろしくお願いします。
971 名前:デフォルトの名無しさん mailto:sage [2008/08/24(日) 20:17:55 ] うーむ・・・CSVってカンマ区切りのデータテキストの事だよね? 一度EXCELに読み込んで処理じゃダメなのかな。
972 名前:デフォルトの名無しさん mailto:sage [2008/08/24(日) 20:51:32 ] このスレ的にはそれがいいね。 どうやってやるかは、マクロ記録すればすぐ判ることだし。
973 名前:デフォルトの名無しさん mailto:sage [2008/08/24(日) 21:59:24 ] excelで普通によみこむと、おもってるのと違う動きされることあるんだよなー。 だから、俺は、1行ずつ読み込み、コンマで区切りごとのデータを自前で配列にいれる 多バイト文字つかわれてたりするとこは、1フィールドごとにエンコードチェック、 をずっとEOFまでやってから、自分のおもってる型にかえてから処理しとる。
974 名前:y mailto:sage [2008/08/24(日) 22:14:08 ] 「フォルダ内すべての」CSVファイルに対して処理をしたい、 という点でもつまずいているのかも。それについては、 「FSO」を検索すると役立つ情報が見つかると思います。
975 名前:デフォルトの名無しさん mailto:sage [2008/08/24(日) 23:17:58 ] CSVの定義って厳格な物ある?ファイル形式とか。 気になって調べたんだけど、ファイル形式までは規格されてないような。 んで、フォルダの中身全部、って指定がかなり難しいのではないかなと。 たとえば拡張子がtxtだとしても、それがCSVで組まれたデータファイルなのかは、 計算機で判断出来るの?って思ってさ。
976 名前:デフォルトの名無しさん mailto:sage [2008/08/24(日) 23:37:56 ] >>974 先にDir勧めろ。 >>975 RFC4180というものがあるにはある。
977 名前:デフォルトの名無しさん mailto:sage [2008/08/24(日) 23:38:05 ] RFC 4180
978 名前:デフォルトの名無しさん mailto:sage [2008/08/24(日) 23:54:22 ] 基本的に、顧客が好むのが、Excelでひらいたときにどうみえるか。 なんで、 "dataA", "dataB", ... , "dataX" みたいに、""でかこむことになる。 数値解析とかだけのローカル用途なら、囲まんけどな。
979 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 00:04:47 ] FSOの.Filesでファイル一覧取得して、Right$で.csvだったら、 FSOの.Readallで読み込んで、VBCRLFでSplitして、 配列に入れて配列をカンマで、Split
980 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 00:09:35 ] プロジェクトのこまごま作業で多かったのがFSOによる再帰ファイル検索だ
981 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 00:14:27 ] "abc,def","ghi","""" ってな感じのデータに対応しようと思ったら面倒よ、自前でやるのは
982 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 02:00:47 ] FSOでやるなら普通にGetExtensionNameでcsvかどうかを見ればいいんでね?
983 名前:y mailto:sage [2008/08/25(月) 19:17:14 ] >>976 あ、そっちの方が簡単かも... オブジェクト作らないで済みますし。 Const fPath = "(フォルダのパス)" Dim fName As String fName = Dir(fPath, vbNormal) Do While fName <> "" If UCase(fName) Like "*.CSV" Then 'Open 〜 '>>979 の後半みたいな処理 'Close 〜 End If fName = Dir Loop こんなやり方でいいのかな。 CSVデータは、シングルクォーテーション('')で囲まれたタイプのも ざらにあるので意外と厄介ですよね。
984 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 20:21:21 ] Dir(fPath & "\*.csv", vbNormal) Ifはいらない
985 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 20:28:40 ] FSOとかつかうと 2008/08/25 20:27:30 みたいなフィールドがtextstream通した時点で 2008/08/25 20:27 とかされるからやめたほうがいいぞ。他にも罠多数。 どうしてもVBAっちゅーんなら、バイナリで読み込んで処理。これしかない。 自作のあるけど、バグあるとはずかしいから公開できん。 結構、考慮するべきパターンあるんで、かなり大きい。
986 名前:側近中の側近 ◆0351148456 [2008/08/25(月) 20:47:47 ] (っ´▽`)っ もし作るのが業務ソフトウェアなら、許容するCSVの仕様ぐらい決めたら? こういう感じに。ちなみにこれはExcelのCSVの仕様に準じている。 ・カンマ区切り ・ダブルクォーテーション内のカンマは区切りとみなさない。 ・二連続のダブルクォーテーションは、文字としてのダブルクォーテーションと見なす。 (項目にダブルクォーテーションを含めたい場合には、ダブルクォーテーションを2つ打つこと) ・閉じていないダブルクォーテーションはエラー。 入出力は過剰だと思うぐらい明確にしたほうがいい。
987 名前:側近中の側近 ◆0351148456 [2008/08/25(月) 20:50:39 ] (っ´▽`)っ >>986 に追加。 項目にカンマを含めたければ、ダブルクォーテーションで項目を囲うこと。 (例:"1,000","12,000")
988 名前:967 mailto:sage [2008/08/25(月) 20:52:23 ] ActiveSheet.Shapes.AddShape(msoShapeOval, 257.25, 109.5, 39.75, 21.75).Select Selection.ShapeRange.Fill.Visible = msoFalse Selection.ShapeRange.Fill.Transparency = 0# Selection.ShapeRange.Line.Weight = 1.5 Selection.ShapeRange.Line.DashStyle = msoLineSolid Selection.ShapeRange.Line.Style = msoLineSingle Selection.ShapeRange.Line.Transparency = 0# Selection.ShapeRange.Line.Visible = msoTrue Selection.ShapeRange.Line.ForeColor.SchemeColor = 64 これで2003でうまく塗り潰しの無い輪っかが描けたので 会社の2007に組み込んだんだけど、今度は黒塗り潰しに化けてしまいました・・・・ 急遽マクロの記録で輪っかを描いてみたものの、なんと2007では図の挿入あたりの記録はしてくれないようです・・・。 互換性が無いのもむかつくが、マクロ記録も改悪されてるとは実に情けない話と思います。 どなたか、黒丸で中塗り潰しの無い輪っかを2007で実現してくれるコードを教えてください。
989 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 21:04:19 ] マクロの自動記録でいいんじゃないの
990 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 21:10:10 ] CSV仕様きめても精確な実装はなかなかむずかしい。 もうほんと想定外の入力がされてたりする。 特に業務でよくあるのが複数行にわたって改行つきのコメントフィールドとか SJISとはかぎらんわけで、難しい。 もうこれでいいだろ、とおもうくらい慎重に実装しても、おれの技術じゃ 100万件のフィールドよむと、たいてい2,3件は、バグにかかる。 で、そっから、その特殊なケースをADHOCに直していくという対応。 例外でたからあとから3件追加しますとか、じゃ納得してくれんし、3年後に でるかもしれないわけで。。。ほんと怖いよ。 一番いいのは、EXCELでCSVをよみこむのはあきらめることじゃ。。。
991 名前:967 mailto:sage [2008/08/25(月) 21:15:57 ] >>989 2007ではマクロの記録をしても、オートシェイプの挿入〜線種変更などをなにも記録してくれないのです。
992 名前:側近中の側近 ◆0351148456 [2008/08/25(月) 21:16:40 ] >>991 (っ´▽`)っ ウォッチウィンドウでそれっぽいプロパティを探せ☆
993 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 21:54:19 ] >>991 2007で普通に記録できたよ。 ついでに貼っておきますね。 ActiveSheetのオートシェイプを赤にするコード。 Dim sp As Shape For Each sp In ActiveSheet.Shapes With sp sp.Fill.Visible = msoTrue sp.Fill.Solid sp.Fill.ForeColor.SchemeColor = 10 sp.Fill.Transparency = 0# sp.Line.Weight = 0.75 sp.Line.DashStyle = msoLineSolid sp.Line.Style = msoLineSingle sp.Line.Transparency = 0# sp.Line.Visible = msoTrue sp.Line.ForeColor.SchemeColor = 64 sp.Line.BackColor.RGB = RGB(255, 255, 255) End With Next
994 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 22:03:21 ] これで透明になるよ For Each sp In ActiveSheet.Shapes sp.Fill.Visible = msoFalse Next
995 名前:デフォルトの名無しさん [2008/08/25(月) 22:44:49 ] 999-9999-9999や9999-99-9999の書式で入力された電話番号を (999)-9999-9999や(9999)-99-9999の書式にしたいのですが A=Range("A1").Value B=Find("-",A,1) -の位置 C=Left(A,B-1) -の前だけ抽出 D=Mid(A,B,Len(A)-B+1) -の後ろを抽出 求める文字列="(" & C & ")" & D 関数だとこんな感じだけど、VBAではどうやりますか?
996 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 22:45:45 ] うちはXMLに統一してるんでCSV時代のトラブルは一切無くなったな。
997 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 22:46:41 ] >>995 InStr
998 名前:y mailto:sage [2008/08/25(月) 22:57:06 ] >>984 ありがとうございます。大文字・小文字を考えなくて済むのでますます楽です。 >>985 まさかそんな罠があるとは...。自分でも実験してみます。
999 名前:デフォルトの名無しさん [2008/08/25(月) 22:59:46 ] ume
1000 名前:デフォルトの名無しさん [2008/08/25(月) 23:01:54 ] 1000
1001 名前:1001 [Over 1000 Thread] このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。