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 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。 ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。
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を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。