1 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 15:42:51 ] ExcelのVBAに関する質問スレです 前スレ pc11.2ch.net/test/read.cgi/tech/1219673793/ ★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 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。 ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。 ★6 わからなければとりあえず「マクロの記録」(Alt, T, M, R)
116 名前:デフォルトの名無しさん [2008/12/18(木) 21:48:14 ] >>114 do until なんとか ="" with ほにゃらら if .cells(x, y).value = "○" then 処理 end if loop .valueにはいってる値を確認したところ、×とかちゃんとはいってました セル全体にプルダウンの選択がそれぞれ入ってるからループ文では聞かないのかな
117 名前:デフォルトの名無しさん [2008/12/18(木) 22:26:25 ] sheet1の2-24行、D列に○×のプルダウンがはいっています。 これでやるとエラーがでますifの行に x = 1 i = 2 y = 4 Do Until Cells(i, y).Value = "" If Cells(i, y).Value = "○" Then Sheets(2).colums(x).Delete x = x + 1 i = i + 1 End If Loop
118 名前:デフォルトの名無しさん mailto:sage [2008/12/18(木) 22:36:44 ] i=i+1はEndIfとLoopの間だと思う。 sheets(2)の列x(初期値1)を削除した後のループで再び削除する時にはxがインクリメントされてるから初期状態の列番号でいう所の3列目が削除されると思うがそれで良いのか、ふと疑問に思った。 どちらもエラーの原因じゃないけど。 というか、俺には「○×のプルダウンが入ってます」の意味が理解できない。 すまんな。
119 名前:デフォルトの名無しさん mailto:sage [2008/12/18(木) 22:46:18 ] あとcolums→columns、だね それでもif文の行にはエラーは出ない。 力になれなくてすまんな。
120 名前:デフォルトの名無しさん [2008/12/18(木) 22:48:29 ] そうでした^^; たしかにインクリメントしないといけませんね Dim i As Integer Dim y As Integer Dim x As Integer x = 1 i = 2 y = 4 Do Until Cells(i, y).Value = "" If Cells(i, y).Value = "○" Then Sheets(2).colums(x).Delete x = x - 1 End If i = i + 1 x = x + 1 Loop End Sub これでやったらif文にオブジェクトはプロパティかメソッドをサポートしてない ってでてまたエラーになってしまいました
121 名前:デフォルトの名無しさん [2008/12/18(木) 22:53:48 ] ありがとうございます! columnsがまちがっていたようでした 無事いけました ご指摘いただいたcolumnsが間違っていたことが一番の原因だったようです
122 名前:デフォルトの名無しさん mailto:sage [2008/12/18(木) 23:16:55 ] 失礼します シート1から実行するとしてセルB2には名前という文字が入っております const mojicell as string "B2" のようにしてシートの対応するセルに格納されてる値をとりだすことはできますか? やってみたところ、セルを格納するのはできなかったので・・・何か方法があるのかと思いまして 実際どのように試し方といいますと Sheets(mojicell).cells(...... のように使いました。 SHeets("名前").cells(... に置き換えられるかとおもっていたのですが、 実際はSheets("B2")と 入っておりました。 const で指定したセルが参照する値を格納することはできないのでしょうか?
123 名前:デフォルトの名無しさん mailto:sage [2008/12/18(木) 23:19:36 ] セル参照だけならrangeオブジェクト使いなさい。 シートまで含むならまずconstの値を工夫しなさい。
124 名前:デフォルトの名無しさん mailto:sage [2008/12/18(木) 23:21:20 ] >>122 const mojicell as string = "B2" worksheets(range(mojicell).value).cells(...
125 名前:デフォルトの名無しさん [2008/12/18(木) 23:50:23 ] >>124 これだと シート1からこのマクロ実行してシート1にあるセルを参照するならわかりやすいですが シート2からこのマクロを実行してシート1にあるセルを参照するとなると、 できなくなるのでは?
126 名前:デフォルトの名無しさん [2008/12/19(金) 00:50:28 ] >>124 これだとエラーでます・・・
127 名前:デフォルトの名無しさん [2008/12/19(金) 00:59:34 ] A17にテストという文字をセットしておくとします Sub tes2() Const moji As String = "A17" Sheets("テスト").Cells(3, 1).Value Sheets(Range(moji).Value).Cells(3, 1).Value これだと下の文がインデックスが有効範囲にないとエラーでます
128 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 01:03:33 ] >>127 "A17"は、シート名じゃねーだろ
129 名前:デフォルトの名無しさん [2008/12/19(金) 01:06:10 ] >>128 これの意味するところは range("A17").value = テスト という所なのでは? よって sheets("テスト") と>>124 さんがおっしゃってた意味かとおもってたのですが 動作がうまくいかないということは違いますよねorz
130 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 01:16:52 ] >>129 どのシートの"A17"で どこのマクロだよ
131 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 01:18:18 ] >>129 右辺を書け!
132 名前:デフォルトの名無しさん [2008/12/19(金) 01:23:35 ] sheets(1)にあるマクロでsheets(1)のA17セルには、テスト という値が入っております で、このsheets(1)のA17セルの値をconstとして間接的に参照できる形にして sheets("テスト")の3行1列目のセルの値を取得します でも、なぜか print Range(moji).value テスト とは表示されるのに、先ほどの下の文では表示されません
133 名前:デフォルトの名無しさん [2008/12/19(金) 01:26:27 ] Sheets(Range(moji).Value).Cells(3, 1).Value これではインデックス範囲のエラーがでますorz
134 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 01:35:00 ] 実際のファイルを作って、アップしろ
135 名前:デフォルトの名無しさん [2008/12/19(金) 01:42:37 ] Sub tes2() Const moji As String = "A17" Sheets("Range(moji).Value").Cells(3, 1).Value End Sub sheets(1)のA17セルには、テスト という値が格納されている sheets("テスト")のセル(3行1列目)の値には、たとえば 100 といった値が格納されている このマクロをsheet("テスト")にて実行する方法ということです 今のままじゃエラーがでますので
136 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 01:46:07 ] >>135 実際に作ったものをアップしろって
137 名前:デフォルトの名無しさん [2008/12/19(金) 02:16:52 ] まったくわからない・・・
138 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 02:19:01 ] うpされたものを拾う気はあるのかや?俺には無いよ。めんどくさい。 質問の意味不明度が増してきたのでそろそろ寝てほしいと思う。適当に脳内補完してみたから。 const moji as string = "A17" debug.print worksheets(sheet(1).range(moji)).cells(3,1)
139 名前:デフォルトの名無しさん [2008/12/19(金) 02:22:16 ] >>138 それを実行してみたところ型が一致していません。とでました。
140 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 02:23:02 ] >>138 >>135 >Sheets("Range(moji).Value").Cells(3, 1).Value この辺の行の意味不明度からして、根本的な間違いがあると思う。
141 名前:デフォルトの名無しさん [2008/12/19(金) 02:24:54 ] シートの名前は 1がSheet1 2がテスト です。 Sheet1のA17セルには、テスト と書かれています。他のすべてのセルは空白です。 テストのcells(3,1)の場所には適当に文字を書き込んでいます。 で、お教え頂いたマクロを実行したところ>>139 のエラーがでました。 const moji as string = "A17" debug.print worksheets(sheets(1).range(moji)).cells(3,1)
142 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 02:26:16 ] >>141 だから、実際のものをアップしないと話にならねーって
143 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 02:35:29 ] >>138 デバッグどころかコンパイルも通らない物貼り付けて、えらそうに・・・
144 名前:デフォルトの名無しさん [2008/12/19(金) 02:37:35 ] うーむ、簡単に見えてむずかしいようですね・・・
145 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 02:41:18 ] >>144 オマエが単純に間違ってんだよ。 現物をアップしろよ
146 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 02:43:48 ] ごめんよ、テストなんてしてなかったからさ。 だいぶゴツクなっちゃったけど、それでもよければどうぞ。 Sub test() Const moji As String = "A17" Dim sh As Worksheet Dim obj For Each obj In ThisWorkbook.Worksheets If obj.Name = Worksheets(1).Range(moji) Then Set sh = obj Exit For End If Next obj If IsObject(sh) And (Not sh Is Nothing) Then MsgBox sh.Cells(3, 1) End If End Sub
147 名前:デフォルトの名無しさん [2008/12/19(金) 02:44:20 ] sheet1のA1セルに テスト と入力します sheet2のシート名を手動でテストという名前に変更します sheet2のA1セルに 値 と入植します このブックをつくって マクロを sub テスト() const moji as string = "A1" debug.print worksheets(sheets(1).range(moji)).cells(1,1) end sub これでエラーがでてしまうということです。下から2行目のところにエラーが・・・
148 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 02:45:00 ] >>147 それはもういいんだよ。 現物上げろよバカ
149 名前:デフォルトの名無しさん [2008/12/19(金) 02:45:47 ] >>146 さすがにこれは長いですね・・・
150 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 02:46:35 ] >>148 現物をあげてダウンロードするまでにかかる時間のほうが長いと思うのですが・・・・
151 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 02:47:40 ] >>150 こんだけバカなんだから、根本的なところで間違ってんだよ。 どのセルに何の値を入れてるのかさえ、あてにならない。
152 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 02:48:58 ] >>150 概ね>>135 通りのコードを書き込んで、コンパイルもしてないだろうさ
153 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 03:05:44 ] もっとスマートに出来ないものかとぐぐったけどINDIRECTばっかでてくる…orz VBAでの良策ってどんなだろう。 >>149 長いのが気になるだけなら別関数にしてね^^
154 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 03:06:30 ] でもこれじゃconstでセルを指定しずらいというか面倒なのって痛いですね
155 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 03:10:01 ] >>154 オマエがバカなだけ。 Debug.Printもついてない行でエラーになるのはあたりまえ。
156 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 03:11:19 ] >>155 先ほどdebug.printがかかれてたマクロを実行してもエラーがでたのですが・・・
157 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 03:13:36 ] ごめん。それは俺のミス。 以上で終了───
158 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 03:13:43 ] >>156 rangeのデフォルトはValueじゃない。 それとDebug.Printが付いてないやつとは別のコード。 その区別がつかないのは、バカだから。
159 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 03:31:01 ] おぉ。rangeってrangeなのね。そうなのね。 そおしたら随分と無駄なコード書いてきたんだなぁ今まで。反省orz
160 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 07:04:25 ] rangeが指定する値を保存する方法って?
161 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 07:10:54 ] オブジェクト変数にrangeをセット
162 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 13:17:19 ] >>147 質問するとき小文字でコードアップするんじゃねーよ。 実際にVBEからコピペしろ。 回答者でも長いコードをオール小文字とかオール大文字は嫌味なくらいだ。 Sub テスト( ) Const moji As String = "A1" Debug.Print Worksheets(Worksheets("Sheet1").Range(moji).Value).Cells(1,1).Vallue End Sub と.Valueが抜けてるから型が一致しないとなるんだよ。 最後の.Valueはなくても動くが途中のは必須。 >>158 が書いてるのはこういうこと。
163 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 13:22:11 ] >>162 その発言、なんかのギャグ?
164 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 13:25:02 ] >>162 流れから見てその件はもう終わったものかと思っていたが・・・ 勘違いかな?
165 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 14:00:42 ] 日本人はひとつのジョークで3回笑う 1回目はジョークを聞いたとき 2回目はジョークの意味を教えてもらったとき 3回目は家に帰った後、やっとジョークの意味がわかったとき
166 名前:デフォルトの名無しさん [2008/12/19(金) 14:09:44 ] excel2002 SP3を使っています。 以下のようなへたくそなマクロを作りました。 ------------------------ここから------------------------ Private Sub Macro1() Worksheets("IV").Range("B2:B96").Select Selection.Copy Worksheets("IV").Range("C2").Select Selection.Insert Shift:=xlToRight Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Worksheets("IV").Columns("C:C").Select Worksheets("IV").Application.CutCopyMode = False nextTime = Now() + TimeValue("00:01:00") Application.OnTime nextTime, "Macro1" End Sub ------------------------ここまで------------------------ "IV"のシートを表示させているときは問題なく動作するのですが、 他のシートを表示させると以下のエラーとなって動作してくれません。 実行エラー"1004"RangeクラスのSelectメソッドが失敗しました。 何がいけないのか教えていただけますでしょうか。お願いします。
167 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 14:13:32 ] >>166 アクティブにしないとセレクトできないんじゃないの?
168 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 14:24:07 ] >>167 そうなんですか。困ったな。。。 普段は他のシートを表示させているので、 非アクティブでも動作をさせるにはどうしたらいいですか?
169 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 14:40:39 ] Worksheets("IV").Range("B2:B96").Copy Worksheets("IV").Range("C2").Insert Shift:=xlToRight Worksheets("IV").Range("C2").PasteSpecial ... Application.CutCopyMode = False
170 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 14:51:43 ] >>169 おおおおおお!!!!!! ありがとおおおおお!!!! さっそくやってみます。
171 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 14:56:51 ] >>169 できたああああ! ありがとう!!!! 感謝感謝!!!!
172 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 20:04:42 ] 質問させてください。 指定した範囲内にあるデータの種類の数を取得するにはどうしたらいいでしょうか? 汚いながらもVBAで配列に入れながら総当りで調べることはできるのですが ワークシート関数でそのようなものがあれば高速なのでそちらを使いたいと思っています。 例:範囲 A1:C3 A B C 1 山 川 海 2 海 海 川 3 川 都 南 この場合、「山、川、海、都、南」の5種類が出現するので 5を返してくれる関数を知りたいです。 よろしくお願いします。
173 名前:デフォルトの名無しさん [2008/12/19(金) 20:14:52 ] このファイルで別シートからマクロを実行して 特定の列だけ抽出して別のシートに表示したいです。 列を抽出するとき、たとえばA列とC列とE列を削除して表示させたい結果が 下のテーブルです。 このように別のシートからマクロを実行して他の別シートに抽出した結果を表示させるには どのようしすればいいでしょうか? 単にセル結合を考えない抽出ならできるのですが、 セル結合も考慮して、元の分類タイトルがあるまま抽出するにはどういった 手順でやるのが最適でしょうか?よろしくお願いしますm(__)m ファイルは以下のやつをみていただければわかりやすいかとおもいます www.dotup.org/uploda/www.dotup.org5812.xlsx.html
174 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 22:38:02 ] 101で質問したものです。 もぐらたたきが大まかですがだいたいできたので UPします ttp://www.mediafire.com/?bj352f2jaxz ttp://www.mediafire.com/?mn94db0mc4j まだもんだいはありますがよろしければ批評してください
175 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 23:33:05 ] >172 配列数式でも良ければ {=SUM(1/COUNTIF(A1:C3,A1:C3))}
176 名前:デフォルトの名無しさん mailto:sage [2008/12/20(土) 00:54:59 ] >>172 配列の使い方はどうしてる? for eachで選択範囲をコレクションとして、 .valueが配列に含まれていなかった場合には、配列にぶち込んで、 最後にuboundでカウントすれば高速だと思うんだが。 このロジカルなら一瞬だと思うけど。 配列で総当たりってのがちと気になった。
177 名前:デフォルトの名無しさん mailto:sage [2008/12/20(土) 01:05:35 ] >>173 シート名を明示してやればOKだね。 タイトル行が空白だったら、空白じゃなくなるまで左に移動してタイトルを取得する。 これを組むのが面倒なら、 結合を全部解除して、全てのセルにタイトルを振ってしまう。 最後に、重複するタイトルの場合に削除なりmergeなりで処理すれば良いと思う。 削除って考えじゃなくて、抽出したい物を残すって考えにしないとタイトルは取得出来ないな。
178 名前:デフォルトの名無しさん [2008/12/20(土) 08:34:25 ] >タイトル行が空白だったら、空白じゃなくなるまで左に移動してタイトルを取得する。 抽出してしまった場合、左にもうタイトルはないのではないでしょうか? あらかじめこれも全ての結合を解除したという前提かな? でも左に移動してタイトルを取得する場合、元からタイトルがない行があった場合 たとえば、メーカーというタイトルが最初からなかったとすると、本来なくていいタイトルに 別のタイトルが埋め込まれますよね? このファイルに対してはいけそうですが、ない場合は大変かな? >結合を全部解除して、全てのセルにタイトルを振ってしまう。 >最後に、重複するタイトルの場合に削除なりmergeなりで処理すれば良いと思う。 これもタイトルがない行があった場合、処理に困るかな・・・ 追加、条件で大変申し訳ないですが、もしタイトルが空白のセルがあった場合はこれじゃ難しいでしょうか?
179 名前:デフォルトの名無しさん mailto:sage [2008/12/20(土) 12:23:58 ] すみません。CLASSモジュールの書き方がわからないんですが どこかに説明しているサイトないですか?
180 名前:デフォルトの名無しさん mailto:sage [2008/12/20(土) 12:29:58 ] >>178 元からタイトルが無い列があるなんて知らないし。 てか、excelでレイアウトするなら、VBAで処理しようと考えない事だな。 人間が見やすい見た目と、計算機が処理しやすい(出来る)のは全く違うからね。 帳票として見やすく加工・レイアウトするのは、全ての演算処理が終わってから最後にやるもの。 レイアウトされたものに処理を掛ける事ほど無意味かつ煩雑になる事はないぞよ。 いったん全部のmarge解除して、全てのタイトルをはめ込むしかないでしょ。
181 名前:デフォルトの名無しさん [2008/12/20(土) 19:32:18 ] Excel2003を使ってます。 VBAの勉強をしたいのですが、良い本や教材はありますでしょうか? バカでもわかるようなのでいいです。
182 名前:デフォルトの名無しさん mailto:sage [2008/12/20(土) 22:48:34 ] VBAで何やりたいの?
183 名前:デフォルトの名無しさん [2008/12/21(日) 00:50:07 ] 質問です。 アクティブになっているシートから別のシートを選択したいのですが、 エラーが出てとまってしまいますが、なぜでしょうか? エラーの内容はシートの保護がかかっている状態で、 そのシートを選択したとき(Activate)と同じエラーです。 エクセル2003で、自宅PCでは動作しますが、会社PC(2003だと思う)ではダメです。 もちろん保護ははずしましています。 考えられる原因はなにがあるでしょうか。 文章がわかりにくかったらすいません。
184 名前:デフォルトの名無しさん mailto:sage [2008/12/21(日) 02:20:11 ] >>183 >>167
185 名前:166 mailto:sage [2008/12/21(日) 12:41:12 ] >>166 です。先日はありがとうございました。 動作のたびに画面がフラッシュして非常にストレスを感じます。 Insert Shiftが重たいのかなとおもうのでInsert Shiftを使わず、 C列、D列、E列・・・と列の最後尾に貼り付けたいと思うのですができますか? (xlToRightを使うのかな・・・) あとクリップボード経由だとこれまた重たいようなので、 クリップボードを使わずにそのまま貼り付けできればいいのかな (Destinationを使う???)と思っているのですが、どうなのでしょうか? 作成したマクロは以下です。アドバイスください。 よろしくお願いします。 ---------------ここから--------------- Private Sub Macro1() Worksheets("IV").Range("B1:B96").Copy Worksheets("IV").Range("C1").Insert Shift:=xlToRight Worksheets("IV").Range("C1").PasteSpecial Paste:=xlPasteValues Application.CutCopyMode = False nextTime = Now() + TimeValue("00:01:00") Application.OnTime nextTime, "Macro1" End Sub ---------------ここまで---------------
186 名前:デフォルトの名無しさん mailto:sage [2008/12/21(日) 13:44:32 ] >>185 画面がフラッシュするのは仕方ないと思うぞ。Windowsってのはそういうもんだ。 とりあえず右端にコピーする方法 Worksheets("IV").Activate Range("B1:B96").Copy Destination:=Range("IV1").End(xlToLeft).Offset(0, 1)
187 名前:デフォルトの名無しさん mailto:sage [2008/12/21(日) 13:53:12 ] >>185 細かいことを言うと、それだと処理が1分よりも少し長い間隔で実行される。 nextTimeはSubの先頭でセットした方が誤差が少なくなる。
188 名前:デフォルトの名無しさん mailto:sage [2008/12/21(日) 14:27:42 ] >>186 >>187 ありがとうございます。値貼り付けにできますか? あとこのマクロは時間処理が少しおかしいです。 しばらく席を離れて画面が黒くなりパソコンが待機状態になったとき (マウスを触るとすぐに画面は表示される状態)などマクロがとまってしまいまいます。 そして再度実行させると、たまっていた処理を一気に吐き出すような感じで、 3連続処理を繰り返すことが多々あります。安定動作にはまだまだ遠いです。
189 名前:デフォルトの名無しさん mailto:sage [2008/12/21(日) 16:06:47 ] >>172 矩形範囲の種類を数える高速なワークシート関数なんてない。 1列とか1行でソートされてるとかなら簡単だが、矩形範囲ならユーザー定義関数作れ。 Dictionaryオブジェクトの方が簡単だが、>>176 の書いてるCollectionを使うなら Function CountKinds(r As Range) As Long Dim col As Collection Dim element As Variant Dim cnt As Long Set col = New Collection On Error Resume Next For Each element In r.Value If Not IsEmpty(element) Then col.Add Empty, CStr(element) If Err.Number = 0 Then cnt = cnt + 1 Else Err.Clear End If End If Next CountKinds = cnt End Function 一次元配列に移してからソートして数える方法もあるが。
190 名前:183 [2008/12/21(日) 16:15:46 ] >>184 少し意味がわかりませんが。 PCが違うときに同じマクロでもエラーが出るんです・・・。 自宅PC>動く 会社PC>エラー ということです。 シートの保護やファイルの保護などの設定の問題のような気はするんですが。 わかる方いたらお願いします。
191 名前:デフォルトの名無しさん mailto:sage [2008/12/21(日) 16:34:38 ] >>190 単純に考えて、同じマクロではないのだろう。
192 名前:デフォルトの名無しさん [2008/12/21(日) 16:46:37 ] VBAで組んだマクロの仕様書を作ってくれるソフトって無いですか? VBとかcとかはあるんだけど、VBAのやつは見つからない。
193 名前:183 [2008/12/21(日) 17:33:42 ] >>191 すいません。 厳密に言うと違うんですが。 中身はコードのコピー貼り付けなのでコードは同じです。 (ファイルは別物) ファイル名シート名の書き換えとかはしますけど。 会社のファイルがシート保護されていたので、 ためしに自宅PCでシートの保護をした状態だと、同様のエラーがでました。 なので設定の問題かなと予想してますが。 エラー箇所は毎回切り替えの部分です。 (アクティブシート・ファイルの切り替え)
194 名前:166 mailto:sage [2008/12/21(日) 17:49:37 ] >>187 Copy Destinationですと値貼り付けできないようなので、 PasteSpecial Paste使ってデータをとることにしました。 もう少し研究して使いやすいものを作ってみたいと思います。 (作成したマクロは下です)。ありがとうございました。 ---------------ここから--------------- Private Sub Macro1() nextTime = Now() + TimeValue("00:03:00") Application.OnTime nextTime, "Macro1" Worksheets("IV").Range("B1:B96").Copy Worksheets("IV").Range("IV1").End(xlToLeft).Offset(0, 1).PasteSpecial Paste:=xlPasteValues Application.CutCopyMode = False End Sub ---------------ここまで---------------
195 名前:デフォルトの名無しさん mailto:sage [2008/12/21(日) 18:00:59 ] .valueを転載したいだけなら、forなりfor eachなりでまわして、 sheets(2).cells(1,1).value = sheets(1).cells(1,1).value の考えで代入して行っても良いんでないかな。 まぁ、ある程度の量以上になると遅いけど。
196 名前:デフォルトの名無しさん mailto:sage [2008/12/21(日) 20:18:24 ] >>195 For Eachで回さんでも、Rangeオブジェクトを使えば値が配列として取り出せるから複数のセルを一気にコピーできる。 Set r = Range("IV1").End(xlToLeft).Offset(0, 1) Range(r, r.Offset(95, 0)).Value = Range("B1:B96").Value
197 名前:デフォルトの名無しさん mailto:sage [2008/12/22(月) 07:46:08 ] rangeをvariant型の2次元配列に代入するのもいいね。
198 名前:デフォルトの名無しさん mailto:sage [2008/12/22(月) 11:08:13 ] >>197 >>196 も入れてる。 右辺のRange("B1:B96").Valueが2次元配列。 左辺はResize使った方がすっきりするが。
199 名前:166 [2008/12/22(月) 17:36:11 ] >>195->>198 ありがとうございます。 >>196 さんのVBAを使わせてもらってます。 あと3分間に3回も4回も動作を繰り返す症状があり、 以下のサイトを参考にしてexcelを強制リロード させるようにしたところ安定動作するようになりました。 www.efcit.co.jp/cgi-bin2/exqalounge.cgi?print+200502/05020118.txt お礼まで。
200 名前:デフォルトの名無しさん [2008/12/22(月) 21:47:11 ] Cells(1, 1) = Format("2008 / 12 / 22", "aaa") これを実行すると (月) ってなるんだけど 両側の括弧を消したい場合は文字を操作するしかないですか?
201 名前:デフォルトの名無しさん mailto:sage [2008/12/22(月) 21:49:23 ] >>200 replaceで括弧取り除くユーザ関数でも作れば?
202 名前:デフォルトの名無しさん mailto:sage [2008/12/22(月) 21:51:41 ] >>200 ならないよ
203 名前:デフォルトの名無しさん mailto:sage [2008/12/22(月) 22:04:30 ] >>202 申し訳ない、環境書きます osx excel 2004 この環境特有の処理かな?
204 名前:デフォルトの名無しさん [2008/12/22(月) 22:18:23 ] st = "個" Range("d5").NumberFormatLocal = "0.0""個""" これだと設定を変えられました。stに代入する意味はありませんが st = "個" Range("d5").NumberFormatLocal = "0.0""st""" これだとエラーがでます。文字列なので""をとってみても "0.0"st"" 無理でした。 どうすれば代入した値を扱えるのでしょうか?
205 名前:デフォルトの名無しさん mailto:sage [2008/12/22(月) 22:46:05 ] >>203 mac版って不便だね Cells(1, 1) = Mid("日月火水木金土", Weekday(2008 / 12 / 22), 1)
206 名前:205 mailto:sage [2008/12/22(月) 23:05:03 ] >>203 すいません こうですね Cells(1, 1) = Mid("日月火水木金土", Weekday("2008/12/22"), 1) 若しくは Cells(1, 2) = WeekdayName(Weekday("2008/12/22"), True)
207 名前:デフォルトの名無しさん mailto:sage [2008/12/22(月) 23:05:49 ] IF文でCELLS(5,4).VALUE の値が小数点ならとかいう指定はできますでしょうか? もしくは小数点を含まないといった指定はどうやればできるのでしょうか?
208 名前:デフォルトの名無しさん mailto:sage [2008/12/22(月) 23:11:10 ] >>204 st = "個" Range("d5").NumberFormatLocal = "0.0" & st
209 名前:デフォルトの名無しさん mailto:sage [2008/12/22(月) 23:15:04 ] >>196 198さんのに関して、横レスですが、是非、教えてください。 >右辺のRange("B1:B96").Valueが2次元配列。 office tanaka で調べても、これは2次元配列ようにありますが、私には 1次元配列に見えるのです。こう書いてもvariant型変数なので2次元配列 となるというように理解するものですか?
210 名前:デフォルトの名無しさん mailto:sage [2008/12/22(月) 23:18:10 ] >>208 それでもエラーでましたorz
211 名前:デフォルトの名無しさん mailto:sage [2008/12/22(月) 23:29:43 ] >>207 今思いついたのは n = (Cells(5, 4).Value * 10) Mod 10 If n <> 0 Then MsgBox "小数" >値が小数点なら って言うのをエスパーした結果 2.0は小数点無しでいいんだよね
212 名前:デフォルトの名無しさん mailto:sage [2008/12/22(月) 23:34:53 ] >>211 2.0も小数点扱いしたいです・・・
213 名前:デフォルトの名無しさん mailto:sage [2008/12/22(月) 23:40:40 ] >>212 書式で小数点以下の桁数指定すれば 1は1.0とか 2は2.0とか表示されるんだけど その状態だと全部小数点有りだよね
214 名前:デフォルトの名無しさん mailto:sage [2008/12/22(月) 23:46:52 ] 文字列にして"."をFind
215 名前:デフォルトの名無しさん mailto:sage [2008/12/22(月) 23:50:59 ] >>210 こうじゃね? st = """個""" Range("D5").NumberFormatLocal = "0.0" & st
216 名前:デフォルトの名無しさん mailto:sage [2008/12/22(月) 23:58:08 ] >>209 調べてみりゃわかる。 MsgBox UBound(Range("B1:B96").Value, 1) MsgBox UBound(Range("B1:B96").Value, 2) 96と1が返るから2次元配列。