[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 12/27 15:50 / Filesize : 259 KB / Number-of Response : 921
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Excel VBA質問スレ Part9



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)


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氏の方法でなんとかなりそうです
ありがとうございました

267 名前:デフォルトの名無しさん mailto:sage [2008/12/27(土) 07:25:59 ]
いや、出来る出来ないはどうでも良いんだよ。
コンボボックス3000ってのは、何とか別方法で再検討すべきじゃないか?

268 名前:デフォルトの名無しさん mailto:sage [2008/12/27(土) 09:32:05 ]
>>260
コンポボックス3000超って単に入力作業をするためのものですか、それとも
何か・・・
非常に興味があるので、横レスですが、使用場面のヒントでも・・・


269 名前:260 mailto:sage [2008/12/27(土) 12:40:11 ]
>>268 
項目数がやたら多いアンケートを想像してもらえれば、そんなに違わないかとおもいます
その内容を、特定のルールで別シート上へ集計するのが目的です。

>>267
コンボボックス3000が非常識なのは解ってはいたのですが、
社内の決め事なのでとりあえずは作ってみようという話になってしまいまして・・・
一旦使ってみた後での検討はします。

こんなところでしょうか

270 名前:デフォルトの名無しさん mailto:sage [2008/12/27(土) 13:10:26 ]
コンピュータには、ダメなものをダメな方向に力押しする性癖がある。
バカな物は作ってはいけない。


271 名前:デフォルトの名無しさん mailto:sage [2008/12/27(土) 17:51:01 ]
>>269
データベースシステム使えよ。マジで。
煽りとかじゃなくて、後々の事考えても、3000項目の入力なんてDBじゃなきゃ無理だよ。

3000の保守は出来ない、と言うかやるにしても金掛かるよ。
どうしてもやるなら、コンボボックス噛ませる必要性も見いだせないし。
シートをRDBとみなして、ダイレクトにセルに書き込むべきかと。

272 名前:268 [2008/12/27(土) 20:20:28 ]
折れの既成概念では、コンボボックスそのものの数が数件から10数件だったwww
>>263 さんので、コンボボックスのオートメイクは1208個、個数制限はない(ようだ)と
言うことを知った今、リストボックスとテキストボックスの利点を併せ持つコンボボックス
の大量使用によるRDB的エクセル活用法となるかも。これは、創造の世界に踏み込むものかも。


273 名前:デフォルトの名無しさん mailto:sage [2008/12/27(土) 20:34:24 ]
>>272
こらこらw




274 名前:デフォルトの名無しさん mailto:sage [2008/12/27(土) 20:47:59 ]
>>272
DBの知識がどれくらいあるのか分からないし、
スレ違いにもなってしまうから適当なところまでしか話しないけど、
エクセルではトランザクションの概念はビルドインされてない。

エクセルをRDB的に使用する事があるのは、
シートがRDB構造と視覚的に同じである事が理由。
つまり、RDBをダンプして、その結果をシートに表示するのに向いてるって事。

エクセル自体はDBじゃないから、入力に関しては向いてない。(出来なくはない)
やはりトランザクションとロックの概念が無いシステムでは怖い。
これはエクセルが劣ってるとかではなく、向き不向きがあるって事なのよ。

エクセルのシートにRDBをダンプすれば、言語が分からなくても、
オートフィルタ機能使ったり、VBAで複雑なクエリが出せる訳。
関数だってクエリと言えるよね。これは凄く魅力的な事だよ。

全部無理とは言わないし、勉強のためにやるのは一向に構わないけど、
老婆心ながら、エクセルをRDBに見立てて業務に使うのだけはやめた方が良いと思う。


275 名前:デフォルトの名無しさん [2008/12/27(土) 23:59:21 ]
>>263

---265氏のプログラム

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

---君のプログラム

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

---私が265氏と同等と考えるプログラム

For a = 0 To 2
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" & a * 1000 + n
Next n
Next a







[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<259KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef