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)
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次元配列。
217 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 00:18:33 ] find関数で、もし見つかったら処理するを先に記述するにはどうしたらよいのでしょうか? If Obj Is Nothing Then これだと見つからなかったら先に処理して、それ以外は見つかったことになりますよね その逆の順番にしたいのです
218 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 00:20:50 ] >>209 んな難しく考えんでも、行/列 って2次元じゃん。 2次元配列を視覚的に見えるようにしたのがシートってだけだよ。
219 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 00:22:03 ] >>217 if obj is nothing then else 〜〜 じゃダメなの? if not obj is nothing then にしたいって事?
220 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 00:39:13 ] >>219 はい、そうです Dim Obj As Object Set Obj = Cells(1,1).Find(".") '小数点含むなら If not Obj Is Nothing Then セル1,1に値を入力しました。5と入力したところ objはnothingになりません・・・一体なぜなのでしょうか?
221 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 00:46:03 ] >>220 表示形式が0.0とかじゃないの? LookIn:がxlValuesになってたらNothingにはならない。 値=Cells(1,1)..Value If Int(値) = 値 Then とかで判定した方がいいと思う。
222 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 00:47:32 ] Sub test() Dim a As Range Set a = Cells(1, 1).Find(".") If Not a Is Nothing Then MsgBox a.Address Else MsgBox "nothing" End If End Sub 普通にnothingだけどねえ。
223 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 00:50:45 ] >>222 LookInがxlValuesなんだろ? デフォルト状態ではxlFormulasだが、指定しないと前の状態を引き継ぐからな。
224 名前:220 mailto:sage [2008/12/23(火) 00:53:43 ] どうやら、そのようでした。ご迷惑おかけして申し訳ありませんでした。 無事、解決いたしました。ありがとうございます。
225 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 00:56:00 ] セルの値が文字列かどうかって判定できますでしょうか? 数値か文字列かを判定したいだけなのですが、 この場合、どうしたらよいでしょうか?
226 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 00:56:31 ] 完全一致検索とかも考えられるか。 Findメソッド使うときは最低でもLookInとLookAtは書いた方がいい。
227 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 01:00:41 ] >>225 VarType関数で調べる。 いまいちな人はWorksheetFUnction.IsNumberで調べる。
228 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 01:08:34 ] >>227 If VarType("Cells(x, y).Value") = 8 Then これで文字列ならと指定したのですが、 何故か、セルに手動で入力した5とかの数字も文字列として認識されてしまいます。 これは回避できないのでしょうか?
229 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 01:16:35 ] >>228 釣りか? "Cells(x, y).Value"とダブルクォートでくくったら文字列に決まってるだろ?
230 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 01:20:55 ] 流石に釣りだろ・・・。
231 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 01:37:50 ] セルに値入力をして、たとえば整数を入力します77とか8とか その入力したセルに対してvartypeやtypenameで調べてみると vartype=5 typaname=double と表示されます。 なぜ整数扱いではないのでしょうか?
232 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 01:48:55 ] >>231 EXcelの仕様。 Long型とかInteger型はありえない。
233 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 01:52:44 ] >>232 こんな仕様にした理由は何かあるのでしょうか? 普通に整数ならintegerに小数点ならとりあえずdoubleにとかしてくれたほうが わかりやすい? いや、絶対値とるためにdoubleにしてるのかな でも、typenameやvartypeをそのまま使えないってのは面倒かも
234 名前:デフォルトの名無しさん [2008/12/23(火) 08:12:18 ] 熱海を神奈川に押し付けようと言う魂胆かもしれんがいらんぞ。
235 名前:デフォルトの名無しさん [2008/12/23(火) 08:13:11 ] 間違えた…キニスルナ!
236 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 09:46:16 ] ディズニーランドは東京、でも浦安は千葉。 みたいな感じ? どうでもいいわw
237 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 12:38:37 ] >>233 実数の型にはsingleもあるのにどうしてそれは無視してとりあえずdoubleなの?
238 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 13:30:07 ] singleの方が使用バイト数少ないしね!
239 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 21:24:42 ] >>233 0.1 * 10がIntegerにならないぞゴラって声が容易に想像できるから、全部Doubleのほうがいいと思う。 あと、ワークシートでの計算でIntegerとDoubleを区別するよりは 全部Doubleのほうが速いなんてこともありそう。いや想像だけど。 それよりも、一般人が良く使うソフトなのに、基数が10でないことのほうが問題だろ。 さすがにある程度の補正はかかっているけど。
240 名前:デフォルトの名無しさん mailto:sage [2008/12/24(水) 14:01:15 ] >>239 良く分からんけど Excelが普通なんでしょ
241 名前:デフォルトの名無しさん mailto:sage [2008/12/24(水) 19:50:07 ] >>239 てか、2進法で計算してるんだから、わざわざ10進法基数にする必要性が無いよ。 余計な事して誤差が問題になるなら、やらんで欲しいな。 変数の型に関しては、使用バイト数が少ない方が当然処理は早いよ。 混在とか関係ない・・・はず。
242 名前:デフォルトの名無しさん mailto:sage [2008/12/24(水) 20:35:29 ] んなこたーない。実数同士の足し算よりも、整数と実数の変換の方が余程時間が掛かるのが今のCPUだ。 ついでに言えば、Excel2000だか2002だかを境にdoubleからlong doubleに切り替わっている筈。 レーザ測距のデータみたいに、10桁くらいある数の標準偏差を取ろうとすると違いが判る。
243 名前:デフォルトの名無しさん mailto:sage [2008/12/24(水) 21:58:35 ] >>241 いや、基数10はセルが保持するデータの話。 Doubleではない何かの型であってほしかったということ。
244 名前:デフォルトの名無しさん mailto:sage [2008/12/24(水) 23:50:41 ] floatよりdoubleの方が速いらしいぜ
245 名前:デフォルトの名無しさん mailto:sage [2008/12/25(木) 00:30:23 ] >>244 マジレスすると、ケースバイケース。
246 名前:デフォルトの名無しさん [2008/12/26(金) 00:36:57 ] 質問です。 windowsXPでExcelは2007。 Dim lastRow As Long '最終行数 Workbooks.Open Filename:="C:\Documents and Settings\デスクトップ\新しいフォルダ\AAA.xls" lastRow = Range("A" & Rows.Count).End(xlUp).Row '最終行の取得 で、lastRowに1しか入りません。 実際は1000と入らなければいけないのですが。 どこが間違っているか、御教示ください。
247 名前:デフォルトの名無しさん mailto:sage [2008/12/26(金) 01:42:25 ] >>246 xlUpはどう言う意味?
248 名前:デフォルトの名無しさん mailto:sage [2008/12/26(金) 01:49:04 ] たまたまこのスレ開いた俺が適当に答えてみる Rows.Countって選択してるRowの数返すんじゃないの?
249 名前:デフォルトの名無しさん mailto:sage [2008/12/26(金) 01:56:21 ] >>246 lastRow = Range("A1048576").End(xlUp).Row
250 名前:デフォルトの名無しさん mailto:sage [2008/12/26(金) 02:04:26 ] シートを指定していないから 関係無いシートがアクティブになってるんじゃない? 一度シートが1つのBookで試してみ
251 名前:デフォルトの名無しさん mailto:sage [2008/12/26(金) 02:06:54 ] おそらく、アクティブなシートを勘違いしている。
252 名前:デフォルトの名無しさん mailto:sage [2008/12/26(金) 02:07:27 ] リロードすればよかった・・・
253 名前:246 [2008/12/26(金) 09:15:59 ] 皆様ありがとうございます。 シートを1つにしてもlastRowには1しか入りませんでした。 最終行の取り方自体は合っているようなので、 シート関係を見直してみます。 ありがとうございます。
254 名前:デフォルトの名無しさん mailto:sage [2008/12/26(金) 11:39:51 ] >>253 「 Range("A" & Rows.Count)」のターゲットが、「AAA.xls」になっていないと思われる。 おそらくは、マクロのあるシート。
255 名前:デフォルトの名無しさん mailto:sage [2008/12/26(金) 12:51:43 ] A列にデータが無いとかじゃないよな 普通Bookを開いたら、そのBookがアクティブになるから 問題は無いはず まぁ複数のBookを扱うなら、きちんとBookを指定したほうがいい
256 名前:デフォルトの名無しさん mailto:sage [2008/12/26(金) 12:58:20 ] >>255 > 普通Bookを開いたら、そのBookがアクティブになるから > 問題は無いはず ねーよ
257 名前:デフォルトの名無しさん [2008/12/26(金) 15:30:49 ] ユーザーフォームでコンボボックスを3つ作成し、それぞれに sample1 sample2 sample3 とオブジェクト名を指定しました。 コード内で変数を用いてそれぞれのコンボボックスにテキストを挿入したいときに、 For i = 1 To 3 j1 = i j2 = "sample" & Cstr(i) j2.Text = j1 Next i という形でコードを組みましたがうまくいきません。 オブジェクト名を変数で定義することはできないのでしょうか? 稚拙な質問で申し訳ありませんが、よろしくお願いします。
258 名前:デフォルトの名無しさん mailto:sage [2008/12/26(金) 15:42:33 ] >>257 Me.Controls("sample" & Cstr(i)).Text でできないか?
259 名前:デフォルトの名無しさん [2008/12/26(金) 15:49:02 ] >>258さん 解決しました。ありがとうございました。
260 名前:デフォルトの名無しさん mailto:sage [2008/12/26(金) 21:56:21 ] 知ってる人がいたら教えてほしいのですが、 エクセルVBAのコンボボックス(activX)の 設置数に限界は存在するのでしょうか? とりあえず、3000+αのコンボボックスを1シートに 設定したいのですが・・・・ 裏技的な方法でも良いので教えて頂ければ ありがたいので宜しくお願いします。
261 名前:デフォルトの名無しさん mailto:sage [2008/12/26(金) 22:13:21 ] >>260 Excelにセルの数だけウィンドウがあるわけではないのは知ってるよな?
262 名前:デフォルトの名無しさん [2008/12/26(金) 22:27:44 ] >とりあえず、3000+αのコンボボックスを1シートに ユーザーも大変だ w
263 名前:デフォルトの名無しさん mailto:sage [2008/12/27(土) 01:03:57 ] 良く分からないけど 一気にfor nextで3000作ろうとすると1208個でオブジェクトが有りませんだけど 1000作るを3回繰り返すと3000個出来た For a = 1 To 3 For n = 1 To 1000 ActiveSheet.OLEObjects.Add(ClassType:="Forms.ComboBox.1", Link:=False, _ DisplayAsIcon:=False, Left:=a * 72, Top:=(n * 18), Width:=72, Height:=18).Name = "ComboBox" & n Next n Next a
264 名前:デフォルトの名無しさん mailto:sage [2008/12/27(土) 01:51:37 ] 失敗したときのコードを張ってみそ
265 名前:263 mailto:sage [2008/12/27(土) 02:04:11 ] For n = 1 To 3000 ActiveSheet.OLEObjects.Add(ClassType:="Forms.ComboBox.1", Link:=False, _ DisplayAsIcon:=False, Left:=0, Top:=(n * 18), Width:=72, Height:=18).Name = "ComboBox" & n Next n >>260 を見て 試してみたら解るだろと思ってやってみただけだから 質問主じゃないよ
266 名前:260 mailto:sage [2008/12/27(土) 02:33:26 ] 263氏の方法でなんとかなりそうです ありがとうございました