08/12/18 21:48:14
>>114
do until なんとか =""
with ほにゃらら
if .cells(x, y).value = "○" then
処理
end if
loop
.valueにはいってる値を確認したところ、×とかちゃんとはいってました
セル全体にプルダウンの選択がそれぞれ入ってるからループ文では聞かないのかな
117:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/12/18 22:36:44
i=i+1はEndIfとLoopの間だと思う。
sheets(2)の列x(初期値1)を削除した後のループで再び削除する時にはxがインクリメントされてるから初期状態の列番号でいう所の3列目が削除されると思うがそれで良いのか、ふと疑問に思った。
どちらもエラーの原因じゃないけど。
というか、俺には「○×のプルダウンが入ってます」の意味が理解できない。
すまんな。
119:デフォルトの名無しさん
08/12/18 22:46:18
あとcolums→columns、だね
それでもif文の行にはエラーは出ない。
力になれなくてすまんな。
120:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/12/18 22:53:48
ありがとうございます!
columnsがまちがっていたようでした
無事いけました
ご指摘いただいたcolumnsが間違っていたことが一番の原因だったようです
122:デフォルトの名無しさん
08/12/18 23:16:55
失礼します
シート1から実行するとしてセルB2には名前という文字が入っております
const mojicell as string "B2"
のようにしてシートの対応するセルに格納されてる値をとりだすことはできますか?
やってみたところ、セルを格納するのはできなかったので・・・何か方法があるのかと思いまして
実際どのように試し方といいますと
Sheets(mojicell).cells(...... のように使いました。
SHeets("名前").cells(... に置き換えられるかとおもっていたのですが、
実際はSheets("B2")と 入っておりました。
const で指定したセルが参照する値を格納することはできないのでしょうか?
123:デフォルトの名無しさん
08/12/18 23:19:36
セル参照だけならrangeオブジェクト使いなさい。
シートまで含むならまずconstの値を工夫しなさい。
124:デフォルトの名無しさん
08/12/18 23:21:20
>>122
const mojicell as string = "B2"
worksheets(range(mojicell).value).cells(...
125:デフォルトの名無しさん
08/12/18 23:50:23
>>124
これだと
シート1からこのマクロ実行してシート1にあるセルを参照するならわかりやすいですが
シート2からこのマクロを実行してシート1にあるセルを参照するとなると、
できなくなるのでは?
126:デフォルトの名無しさん
08/12/19 00:50:28
>>124
これだとエラーでます・・・
127:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/12/19 01:03:33
>>127
"A17"は、シート名じゃねーだろ
129:デフォルトの名無しさん
08/12/19 01:06:10
>>128
これの意味するところは
range("A17").value = テスト という所なのでは?
よって
sheets("テスト") と>>124さんがおっしゃってた意味かとおもってたのですが
動作がうまくいかないということは違いますよねorz
130:デフォルトの名無しさん
08/12/19 01:16:52
>>129
どのシートの"A17"で
どこのマクロだよ
131:デフォルトの名無しさん
08/12/19 01:18:18
>>129
右辺を書け!
132:デフォルトの名無しさん
08/12/19 01:23:35
sheets(1)にあるマクロでsheets(1)のA17セルには、テスト という値が入っております
で、このsheets(1)のA17セルの値をconstとして間接的に参照できる形にして
sheets("テスト")の3行1列目のセルの値を取得します
でも、なぜか
print Range(moji).value
テスト
とは表示されるのに、先ほどの下の文では表示されません
133:デフォルトの名無しさん
08/12/19 01:26:27
Sheets(Range(moji).Value).Cells(3, 1).Value
これではインデックス範囲のエラーがでますorz
134:デフォルトの名無しさん
08/12/19 01:35:00
実際のファイルを作って、アップしろ
135:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/12/19 01:46:07
>>135
実際に作ったものをアップしろって
137:デフォルトの名無しさん
08/12/19 02:16:52
まったくわからない・・・
138:デフォルトの名無しさん
08/12/19 02:19:01
うpされたものを拾う気はあるのかや?俺には無いよ。めんどくさい。
質問の意味不明度が増してきたのでそろそろ寝てほしいと思う。適当に脳内補完してみたから。
const moji as string = "A17"
debug.print worksheets(sheet(1).range(moji)).cells(3,1)
139:デフォルトの名無しさん
08/12/19 02:22:16
>>138
それを実行してみたところ型が一致していません。とでました。
140:デフォルトの名無しさん
08/12/19 02:23:02
>>138
>>135
>Sheets("Range(moji).Value").Cells(3, 1).Value
この辺の行の意味不明度からして、根本的な間違いがあると思う。
141:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/12/19 02:26:16
>>141
だから、実際のものをアップしないと話にならねーって
143:デフォルトの名無しさん
08/12/19 02:35:29
>>138
デバッグどころかコンパイルも通らない物貼り付けて、えらそうに・・・
144:デフォルトの名無しさん
08/12/19 02:37:35
うーむ、簡単に見えてむずかしいようですね・・・
145:デフォルトの名無しさん
08/12/19 02:41:18
>>144
オマエが単純に間違ってんだよ。
現物をアップしろよ
146:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/12/19 02:45:00
>>147
それはもういいんだよ。
現物上げろよバカ
149:デフォルトの名無しさん
08/12/19 02:45:47
>>146
さすがにこれは長いですね・・・
150:デフォルトの名無しさん
08/12/19 02:46:35
>>148
現物をあげてダウンロードするまでにかかる時間のほうが長いと思うのですが・・・・
151:デフォルトの名無しさん
08/12/19 02:47:40
>>150
こんだけバカなんだから、根本的なところで間違ってんだよ。
どのセルに何の値を入れてるのかさえ、あてにならない。
152:デフォルトの名無しさん
08/12/19 02:48:58
>>150
概ね>>135通りのコードを書き込んで、コンパイルもしてないだろうさ
153:デフォルトの名無しさん
08/12/19 03:05:44
もっとスマートに出来ないものかとぐぐったけどINDIRECTばっかでてくる…orz
VBAでの良策ってどんなだろう。
>>149
長いのが気になるだけなら別関数にしてね^^
154:デフォルトの名無しさん
08/12/19 03:06:30
でもこれじゃconstでセルを指定しずらいというか面倒なのって痛いですね
155:デフォルトの名無しさん
08/12/19 03:10:01
>>154
オマエがバカなだけ。
Debug.Printもついてない行でエラーになるのはあたりまえ。
156:デフォルトの名無しさん
08/12/19 03:11:19
>>155
先ほどdebug.printがかかれてたマクロを実行してもエラーがでたのですが・・・
157:デフォルトの名無しさん
08/12/19 03:13:36
ごめん。それは俺のミス。
以上で終了──
158:デフォルトの名無しさん
08/12/19 03:13:43
>>156
rangeのデフォルトはValueじゃない。
それとDebug.Printが付いてないやつとは別のコード。
その区別がつかないのは、バカだから。
159:デフォルトの名無しさん
08/12/19 03:31:01
おぉ。rangeってrangeなのね。そうなのね。
そおしたら随分と無駄なコード書いてきたんだなぁ今まで。反省orz
160:デフォルトの名無しさん
08/12/19 07:04:25
rangeが指定する値を保存する方法って?
161:デフォルトの名無しさん
08/12/19 07:10:54
オブジェクト変数にrangeをセット
162:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/12/19 13:22:11
>>162
その発言、なんかのギャグ?
164:デフォルトの名無しさん
08/12/19 13:25:02
>>162
流れから見てその件はもう終わったものかと思っていたが・・・
勘違いかな?
165:デフォルトの名無しさん
08/12/19 14:00:42
日本人はひとつのジョークで3回笑う
1回目はジョークを聞いたとき
2回目はジョークの意味を教えてもらったとき
3回目は家に帰った後、やっとジョークの意味がわかったとき
166:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/12/19 14:13:32
>>166
アクティブにしないとセレクトできないんじゃないの?
168:デフォルトの名無しさん
08/12/19 14:24:07
>>167
そうなんですか。困ったな。。。
普段は他のシートを表示させているので、
非アクティブでも動作をさせるにはどうしたらいいですか?
169:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/12/19 14:51:43
>>169
おおおおおお!!!!!!
ありがとおおおおお!!!!
さっそくやってみます。
171:デフォルトの名無しさん
08/12/19 14:56:51
>>169
できたああああ!
ありがとう!!!!
感謝感謝!!!!
172:デフォルトの名無しさん
08/12/19 20:04:42
質問させてください。
指定した範囲内にあるデータの種類の数を取得するにはどうしたらいいでしょうか?
汚いながらもVBAで配列に入れながら総当りで調べることはできるのですが
ワークシート関数でそのようなものがあれば高速なのでそちらを使いたいと思っています。
例:範囲 A1:C3
A B C
1 山 川 海
2 海 海 川
3 川 都 南
この場合、「山、川、海、都、南」の5種類が出現するので 5を返してくれる関数を知りたいです。
よろしくお願いします。
173:デフォルトの名無しさん
08/12/19 20:14:52
このファイルで別シートからマクロを実行して
特定の列だけ抽出して別のシートに表示したいです。
列を抽出するとき、たとえばA列とC列とE列を削除して表示させたい結果が
下のテーブルです。
このように別のシートからマクロを実行して他の別シートに抽出した結果を表示させるには
どのようしすればいいでしょうか?
単にセル結合を考えない抽出ならできるのですが、
セル結合も考慮して、元の分類タイトルがあるまま抽出するにはどういった
手順でやるのが最適でしょうか?よろしくお願いしますm(__)m
ファイルは以下のやつをみていただければわかりやすいかとおもいます
URLリンク(www.dotup.org)
174:デフォルトの名無しさん
08/12/19 22:38:02
101で質問したものです。
もぐらたたきが大まかですがだいたいできたので
UPします
URLリンク(www.mediafire.com)
URLリンク(www.mediafire.com)
まだもんだいはありますがよろしければ批評してください
175:デフォルトの名無しさん
08/12/19 23:33:05
>172
配列数式でも良ければ
{=SUM(1/COUNTIF(A1:C3,A1:C3))}
176:デフォルトの名無しさん
08/12/20 00:54:59
>>172
配列の使い方はどうしてる?
for eachで選択範囲をコレクションとして、
.valueが配列に含まれていなかった場合には、配列にぶち込んで、
最後にuboundでカウントすれば高速だと思うんだが。
このロジカルなら一瞬だと思うけど。
配列で総当たりってのがちと気になった。
177:デフォルトの名無しさん
08/12/20 01:05:35
>>173
シート名を明示してやればOKだね。
タイトル行が空白だったら、空白じゃなくなるまで左に移動してタイトルを取得する。
これを組むのが面倒なら、
結合を全部解除して、全てのセルにタイトルを振ってしまう。
最後に、重複するタイトルの場合に削除なりmergeなりで処理すれば良いと思う。
削除って考えじゃなくて、抽出したい物を残すって考えにしないとタイトルは取得出来ないな。
178:デフォルトの名無しさん
08/12/20 08:34:25
>タイトル行が空白だったら、空白じゃなくなるまで左に移動してタイトルを取得する。
抽出してしまった場合、左にもうタイトルはないのではないでしょうか?
あらかじめこれも全ての結合を解除したという前提かな?
でも左に移動してタイトルを取得する場合、元からタイトルがない行があった場合
たとえば、メーカーというタイトルが最初からなかったとすると、本来なくていいタイトルに
別のタイトルが埋め込まれますよね?
このファイルに対してはいけそうですが、ない場合は大変かな?
>結合を全部解除して、全てのセルにタイトルを振ってしまう。
>最後に、重複するタイトルの場合に削除なりmergeなりで処理すれば良いと思う。
これもタイトルがない行があった場合、処理に困るかな・・・
追加、条件で大変申し訳ないですが、もしタイトルが空白のセルがあった場合はこれじゃ難しいでしょうか?
179:デフォルトの名無しさん
08/12/20 12:23:58
すみません。CLASSモジュールの書き方がわからないんですが
どこかに説明しているサイトないですか?
180:デフォルトの名無しさん
08/12/20 12:29:58
>>178
元からタイトルが無い列があるなんて知らないし。
てか、excelでレイアウトするなら、VBAで処理しようと考えない事だな。
人間が見やすい見た目と、計算機が処理しやすい(出来る)のは全く違うからね。
帳票として見やすく加工・レイアウトするのは、全ての演算処理が終わってから最後にやるもの。
レイアウトされたものに処理を掛ける事ほど無意味かつ煩雑になる事はないぞよ。
いったん全部のmarge解除して、全てのタイトルをはめ込むしかないでしょ。
181:デフォルトの名無しさん
08/12/20 19:32:18
Excel2003を使ってます。
VBAの勉強をしたいのですが、良い本や教材はありますでしょうか?
バカでもわかるようなのでいいです。
182:デフォルトの名無しさん
08/12/20 22:48:34
VBAで何やりたいの?
183:デフォルトの名無しさん
08/12/21 00:50:07
質問です。
アクティブになっているシートから別のシートを選択したいのですが、
エラーが出てとまってしまいますが、なぜでしょうか?
エラーの内容はシートの保護がかかっている状態で、
そのシートを選択したとき(Activate)と同じエラーです。
エクセル2003で、自宅PCでは動作しますが、会社PC(2003だと思う)ではダメです。
もちろん保護ははずしましています。
考えられる原因はなにがあるでしょうか。
文章がわかりにくかったらすいません。
184:デフォルトの名無しさん
08/12/21 02:20:11
>>183
>>167
185:166
08/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:デフォルトの名無しさん
08/12/21 13:44:32
>>185
画面がフラッシュするのは仕方ないと思うぞ。Windowsってのはそういうもんだ。
とりあえず右端にコピーする方法
Worksheets("IV").Activate
Range("B1:B96").Copy Destination:=Range("IV1").End(xlToLeft).Offset(0, 1)
187:デフォルトの名無しさん
08/12/21 13:53:12
>>185
細かいことを言うと、それだと処理が1分よりも少し長い間隔で実行される。
nextTimeはSubの先頭でセットした方が誤差が少なくなる。
188:デフォルトの名無しさん
08/12/21 14:27:42
>>186>>187
ありがとうございます。値貼り付けにできますか?
あとこのマクロは時間処理が少しおかしいです。
しばらく席を離れて画面が黒くなりパソコンが待機状態になったとき
(マウスを触るとすぐに画面は表示される状態)などマクロがとまってしまいまいます。
そして再度実行させると、たまっていた処理を一気に吐き出すような感じで、
3連続処理を繰り返すことが多々あります。安定動作にはまだまだ遠いです。
189:デフォルトの名無しさん
08/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
08/12/21 16:15:46
>>184
少し意味がわかりませんが。
PCが違うときに同じマクロでもエラーが出るんです・・・。
自宅PC>動く
会社PC>エラー
ということです。
シートの保護やファイルの保護などの設定の問題のような気はするんですが。
わかる方いたらお願いします。
191:デフォルトの名無しさん
08/12/21 16:34:38
>>190
単純に考えて、同じマクロではないのだろう。
192:デフォルトの名無しさん
08/12/21 16:46:37
VBAで組んだマクロの仕様書を作ってくれるソフトって無いですか?
VBとかcとかはあるんだけど、VBAのやつは見つからない。
193:183
08/12/21 17:33:42
>>191
すいません。
厳密に言うと違うんですが。
中身はコードのコピー貼り付けなのでコードは同じです。
(ファイルは別物)
ファイル名シート名の書き換えとかはしますけど。
会社のファイルがシート保護されていたので、
ためしに自宅PCでシートの保護をした状態だと、同様のエラーがでました。
なので設定の問題かなと予想してますが。
エラー箇所は毎回切り替えの部分です。
(アクティブシート・ファイルの切り替え)
194:166
08/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:デフォルトの名無しさん
08/12/21 18:00:59
.valueを転載したいだけなら、forなりfor eachなりでまわして、
sheets(2).cells(1,1).value = sheets(1).cells(1,1).value
の考えで代入して行っても良いんでないかな。
まぁ、ある程度の量以上になると遅いけど。
196:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/12/22 07:46:08
rangeをvariant型の2次元配列に代入するのもいいね。
198:デフォルトの名無しさん
08/12/22 11:08:13
>>197
>>196も入れてる。
右辺のRange("B1:B96").Valueが2次元配列。
左辺はResize使った方がすっきりするが。
199:166
08/12/22 17:36:11
>>195->>198
ありがとうございます。
>>196さんのVBAを使わせてもらってます。
あと3分間に3回も4回も動作を繰り返す症状があり、
以下のサイトを参考にしてexcelを強制リロード
させるようにしたところ安定動作するようになりました。
URLリンク(www.efcit.co.jp)
お礼まで。
200:デフォルトの名無しさん
08/12/22 21:47:11
Cells(1, 1) = Format("2008 / 12 / 22", "aaa")
これを実行すると (月) ってなるんだけど
両側の括弧を消したい場合は文字を操作するしかないですか?
201:デフォルトの名無しさん
08/12/22 21:49:23
>>200
replaceで括弧取り除くユーザ関数でも作れば?
202:デフォルトの名無しさん
08/12/22 21:51:41
>>200
ならないよ
203:デフォルトの名無しさん
08/12/22 22:04:30
>>202
申し訳ない、環境書きます
osx excel 2004
この環境特有の処理かな?
204:デフォルトの名無しさん
08/12/22 22:18:23
st = "個"
Range("d5").NumberFormatLocal = "0.0""個"""
これだと設定を変えられました。stに代入する意味はありませんが
st = "個"
Range("d5").NumberFormatLocal = "0.0""st"""
これだとエラーがでます。文字列なので""をとってみても
"0.0"st"" 無理でした。
どうすれば代入した値を扱えるのでしょうか?
205:デフォルトの名無しさん
08/12/22 22:46:05
>>203
mac版って不便だね
Cells(1, 1) = Mid("日月火水木金土", Weekday(2008 / 12 / 22), 1)
206:205
08/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:デフォルトの名無しさん
08/12/22 23:05:49
IF文でCELLS(5,4).VALUE の値が小数点ならとかいう指定はできますでしょうか?
もしくは小数点を含まないといった指定はどうやればできるのでしょうか?
208:デフォルトの名無しさん
08/12/22 23:11:10
>>204
st = "個"
Range("d5").NumberFormatLocal = "0.0" & st
209:デフォルトの名無しさん
08/12/22 23:15:04
>>196 198さんのに関して、横レスですが、是非、教えてください。
>右辺のRange("B1:B96").Valueが2次元配列。
office tanaka で調べても、これは2次元配列ようにありますが、私には
1次元配列に見えるのです。こう書いてもvariant型変数なので2次元配列
となるというように理解するものですか?
210:デフォルトの名無しさん
08/12/22 23:18:10
>>208
それでもエラーでましたorz
211:デフォルトの名無しさん
08/12/22 23:29:43
>>207
今思いついたのは
n = (Cells(5, 4).Value * 10) Mod 10
If n <> 0 Then MsgBox "小数"
>値が小数点なら
って言うのをエスパーした結果
2.0は小数点無しでいいんだよね
212:デフォルトの名無しさん
08/12/22 23:34:53
>>211
2.0も小数点扱いしたいです・・・
213:デフォルトの名無しさん
08/12/22 23:40:40
>>212
書式で小数点以下の桁数指定すれば
1は1.0とか
2は2.0とか表示されるんだけど
その状態だと全部小数点有りだよね
214:デフォルトの名無しさん
08/12/22 23:46:52
文字列にして"."をFind
215:デフォルトの名無しさん
08/12/22 23:50:59
>>210
こうじゃね?
st = """個"""
Range("D5").NumberFormatLocal = "0.0" & st
216:デフォルトの名無しさん
08/12/22 23:58:08
>>209
調べてみりゃわかる。
MsgBox UBound(Range("B1:B96").Value, 1)
MsgBox UBound(Range("B1:B96").Value, 2)
96と1が返るから2次元配列。
217:デフォルトの名無しさん
08/12/23 00:18:33
find関数で、もし見つかったら処理するを先に記述するにはどうしたらよいのでしょうか?
If Obj Is Nothing Then
これだと見つからなかったら先に処理して、それ以外は見つかったことになりますよね
その逆の順番にしたいのです
218:デフォルトの名無しさん
08/12/23 00:20:50
>>209
んな難しく考えんでも、行/列 って2次元じゃん。
2次元配列を視覚的に見えるようにしたのがシートってだけだよ。
219:デフォルトの名無しさん
08/12/23 00:22:03
>>217
if obj is nothing then
else
~~
じゃダメなの?
if not obj is nothing then
にしたいって事?
220:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/12/23 00:46:03
>>220
表示形式が0.0とかじゃないの?
LookIn:がxlValuesになってたらNothingにはならない。
値=Cells(1,1)..Value
If Int(値) = 値 Then
とかで判定した方がいいと思う。
222:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/12/23 00:50:45
>>222
LookInがxlValuesなんだろ?
デフォルト状態ではxlFormulasだが、指定しないと前の状態を引き継ぐからな。
224:220
08/12/23 00:53:43
どうやら、そのようでした。ご迷惑おかけして申し訳ありませんでした。
無事、解決いたしました。ありがとうございます。
225:デフォルトの名無しさん
08/12/23 00:56:00
セルの値が文字列かどうかって判定できますでしょうか?
数値か文字列かを判定したいだけなのですが、
この場合、どうしたらよいでしょうか?
226:デフォルトの名無しさん
08/12/23 00:56:31
完全一致検索とかも考えられるか。
Findメソッド使うときは最低でもLookInとLookAtは書いた方がいい。
227:デフォルトの名無しさん
08/12/23 01:00:41
>>225
VarType関数で調べる。
いまいちな人はWorksheetFUnction.IsNumberで調べる。
228:デフォルトの名無しさん
08/12/23 01:08:34
>>227
If VarType("Cells(x, y).Value") = 8 Then これで文字列ならと指定したのですが、
何故か、セルに手動で入力した5とかの数字も文字列として認識されてしまいます。
これは回避できないのでしょうか?
229:デフォルトの名無しさん
08/12/23 01:16:35
>>228
釣りか?
"Cells(x, y).Value"とダブルクォートでくくったら文字列に決まってるだろ?
230:デフォルトの名無しさん
08/12/23 01:20:55
流石に釣りだろ・・・。
231:デフォルトの名無しさん
08/12/23 01:37:50
セルに値入力をして、たとえば整数を入力します77とか8とか
その入力したセルに対してvartypeやtypenameで調べてみると
vartype=5 typaname=double と表示されます。
なぜ整数扱いではないのでしょうか?
232:デフォルトの名無しさん
08/12/23 01:48:55
>>231
EXcelの仕様。
Long型とかInteger型はありえない。
233:デフォルトの名無しさん
08/12/23 01:52:44
>>232
こんな仕様にした理由は何かあるのでしょうか?
普通に整数ならintegerに小数点ならとりあえずdoubleにとかしてくれたほうが
わかりやすい?
いや、絶対値とるためにdoubleにしてるのかな
でも、typenameやvartypeをそのまま使えないってのは面倒かも
234:デフォルトの名無しさん
08/12/23 08:12:18
熱海を神奈川に押し付けようと言う魂胆かもしれんがいらんぞ。
235:デフォルトの名無しさん
08/12/23 08:13:11
間違えた…キニスルナ!
236:デフォルトの名無しさん
08/12/23 09:46:16
ディズニーランドは東京、でも浦安は千葉。
みたいな感じ?
どうでもいいわw
237:デフォルトの名無しさん
08/12/23 12:38:37
>>233
実数の型にはsingleもあるのにどうしてそれは無視してとりあえずdoubleなの?
238:デフォルトの名無しさん
08/12/23 13:30:07
singleの方が使用バイト数少ないしね!
239:デフォルトの名無しさん
08/12/23 21:24:42
>>233
0.1 * 10がIntegerにならないぞゴラって声が容易に想像できるから、全部Doubleのほうがいいと思う。
あと、ワークシートでの計算でIntegerとDoubleを区別するよりは
全部Doubleのほうが速いなんてこともありそう。いや想像だけど。
それよりも、一般人が良く使うソフトなのに、基数が10でないことのほうが問題だろ。
さすがにある程度の補正はかかっているけど。
240:デフォルトの名無しさん
08/12/24 14:01:15
>>239
良く分からんけど
Excelが普通なんでしょ
241:デフォルトの名無しさん
08/12/24 19:50:07
>>239
てか、2進法で計算してるんだから、わざわざ10進法基数にする必要性が無いよ。
余計な事して誤差が問題になるなら、やらんで欲しいな。
変数の型に関しては、使用バイト数が少ない方が当然処理は早いよ。
混在とか関係ない・・・はず。
242:デフォルトの名無しさん
08/12/24 20:35:29
んなこたーない。実数同士の足し算よりも、整数と実数の変換の方が余程時間が掛かるのが今のCPUだ。
ついでに言えば、Excel2000だか2002だかを境にdoubleからlong doubleに切り替わっている筈。
レーザ測距のデータみたいに、10桁くらいある数の標準偏差を取ろうとすると違いが判る。
243:デフォルトの名無しさん
08/12/24 21:58:35
>>241
いや、基数10はセルが保持するデータの話。
Doubleではない何かの型であってほしかったということ。
244:デフォルトの名無しさん
08/12/24 23:50:41
floatよりdoubleの方が速いらしいぜ
245:デフォルトの名無しさん
08/12/25 00:30:23
>>244
マジレスすると、ケースバイケース。
246:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/12/26 01:42:25
>>246
xlUpはどう言う意味?
248:デフォルトの名無しさん
08/12/26 01:49:04
たまたまこのスレ開いた俺が適当に答えてみる
Rows.Countって選択してるRowの数返すんじゃないの?
249:デフォルトの名無しさん
08/12/26 01:56:21
>>246
lastRow = Range("A1048576").End(xlUp).Row
250:デフォルトの名無しさん
08/12/26 02:04:26
シートを指定していないから
関係無いシートがアクティブになってるんじゃない?
一度シートが1つのBookで試してみ
251:デフォルトの名無しさん
08/12/26 02:06:54
おそらく、アクティブなシートを勘違いしている。
252:デフォルトの名無しさん
08/12/26 02:07:27
リロードすればよかった・・・
253:246
08/12/26 09:15:59
皆様ありがとうございます。
シートを1つにしてもlastRowには1しか入りませんでした。
最終行の取り方自体は合っているようなので、 シート関係を見直してみます。
ありがとうございます。
254:デフォルトの名無しさん
08/12/26 11:39:51
>>253
「 Range("A" & Rows.Count)」のターゲットが、「AAA.xls」になっていないと思われる。
おそらくは、マクロのあるシート。
255:デフォルトの名無しさん
08/12/26 12:51:43
A列にデータが無いとかじゃないよな
普通Bookを開いたら、そのBookがアクティブになるから
問題は無いはず
まぁ複数のBookを扱うなら、きちんとBookを指定したほうがいい
256:デフォルトの名無しさん
08/12/26 12:58:20
>>255
> 普通Bookを開いたら、そのBookがアクティブになるから
> 問題は無いはず
ねーよ
257:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/12/26 15:42:33
>>257
Me.Controls("sample" & Cstr(i)).Text
でできないか?
259:デフォルトの名無しさん
08/12/26 15:49:02
>>258さん
解決しました。ありがとうございました。
260:デフォルトの名無しさん
08/12/26 21:56:21
知ってる人がいたら教えてほしいのですが、
エクセルVBAのコンボボックス(activX)の
設置数に限界は存在するのでしょうか?
とりあえず、3000+αのコンボボックスを1シートに
設定したいのですが・・・・
裏技的な方法でも良いので教えて頂ければ
ありがたいので宜しくお願いします。
261:デフォルトの名無しさん
08/12/26 22:13:21
>>260
Excelにセルの数だけウィンドウがあるわけではないのは知ってるよな?
262:デフォルトの名無しさん
08/12/26 22:27:44
>とりあえず、3000+αのコンボボックスを1シートに
ユーザーも大変だ w
263:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/12/27 01:51:37
失敗したときのコードを張ってみそ
265:263
08/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
08/12/27 02:33:26
263氏の方法でなんとかなりそうです
ありがとうございました
267:デフォルトの名無しさん
08/12/27 07:25:59
いや、出来る出来ないはどうでも良いんだよ。
コンボボックス3000ってのは、何とか別方法で再検討すべきじゃないか?
268:デフォルトの名無しさん
08/12/27 09:32:05
>>260
コンポボックス3000超って単に入力作業をするためのものですか、それとも
何か・・・
非常に興味があるので、横レスですが、使用場面のヒントでも・・・
269:260
08/12/27 12:40:11
>>268
項目数がやたら多いアンケートを想像してもらえれば、そんなに違わないかとおもいます
その内容を、特定のルールで別シート上へ集計するのが目的です。
>>267
コンボボックス3000が非常識なのは解ってはいたのですが、
社内の決め事なのでとりあえずは作ってみようという話になってしまいまして・・・
一旦使ってみた後での検討はします。
こんなところでしょうか
270:デフォルトの名無しさん
08/12/27 13:10:26
コンピュータには、ダメなものをダメな方向に力押しする性癖がある。
バカな物は作ってはいけない。
271:デフォルトの名無しさん
08/12/27 17:51:01
>>269
データベースシステム使えよ。マジで。
煽りとかじゃなくて、後々の事考えても、3000項目の入力なんてDBじゃなきゃ無理だよ。
3000の保守は出来ない、と言うかやるにしても金掛かるよ。
どうしてもやるなら、コンボボックス噛ませる必要性も見いだせないし。
シートをRDBとみなして、ダイレクトにセルに書き込むべきかと。
272:268
08/12/27 20:20:28
折れの既成概念では、コンボボックスそのものの数が数件から10数件だったwww
>>263 さんので、コンボボックスのオートメイクは1208個、個数制限はない(ようだ)と
言うことを知った今、リストボックスとテキストボックスの利点を併せ持つコンボボックス
の大量使用によるRDB的エクセル活用法となるかも。これは、創造の世界に踏み込むものかも。
273:デフォルトの名無しさん
08/12/27 20:34:24
>>272
こらこらw
274:デフォルトの名無しさん
08/12/27 20:47:59
>>272
DBの知識がどれくらいあるのか分からないし、
スレ違いにもなってしまうから適当なところまでしか話しないけど、
エクセルではトランザクションの概念はビルドインされてない。
エクセルをRDB的に使用する事があるのは、
シートがRDB構造と視覚的に同じである事が理由。
つまり、RDBをダンプして、その結果をシートに表示するのに向いてるって事。
エクセル自体はDBじゃないから、入力に関しては向いてない。(出来なくはない)
やはりトランザクションとロックの概念が無いシステムでは怖い。
これはエクセルが劣ってるとかではなく、向き不向きがあるって事なのよ。
エクセルのシートにRDBをダンプすれば、言語が分からなくても、
オートフィルタ機能使ったり、VBAで複雑なクエリが出せる訳。
関数だってクエリと言えるよね。これは凄く魅力的な事だよ。
全部無理とは言わないし、勉強のためにやるのは一向に構わないけど、
老婆心ながら、エクセルをRDBに見立てて業務に使うのだけはやめた方が良いと思う。
275:デフォルトの名無しさん
08/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
276:デフォルトの名無しさん
08/12/28 00:09:40
>>274 レス、どうもです。RDBはexcelよりも本拠地です。といっても、msdos時代でのものですが。
>>260さんの 私の>>268 に対する >>269の返信を見て、
顧客の嗜好調査データとか、アマゾンのこの本を買った人はこんな本を買っていますの
小規模版データを想像してみました。
また、見た目はデータベースソフト、中身はexcelという体の業務用ソフトは結構作られており、
この方の会社の人も類似ソフトを見ての発想(excelであるなしを問わず)と妄想しました。
データ設計例?
100人のレコード、100のフィールドがあるとしてシート毎に異なるキーフィールド相当の位置づけをする。
求めるもの
2値(3値)間にどんな相関関係があるかが視覚的にもわかるように散布図に落とす。
この「求めるもの」=クエリが種々、エクセルで可能ということですね。
どの方法であれ、処理スピードと正確性確保、維持管理の容易さが善し悪しを決めることに
なりますよね。
277:デフォルトの名無しさん
08/12/28 13:15:14
>>275
---私が265氏と同等と考えるプログラム を
xp 2003でやってみたら、1列目1000個で完了、2列目が208個で
オートメーションエラー発生しました。
278:デフォルトの名無しさん
08/12/28 13:37:14
自分のパソはメモリーが小さいのでかも。260さんではありません。
試しにやってみたものです。
279:263
08/12/28 14:39:49
名前が1208個までしか付けられないのか
280:277
08/12/28 16:44:44
>>279
私のパソコンでは、
263のでは3000個出来ているが、275の---私が265氏と同等と考えるプログラム
では、一気に3000個出来ず、1208個しか出来なかったという意味です。
281:デフォルトの名無しさん
08/12/28 19:45:07
mixiでもチラシの裏でも良いから、どっか行って適当に試してくれ・・・。
誰が得するんだ?誰かが得するなら俺が出て行けば済む話だが。
282:デフォルトの名無しさん
08/12/28 20:22:28
?
283:デフォルトの名無しさん
08/12/29 06:36:24
ある程度、大きなシステム作ってみて気がついたけど似たようなコードを何度も書いてるんだよな
効率のいいコードを書くために必要な知識とか教えてくれないか。
284:デフォルトの名無しさん
08/12/29 08:22:46
>>283
そのシステムはExcelで作ったの?
285:デフォルトの名無しさん
08/12/29 08:29:17
>>283
サブルーチンなり関数なりに分けましょう。
286:デフォルトの名無しさん
08/12/29 10:25:34
>>284
うん、データはAccessに入れて、ほとんどの操作はExcelのユーザーフォームを使うような感じで
ワークシートは大雑把に全体を見るためにあってデータを追跡したり、試算ができたりするようなやつ
>>285
最初の頃、ほとんど直観でやってたから今になって無駄を省くために自分のレベルでできそうなところはやってる。
でもクラスモジュールで何ができるのかとかが気になる。
287:デフォルトの名無しさん
08/12/29 12:51:23
>>286
ユーザインタフェースのプログラムを何とかしたいということ?
288:デフォルトの名無しさん
08/12/29 13:11:23
>>287
まぁ、そういうことなのかな。
入力チェックとか、動作は同じだけど入るデータが違うとか結構あって。
コピペして改変しながら作ってたけど、完成してみるとコードがぐちゃぐちゃになってしまった。
運用は始めてて、今のところ作業者の不満は出てないけど将来的な拡張や保守のためにもう少し勉強したい。
289:デフォルトの名無しさん
08/12/29 14:19:59
>>288
UI部分はごちゃごちゃしてても仕方ないんじゃないの。
データさえしっかりしてたらいいよ。
290:デフォルトの名無しさん
08/12/29 15:09:44
>>288
誰もが一度は通る悩み。
モジュールの独立性をあげ過ぎても使い勝手悪くなるけど。
モジュール結合度とかでググってみるといいよ
291:デフォルトの名無しさん
08/12/29 18:53:44
100円 500円 250円
↓ マクロ発動
100円○ 500円 250円
もっとも小さい数字を選んでその数字の横に
○印をつけたいのですが
なかなかうまくいきません
どういった関数を使えばいいでしょう?
292:291
08/12/29 19:08:00
xp
2003
293:デフォルトの名無しさん
08/12/29 21:35:37
>>291さん
こんな感じでどうですか?
Sub mini()
Dim mymin
mymin = WorksheetFunction.Min(Range("a1:a3")) '対象データのの範囲
Cells(4, 1) = mymin & "円○"
End Sub
294:デフォルトの名無しさん
08/12/29 22:24:22
約4000のテキストファイルをそれぞれのワークシートにインポートしたいんだけど、
テキスト名が 1001.txt、1002.txt、1004.txt
といった具合に連番じゃないので、下のプログラムだと1003.txtが存在しないので
当然エラーが発生します。都合上、ファイルの名前を連番にすることはできないんです。
理想としては、存在しないファイル番号は無視して次のファイルをインポートするように
したいのですが、イイ案が浮かびません。。
このエラーを回避する手段はありますか?
環境はXPの2003です。
Sub Macro1()
Dim bng As Integer
For bng = 1001 To 9996
ActiveWorkbook.Worksheets.Add
With ActiveSheet.QueryTables.Add(Connection:= _
"TEXT;D:\Program Files\ootori\data\" & bng & ".txt", Destination:=Range("A1"))
.Name = "1001_1"
.FieldNames = True
~
中略(マクロの自動登録で書かれた部分)
~
End With
Next
End Sub
295:294
08/12/29 22:31:54
マジですいません。。事故解決ですorz
ググり直したら簡単に出てきやがった・・・
エラーを回避する便利なプログラムがあったのね
296:デフォルトの名無しさん
08/12/29 22:34:16
勘違いしてました
訂正です
Sub mini()
Dim mymin
Dim myjuni
Dim datasuu
myjuni = 1
datasuu = 3
mymin = WorksheetFunction.Min(Range("a1:a3")) '対象データの範囲
For i = 1 To datasuu - 1
If Cells(myjuni, 1) > Cells(i + 1, 1) Then
myjuni = i + 1
End If
Next i
Cells(myjuni, 1) = mymin & "円○"
End Sub
297:デフォルトの名無しさん
08/12/29 22:36:55
296は293の訂正です
298:デフォルトの名無しさん
08/12/29 22:43:48
VBAのステップ実行時に、ウォッチでRangeを見てみました。
すると色々あるわけですが、型情報の意味がさっぱり分かりませんでした。
この情報はどんなルールで何を表現しているのでしょうか?
たとえば
Variant/Double
だと、/の手前はVariantで、これは任意の型だと思うんです。だから/の後ろで、実際には今Doubleが入ってるよ、みたいな感じ?
でも、Variant/Object/Range見たいな奴もあるし。。
(これはVariantでObjectでその実態はRangeということかな?)
Worksheet/Sheet1なんていうのもあります。
(これはなんだろ??Sheet1ってのは型なんですかねぇ。ユーザがシートをガンガン追加したらSheet4,Sheet5...ってな感じで型が増える?)
299:デフォルトの名無しさん
08/12/29 23:19:00
ああ俺の作ったやつon error resume nextだらけだ、心配になってくるぜ。
300:デフォルトの名無しさん
08/12/29 23:48:10
別に、エラーをインラインで処理するのはおかしくない。
トラップすれば処理できているとは限らないのと一緒。
論理的破綻はどちらでも起こる。
301:296
08/12/30 00:08:18
>>291さんへ
たびたびすいません
こんなのありました
large関数
(指定された範囲データから大きい方から任意の数字番目を返す)
small関数
(指定された範囲データから小さい方から任意の数字番目を返す)
302:デフォルトの名無しさん
08/12/30 00:58:44
VBAで特定の文字列を検索して、その文字列が見つかったらオートシェイプ(msoShapeFlowchartAlternateProcess(角がRの四角)、透明)
をその文字の上に配置して、その文字を囲っているように見せたいと思っています。
そこで、文字列の幅を求め、その文字列が入っているセルの位置と、その文字列の幅から、
オートシェイプを配置すべき座標を計算することを考えています。
フォントは固定幅で考えております。
今、自分が分からないのは、
(1)文字の幅の単位(cmとかインチ?ピクセル??)
(2)文字列の長さをcmとかインチで正確に取得する方法
(関数?VC++でもこの手の問題にぶつかったことがあるけどそちらでは上手く取れなかった覚えがあります。VBAは高機能なので正確にゲットできると期待!)
(3)オートシェイプの座標系の単位(cmとかインチ?ピクセル??)
(4)文字列の長さの単位と、オートシェープの座標系の単位が違うのなら、それを変換してくれる関数あるいは公式
何方か教えていただけますですか?
(自分でも継続して調べます。)
よろしくお願いします。
303:デフォルトの名無しさん
08/12/30 04:13:54
シェイプの長さは
テキストのFont.Size掛ける文字数で
シェイプの位置は
セルの.Top .Leftで
目的のセルはFindと FindNextで
あとは細かい調整で
いいみたい
304:デフォルトの名無しさん
08/12/30 08:28:53
VBAでマクロの同時起動って出来ますか?タイマーを2つ並列に走らせたいのですが…
305:デフォルトの名無しさん
08/12/30 11:28:03
>>304
同時起動は多分出来ないけど、WindowsAPI使ってタスク複製するかスレッド使えば出来ると思う。
VBAではやり方は良くわからんのだけど、
"Excel VBAによるWin32 APIプログラミング入門"
この辺を見ればよいと思う。
タスク複製だのは結構癖があるからがんばって。
あと、どういうタイマーなのかわからんが、タイマ割り込みみたいに定期的に何かをやらせる場合、並列にすると旨く動かなくなる可能性があるので、きちんと実行時間を計測した方がいいよ。
306:302
08/12/30 17:09:11
>>303
ありがとうございます!!!
自分でも探したんですけどさっぱりその手の情報がなくて(;_;)
非常に助かりました。本当にありがとうございました!
307:304
08/12/30 18:30:26
≫305 ありがとうございます。教えて頂いた書籍を調べてみます。 タイマーと言っても、あるAタイマーが30~1にカウントダウン中に別のBタイマーを同時に走らせる、みたいな単純なモノです。実現可能でしょうか?
308:291
08/12/31 14:49:44
>>301
ありがとうごさいます
やってみます
309:デフォルトの名無しさん
08/12/31 22:39:19
Select Case…End SelectってC言語のswitch相当だと思うんですけど、breakって無いんですか?
Select Case exp
Case 0
IF xxx = FALSE THEN
Break ←これ!!!!
End IF
End Select
みたいな。
310:デフォルトの名無しさん
08/12/31 23:29:23
無い
311:デフォルトの名無しさん
09/01/01 00:31:04
>>309
そもそもbreakしてどこへ行くつもりだ
312:デフォルトの名無しさん
09/01/01 00:36:55
>>310
ありがと
>>311
Selectの外に決まってんじゃん。。。
313:デフォルトの名無しさん
09/01/01 00:41:39
>>312
それがしたいだけなら、どうにでもなるだろと小一時間…
314:デフォルトの名無しさん
09/01/01 00:41:51
仕方なくGotoだな
315:デフォルトの名無しさん
09/01/01 00:44:16
>>314
ちょ、おま、そんな最終手段をっ!
316:デフォルトの名無しさん
09/01/01 00:44:45
>>313
どうすんの?
317:デフォルトの名無しさん
09/01/01 00:46:24
>>316
Select Case exp
Case 0
IF xxx THEN
処理
End IF
End Select
318:デフォルトの名無しさん
09/01/01 00:48:24
抜ける方法を聞いてんの。
わざわざ論理を逆にして書けば良いじゃんとか
抜けた後にある処理をサブルーチンにしてあげれば良いじゃんとか
そういう構造を縛るしか手が無いんですか?それじゃ言語としてどうだろ
あとさぁ
なんで
if()
{
319:デフォルトの名無しさん
09/01/01 00:48:59
はあ~書いちゃった。。
じゃ、問題。何を書きたかったんでしょうか?
320:317
09/01/01 00:49:51
ちょっと説明不足かな
要するに、breakで外に出るのもスルーするのも同じ事じゃねーのって意味
Ifの条件がFalseの時にbreakしたいんなら、Ifの条件がTrueの時だけ処理すればいい
321:デフォルトの名無しさん
09/01/01 00:53:31
答え発表!
ヒューヒュー
あとさぁ
なんで
if()
{
}
else if()
{
}
else if()
{
}
…
みたいにELSE句にIFが書けないんだろう
欠陥だろ。。
でした。
>>320
そりゃかけなくは無いだろうけど構造上書きにくい場合もあるじゃん。
なんでキーワードやステートメントを再発明してまで、不便なってんの!マイクロソフト!!って思うじゃん。
322:デフォルトの名無しさん
09/01/01 00:53:35
go away
323:デフォルトの名無しさん
09/01/01 00:57:44
>>322
おや?外れたのかな?(^^)
勘がニブいんですねw
324:デフォルトの名無しさん
09/01/01 01:04:13
>>318
アホなのか・・・
325:デフォルトの名無しさん
09/01/01 01:06:26
> そりゃかけなくは無いだろうけど構造上書きにくい場合もあるじゃん。
ねーよ。
326:デフォルトの名無しさん
09/01/01 01:09:56
抜ける方法を聞いただけでこの荒れようww
VB厨はばかだなぁww
書き方を変えれば良いじゃんとか・・それは変えなきゃ対応できない言語ってことだろ。
高級言語でしょ?書き方縛ったらそこでもう言語としてだめでしょ。
アセンブラじゃないんだからさぁ。
IF THEN
ELSE
IF THEN
ELSE
IF THEN
ENDIF
ENDIF
ENDIF
うわっ。だっさ。最悪。
書き方変えればできますだったらjmpとかjzとかjnzとかjcとかだけでも出来るよww
327:デフォルトの名無しさん
09/01/01 01:14:31
>>321
If ... Then
ElseIf ... Then
ElseIf ... Then
End If
328:デフォルトの名無しさん
09/01/01 01:27:43
>>327
あ!ありがとうございます。
あったんだ。
329:デフォルトの名無しさん
09/01/01 01:48:45
>>328
意外と素直w
330:デフォルトの名無しさん
09/01/01 02:10:17
あんまり笑わせるなよ。
VB分かってないやつがVB馬鹿にしてたのかよ。orz
331:デフォルトの名無しさん
09/01/01 02:11:14
明らかに分かってないのに、構造構造言いたがるのなんて、
情報系の一年生くらいだろ。
332:デフォルトの名無しさん
09/01/01 02:21:16
>>330-331
ゴメンね(´・ω・`)
ついイライラしてたから
333:デフォルトの名無しさん
09/01/01 02:30:42
厨とか言っちゃうやつは例外なくアホ
334:デフォルトの名無しさん
09/01/01 13:53:37
結局、Excel2008ではVBAが使えなくなるのですか?
C#への布石ですか?
335:デフォルトの名無しさん
09/01/01 17:12:57
Excel 2008でVBAが使えないのは事実らしいが、
Excel 2008はMac版。移行先は、C#ではなくAppleScript。
しかも、次のバージョンで復活することが発表済み。
URLリンク(www.microsoft.com)
336:デフォルトの名無しさん
09/01/02 08:30:00
このスレは、Excel の VBE で作るフォームについての質問はスレ違い?
スレ違いでしたら誘導をお願いします。
337:263
09/01/02 09:22:34
>>336
もしかしてデザインの話か
そんな誘導先ないだろ
338:デフォルトの名無しさん
09/01/02 09:23:06
名前消し忘れた恥ずかしい
339:デフォルトの名無しさん
09/01/02 13:45:39
どうせなら、VSTA2.0の情報とかを書けばいいのに
>>334-335
340:デフォルトの名無しさん
09/01/02 14:03:27
あれ本当にOfficeに乗っけるの?
341:デフォルトの名無しさん
09/01/02 14:17:09
>>335
よく事情がわからんが、今必死で覚えてるEXCEL VBAが数年先に使えない、役に立たない言語になる可能性もあるってことですか?
342:デフォルトの名無しさん
09/01/02 15:03:36
そう言われ続けて何年も経つが、未だに無くなる気配すらないのがVBA。
この先もそれが続くと信じて安穏としているのは間違っているだろうが、
数年でなくなるような存在でもない。
343:デフォルトの名無しさん
09/01/02 16:48:02
Excel VBAによるWin32 APIプログラミング入門
この本って絶版でもう購入不可ですか?
344:デフォルトの名無しさん
09/01/02 16:58:06
絶版です
345:336
09/01/02 18:06:59
>>337
そうですか…了解です。
スレ違いを承知で 1 つだけ質問。
Excel のデザインで使うフォームのコントロールの仕様って VB6 と
同じなんですかね?
(コンボボックスでダブルクリックのイベントが起きないので調べたら、
VB6 ではスタイルに 1 を設定しないと起きない、とあったので…。
ちなみに Excel VBA ではスタイルに 0 or 2 しか設定不可。
ダブルクリックのイベント絶対起きないじゃん…。)
346:デフォルトの名無しさん
09/01/03 00:31:02
ダブルクリックのイベントが発生しない が意味不明
で、絶版かどうかも、役に立つかも、全く見当が付かないが、折れの持っている
「Excel VBA はじめてのプログラミングレッスン1」 技術評論社 H12.8.21初版
に第10章 入力画面を使ってみよう を読んでみたwww
ユーザーホームのデザインという用語が使われているが、この本では
ダブルクリックをする場面は、VBE上コンボボックスのことで、
excelシート上のコンボボックスではないよ。シート上ではダブルクリックは
使わないものと思っている。
347:デフォルトの名無しさん
09/01/03 00:58:20
>>346
セルのダブルクリックでセルの値等をコピーする、といったマクロも組むから
別にユーザフォーム専用って訳でもないと思うが
348:336
09/01/03 02:30:30
>>346
コンボボックスを使いたい場所はユーザーフォーム上で、
ワークシート上ではありません。
というかワークシート上にもコントロールを置けたんですね。
で、試してみると…コンボボックスのプルダウンメニュー表示中のダブルクリックで
ダブルクリックのイベントが発生しました。なんで?
目的はユーザーフォーム上にあるコンボボックスでダブルクリックのイベントを
取得することですが、無理そうなので、擬似的にダブルクリックを検知することにしました。
方法は下記です。
(1) マウスダウンのイベントが発生した時の時刻を Timer 関数で取得して
モジュール変数に退避する。
(2) マウスダウンのイベント発生都度、退避した時刻と押した時刻を比較する。
(3) (2)の時刻差が 0.5 秒以下の場合にダブルクリックのイベントでしたかった
処理を実行する。
コンボボックスでダブルクリックのイベントを拾った後の使い道は、
(1) True ⇔ False の切り替え(VBE のプロパティ設定画面では出来る!)
(2) コンボボックスより詳細なリストが表示できるフォームの呼び出し
を考えていました。
上記を応用すれば、トリプルクリックや4回クリックなどにも対応できそうです。
解答してくださった方、ありがとうございました。
349:デフォルトの名無しさん
09/01/03 03:55:36
トリプルクリックにまで対応できるのは素晴らしいけど
コンボボックスをシングルクリックで
透明なアイテムが一番上に(コンボ上に)きて、その
そのアイテムをシングルクリックってすると
じゃ駄目なのかな
350:デフォルトの名無しさん
09/01/03 04:52:18
URLリンク(www.amazon.co.jp)ユーザーのためのWin32-APIプログラミングガイド-大村-あつし/dp/4871936848/ref=sr_1_1?ie=UTF8&s=books&qid=1230925887&sr=1-1
351:デフォルトの名無しさん
09/01/03 04:53:58
オレのExcel、コンボボックスにダブルクリックイベント有るけど
みんなのには付いてないの?
バージョン Excel2003
352:デフォルトの名無しさん
09/01/03 06:03:46
たぶん
コンボボックスのプルダウンメニューの部分のダブルクリックを言っているんだと思う
353:デフォルトの名無しさん
09/01/03 13:26:28
オリジナリティ溢れるUIほど迷惑なものはない
354:デフォルトの名無しさん
09/01/03 16:11:29
>トリプルクリックや4回クリックなどにも
何考えてんだ?
355:デフォルトの名無しさん
09/01/03 16:20:56
V2C には6回クリックまであるぜ
356:デフォルトの名無しさん
09/01/03 17:11:00
API使えば、ダブルクリックの認識の間隔を取得できるから、
0.5秒決め打ちよりそれを使ったほうがいいと思う。
そういう話をしている場合でないとは思いつつ。
357:デフォルトの名無しさん
09/01/03 19:44:02
質問です。
セル上で、右クリックをすると、編集ダイアログ?が出てくるのを出ないようにしたいのですが
どう設定のマクロを書いたものか、よろしく。
右クリックイベントによってコピーモードにしているのに、余分な作業を
するのを防止したいので。
358:デフォルトの名無しさん
09/01/03 21:18:27
マウスの右ボタンを殺す
359:デフォルトの名無しさん
09/01/04 02:39:56
BeforeRightClickイベントの第二引数にCancelがあるだろ
360:デフォルトの名無しさん
09/01/04 13:15:18
サーバサイドでの帳票の生成にVBAを検討していて、
安定性、処理性能、MSのライセンス違反等を懸念してますが、
何か懸念事項やアドバイス等ありますでしょうか?
361:デフォルトの名無しさん
09/01/04 14:49:46
論理で「Aでないか、Bでないか、Cでない」ならの類なのですが、
列5 列6 列9なら、イベント処理し、「そうでないなら」、exitする の
「そうでないなら」はどう書いたものでしょうか?
362:デフォルトの名無しさん
09/01/04 15:11:17
>>361
色々あるだろうけど
普通は
if
elseif
elseif
else
363:デフォルトの名無しさん
09/01/04 15:18:49
>>357
ワークブックのSheetBeforeRightClickイベントでcancel=trueにしないとだめだよ
364:デフォルトの名無しさん
09/01/04 15:21:38
>>361
>>362だとイベント処理のコードが重複するから
If 列5 Or 列6 Or 列9 Then
イベント処理
Else
Exit
EndIf
365:デフォルトの名無しさん
09/01/04 23:41:35
まあOr使っちゃうのが一般的かつ簡単ではあるが
条件1つずつでネストした方が速い
何故なら、例えば列5に一致するならイベント処理は行うので
列6、列9に一致するか否かは判定する必要が無いのに
>>364では毎回全てを判定した上で論理演算してしまう
複数条件でAnd、Orを使わないのは、コード最適化の常套手段
逆に速度気にせず手を抜きたいなら、カンマ区切りで
複数条件指定できるSelect Case使う方がお手軽だろ
Case 列5, 列6, 列9
イベント処理
Case Else
Exit
因みに論理演算(>>364)の処理時間を100とするなら、Ifのネストは70、Select Caseは105くらいだ
とは言え最近のPCなら、ループで何十、何百、何千万回とやってコンマ何秒かの差が出る程度だけどな
366:デフォルトの名無しさん
09/01/04 23:56:00
あれ?
VBって or で連結させた場合、順次判定して、hitしたら後の判定スキップじゃなかったっけ。
勘違いだったらごめん。
367:デフォルトの名無しさん
09/01/05 00:00:55
ショートサーキットはしないよ
まあ,とりあえず素直に書いといて最適化は実際に支障が出てから,が基本だけど
368:デフォルトの名無しさん
09/01/05 12:09:49
>>365
Select Caseが105って一概には言えないだろ?
>Case 列5, 列6, 列9
これショートサーキットだから列5がTrueなら列6と列9は評価しないし。
>>366
ショートサーキットするのはVB.NetのOrElseとかAndAlso
今はVB.Netって言わないんdっけ?
369:デフォルトの名無しさん
09/01/05 13:14:41
>>368
Select Caseが105ってのは、実際にカウンタ変数のMod 10に対する
条件分岐のみのループの処理時間を計った結果
それぞれ500万回*3回の平均から算出した値
そもそもが単一条件の場合でも、Select CaseはIfより遅いからね
370:デフォルトの名無しさん
09/01/05 14:13:14
セル、グラフ、フォーム等の情報を利用してフォーム形成することはできますか?
例えば
名前 値 ラジオボタン
という行が連なるフォームを作る場合、
グラフの凡例数、セルの列数、フォームで入力した数分等、行が作成される感じにしたいのですが。
(フォームの大きさに入りきらない場合はスクロールバーを出す)
371:デフォルトの名無しさん
09/01/05 14:19:16
ユーザーフォーム上のコントロールを動的に生成したいってことなら出来るよ
372:デフォルトの名無しさん
09/01/05 14:22:53
>>371
調べ方が足りませんでした。すみません。 VBA 可変 フォームとかぐぐってました。
コントロール 動的 VBAでぐぐったらできそうな感じです。
ありがとうございました。
373:デフォルトの名無しさん
09/01/05 18:24:45
>>369
IfやELseIfのネストより遅いのは確かだが、Orより遅いわけねーって。
実測してみろよ。
Private Declare Function timeGetTime Lib "winmm.dll" () As Long
Sub foo1()
Dim i&, t1&, t2&
t1 = timeGetTime
For i = 1 To 5000000
Select Case i Mod 10
Case 5, 6, 9
Case Else
End Select
Next
t2 = timeGetTime
MsgBox t2 - t1
End Sub
Sub foo2()
Dim i&, j&, t1&, t2&
t1 = timeGetTime
For i = 1 To 5000000
j = i Mod 10
If j = 5 Or j = 6 Or j = 9 Then
Else
End If
Next
t2 = timeGetTime
MsgBox t2 - t1
End Sub
foo1がショートサーキットだって知らなかったんじゃないの?
なんなら実証してみせるが、やり方くらい知ってるよな。
374:デフォルトの名無しさん
09/01/05 19:51:47
>>373
・timeGetTimeではなく組込のTimerを使ったこと
・Select Caseでも平等にするためにi Mod 10の結果を変数に取っていること
・結果をMsgBoxではなくDebug.Printで出力したこと
以外は同じコードだよ
ちなみに実証方法は知ってる
Select Caseがカンマ区切りがショートサーキットなのは知ってるからわざわざ
Select Caseでやったことは無いが、デバッグの一手法でもあるからな
375:373
09/01/05 21:26:44
>>374
i Mod 10の値を処理で使わないんなら>>373が平等なコード。
仮にfoo1でi Mod 10を変数にとってもfoo1が速いぞ?
おめーんとこじゃ遅いのか?
376:デフォルトの名無しさん
09/01/05 21:35:16
> i Mod 10の値を処理で使わないんなら>>373が平等なコード。
そうでもない
> おめーんとこじゃ遅いのか?
うん
377:373
09/01/05 21:40:10
OrもSelect Caseもお互いに速さでベストをつくせばそうなるじゃん。
おまえは最速のコード書けないんだろ?
378:373
09/01/05 21:41:57
後ろは読んでなかったが、おれのとこと逆になるらしいな。
俺のとこはSelect Caseが速い。
379:デフォルトの名無しさん
09/01/05 22:00:24
実際の処理に置いて必ずModで算出した値を使うというわけではない以上
条件分岐のステートメントに入る前の時点で、条件となる値が変数に代入されているという
同じ状況を作ることが平等になる
Modを使う場合に限定して、IfとSelect Caseのどちらを使った方が速いかを検証するなら、
君の言うとおりベストを尽くして最速コードを書くべきだけどね
380:デフォルトの名無しさん
09/01/05 22:12:28
なんか分かってないなぁ。
Modで算出した値を使わないなら>>373になるんだよ。
まぁどこまで行っても平行線だからもういいが、他のやつらはどっちが速いんだろ?
まぁ速さなんて俺はどっちでもいいけどな。
このような使い方なら普通の美意識を持ってたらSelect Caseだし。
381:デフォルトの名無しさん
09/01/05 22:19:50
>>380
foo1が速かった
382:デフォルトの名無しさん
09/01/05 22:24:07
>>381
トンクス
j = i Mod 10
Select Case j
としても?
おれのとこはそれでもfoo1が速いが。
383:デフォルトの名無しさん
09/01/05 22:26:51
>>382
逆転した
384:デフォルトの名無しさん
09/01/05 22:31:23
>>383
ふーん、俺のとこと違うな。
まさかjを変数宣言してないとかじゃないよな?
385:デフォルトの名無しさん
09/01/05 22:33:56
>>384
してなかった
したら差は縮まったけどまだ
foo2が速い
386:デフォルトの名無しさん
09/01/05 22:35:45
>>385
おいおい、しっかりしてくれよ。
jをLong型で宣言したらそうなるか教えてくれ。
387:デフォルトの名無しさん
09/01/05 22:36:45
すまん、また後ろ読んでなかった。
388:デフォルトの名無しさん
09/01/05 22:41:46
>>386
&で宣言したよ
30位foo2が速い
389:デフォルトの名無しさん
09/01/05 22:42:49
まぁModで算出した値を使わないなら>>373が平等な比較だが、とりあえず変数に代入したら
人によっては違うということは分かった。
ちなみに俺はWindows xp とExcel2007だ。
390:デフォルトの名無しさん
09/01/05 22:44:22
ちなみに
Excel2002です
391:デフォルトの名無しさん
09/01/05 22:47:06
>>390
トンクス。
392:361
09/01/05 23:18:31
>論理で「Aでないか、Bでないか、Cでない」ならの類なのですが、
>列5 列6 列9なら、イベント処理し、「そうでないなら」、exitする の
>「そうでないなら」はどう書いたものでしょうか?
訊き方が悪かったみたいですね。結局、次のこれで、希望する動きをしています。
If Not (Target.Column = 5) And Not (Target.Column = 6) And Not (Target.Column = 9) Then Exit Sub
393:デフォルトの名無しさん
09/01/06 00:21:36
文章だけだと伝わりづらいと思いますが、質問です。
ハイパーリンク │ 転記情報1
ハイパーリンク │ 転記情報2
EXCELシートの一覧表に上のようにハイパーリンクが張られた一列を作り、
それをWEBブラウザでプレビューできるようにしています。
WEBブラウザ上のリンクをクリックすると、
新しくEXCELシートを呼び出し、
クリックした行の情報(一番上のハイパーリンクをクリックしたなら転記情報1)を
呼び出したシートに転記する処理を作りたいと思っています。
EXCELシートならリンクをクリックすると同時にそのセルがアクティブになるので同行の情報も簡単に転記できそうですが、
WEBブラウザ上でもこれと同じような情報転記は可能でしょうか?
394:デフォルトの名無しさん
09/01/06 03:38:21
>>392
背中がムズムズする……
395:デフォルトの名無しさん
09/01/06 05:39:55
>>394
気持ちは解る
条件式にnotと=を併用するヤツってもうね…
396:デフォルトの名無しさん
09/01/06 07:33:05
<>
397:デフォルトの名無しさん
09/01/06 09:47:49
>>392
「Aでないか、Bでないか、Cでない」ではなく「Aでもなく、Bでもなく、Cでもない」だろ?
前者だと必ずTrueだからな。
それは置いといて、普通イベント処理ならIntersect使うから列番号では判定しないが、どうしても列番号で判定したいとか基本のお勉強なら
Select Case Trget.Column
Case 5, 6, 9
'処理1
Case Else
Exit Sub
End Select
’処理2
処理2がなければ、何もわざわざCase Elseで抜ける必要なし。
というか抜ける記述は普通はしない。
398:デフォルトの名無しさん
09/01/06 09:49:54
何、今更?
399:デフォルトの名無しさん
09/01/06 09:59:59
>>392
書き忘れたがTarget.Columnを三度も取得しちゃいかん。
どうしてもAndとかOrを使うんなら、いったん変数に取得してから判定するんだな。
400:デフォルトの名無しさん
09/01/06 10:02:35
>>398
昨晩のアフォの>>365か?
無視してすまんね。
401:デフォルトの名無しさん
09/01/06 10:29:05
悔しかったの?
402:デフォルトの名無しさん
09/01/06 10:30:29
シートに商品名が20,000件程度入力されている状態で
テキストボックスに商品名の一部を入力⇒キーワードが含まれるセルのデータを
リストボックスに追加 という処理を考えていたのですが
下記の方法で試してみるとかなり時間がかかってしまいます
高速に処理をさせるには根本的な方法の見直しが必要でしょうか?
dSelectForm.ListBox1.Clear
LastRow = Sheet1.Range("C65536").End(xlUp).Row
For i = 2 to LastRow
Ans = 0
Ans = WorksheetFunction.Find(inputKey, Sheet1.Cells(i, 3))
If Ans <> 0 Then
dSelectForm.ListBox1.AddItem Sheet1.Cells(i, 3)
End If
Next
403:デフォルトの名無しさん
09/01/06 10:59:47
相変わらずの人がいるなw
404:デフォルトの名無しさん
09/01/06 11:20:39
>>402
ループのお勉強なら基本的には配列の勉強かな?
データ範囲を2次元配列に取得して回すとか、AddItemは遅いから1次元配列にため込んでListプロパティで設定するとか。
WorksheetFunction.FindじゃなくInStr使うとか。
たしかExcel2000以降ならFilter関数が簡単。
WorksheetFunction.Transpose(範囲)で1次元配列を取得して、Filter関数にかけてからListプロパティで設定。
405:デフォルトの名無しさん
09/01/06 16:29:31
イベント処理だし元の質問からも判断してわざわざExitで抜けるようなコードは必要ないと思う。
条件に「合う」場合だけ判定して処理するように書くのが普通だね。
定番はIfだけど質問者のレベルから考えてコンマ何秒の速度差を考える必要はないと思うし
見た目のわかりやすさと保守のしやすさからCaseをすすめとく。
条件が増えたときに簡単に数字が追加できるから。
406:デフォルトの名無しさん
09/01/07 01:50:36
2008年1月2日を08.01.02と表記してるセルを計算に使う方法ってありますか?
08.01.02と表記されたセルから08.01.01と表記されたセルを引くと1という答えが算出される処理を作りたいです。
407:デフォルトの名無しさん
09/01/07 03:34:54
>>406
セルの表示形式で「yy.mm.dd」
408:デフォルトの名無しさん
09/01/07 05:57:34
>>405
俺は誰かみたいに「何、今更?」なんて言わんが、そのような条件が三つ以上でIfステートメントでOr判定するくらいなら
Select Caseステートメントの方が速いし分かりやすいし定番だと思うよ。
あと知らなくていいことだが、Select CaseステートメントでCase Elseとか、If ThenステートメントでElseとかは
何もそこで処理しなくても書いた方が速くなるね。
まぁ俺は書かないけど。
409:デフォルトの名無しさん
09/01/07 06:18:38
>>406
数式でよけれべ普通に=A1-B1なんてやりゃできる。
もし表示形式が日付形式になるようなら、G/標準とか0にすりゃいい。
2007では計算元の表示形式が日付でも普通に1になるが、たしか2003では数式セルは日付にならなかったっけ?
計算元の表示形式が文字列で、VBAでやりたいのなら
MsgBox CDate(Cells(1,1).Value)-CDate(Cells(1,2).Value)
MsgBox DateValue(Cells(1,1).Value)-DateValue(Cells(1,2).Value)
などとやりゃできないか?
410:デフォルトの名無しさん
09/01/07 07:26:12
if not hoge is nothing then
って構文が気持ち悪いんですけど、何か代替えはありませんか?
411:デフォルトの名無しさん
09/01/07 07:53:25
そんなこといったらVBAなんて気持ち悪い構文だらけですが何か?
412:デフォルトの名無しさん
09/01/07 08:23:23
「代替え」なんて変な言葉を使う人に言われたくありません。
もしかして、「代替」を「だいがえ」って読んじゃう頭の弱い人やそれらに無意識に迎合しちゃう人ですか?
413:デフォルトの名無しさん
09/01/07 08:34:53
>>410
If ObjPtr(hoge) <> 0 thenでよくね?
俺はこんなことしないけどね。
414:デフォルトの名無しさん
09/01/07 10:38:45
それならもっとシンプルにできる
If ObjPtr(hoge) Then
こういう書き方を知らないと意味がわからなくなるけど
415:デフォルトの名無しさん
09/01/07 12:12:25
>>412
URLリンク(dictionary.goo.ne.jp)
416:デフォルトの名無しさん
09/01/07 12:25:38
not ~ nothingは俺も気持ち悪いと思う
直訳すると「ないアルよ」みたいな回りくどい二重否定の表現って
英語だと普通に出てくるから設計者は何の疑問も持たなかったんだろうなあ
俺もまだVBAを勉強中だから知らないだけかもしれないけど、
インスタンス化されてることを、いちいち論理を反転しなくても直接判定できるような
構文か関数ってないの?自分で作るしかない?
417:デフォルトの名無しさん
09/01/07 16:19:22
別にこの仕様でおかしくもないと思うけどねぇ
そもそもがNothingのときに何かをするってことの方が多いんだからさ
有ることと無いこと、両方とも否定文を使わずに判定出来るのが一番かもしれないが
どちらかのみと言うなら、無いことを判定する方法を用意すべきだろ
418:デフォルトの名無しさん
09/01/07 17:08:30
if hoge is not nothingと書けるのが一番良い
419:デフォルトの名無しさん
09/01/07 17:21:50
余計変だw
420:デフォルトの名無しさん
09/01/07 18:39:23
>>415
変な言葉が定着しつつあることはその引用で判るが、それで何が言いたいの?
# 頭使うことを知らない人は、自分で考えることを放棄するから困る。
421:デフォルトの名無しさん
09/01/07 18:42:58
いっそのこと
If hoge = Nothing
If hoge <> Nothing
でいいじゃん。
なんだよ突然Isって。わざわざ演算子を使い分ける妙なこだわりが理解できん。桂正和マニアかよ。
422:デフォルトの名無しさん
09/01/07 19:10:25
代替~(ダイタイ~)
の同音異義語が有る場合などに
代替え~(ダイガエ~)
と重箱読み使うのは昔からあること
変な言葉でもなければ、最近になって定着しつつあるのではなく以前からあったもの
件の場合は重箱読み使うのが適切と言える状況ではないが、誤用や間違いではない
"代替"の意味で"代変え"を使っているなら完全な誤用だけどね
そもそも、言葉というのは変化していくもの
最近になって定着しつつあるのだとしても、それを頭ごなしに否定するのは愚かしい
頭使うことを知らない人は、誤用と変化の違いを見極めることなく
自分の中の古い知識だけで物事を断定しがちだが、もっと柔軟な頭と広い視野を持たないと困るよ
423:デフォルトの名無しさん
09/01/07 19:32:33
AndAlsoやOrElseってVBAには無いんだったっけ?
424:デフォルトの名無しさん
09/01/07 19:50:59
>>412
いや、”だいがえ”が正しいんじゃないかな。
もしかして”だいがい”って呼んでるの?
425:デフォルトの名無しさん
09/01/07 19:54:09
CやJavaが長年培ってきた洗練された構文をかなぐり捨ててVBはいったいなにがしたかったのだろう。
なぜ}のかわりにEndと入力しないといけないのか理解に苦しむ。
見やすくない上に3文字も打たないといけない。ばっかじゃないか?
426:デフォルトの名無しさん
09/01/07 19:55:49
馬鹿発見。「だいたい」と読むのだよ。つーか、>422に書いてあるだろ。
427:デフォルトの名無しさん
09/01/07 19:56:12
いやいや、オリジナルのBASICはCより古いぞ。
その古臭い構文をVBも引きずっているというだけ。
だからこそBasicを名乗っているわけだが。
428:デフォルトの名無しさん
09/01/07 19:56:28
>>425
CやJavaとbasicはどっちが古いと思っているのかね。
429:デフォルトの名無しさん
09/01/07 20:00:04
オリジナルのベーシックと今のVBはかなり違うじゃん。
古いベーシックから新しいVBになるにあたって
CやJavaで解決されている構文を見習えばよかったのだ。
430:デフォルトの名無しさん
09/01/07 20:00:56
C#でも使ってろ。
431:デフォルトの名無しさん
09/01/07 20:05:32
>>430
エクセルのマクロでC#って使えるの?
432:デフォルトの名無しさん
09/01/07 20:06:30
それよりなんでキーワードの先頭は大文字なんだろう
目がチカチカする
小文字ならまだメリハリが出て読みやすいと思う
433:デフォルトの名無しさん
09/01/07 20:12:55
エクセルのセルに入っている文字列の特定の文字の上にオートシェイプを置きたいって質問した人です。
質問させてください。
エクセルの現在のフォントでの文字列の幅を取得するには、
1.HWNDをNULLでデバイスコンテキストを取得する。
2.コンパチブルなDCをつくり、フォントをエクセルのフォントと同じものをセレクト。
3.GetTextExtentPoint32を呼び出して論理単位で文字列幅を得る。
4.(モードがMM_TEXTだと仮定して)ピクセルなので、ポイントに変換する。
(DPIはGetDeviceCapで取得)
5.エクセルのシートのズームが80%なら0.8をかける
であっていますか?
434:デフォルトの名無しさん
09/01/07 20:22:18
>>429
VBが登場した頃は、まだパソコン用の高級言語の人気が
CとPascal(これはBegin~Endって書く言語)で2分していて、
C系の構文が良いという評価が固まっていなかったのだと思う。
>>432
VB登場の少し時代は全部大文字だったから、そこからは進歩したと言えると思う。
435:デフォルトの名無しさん
09/01/07 20:27:07
変わったと言うより大幅に拡張されてるね。
根っこの部分はN-BASICの時代から変わってないから
昔覚えた変なテクニックが意外とそのまま使えたりするんだよな。
このあたりN-BASICやN88-BASICの記憶がないとなかなか同意してもらえないと思う。
例えばこんなNextの書き方、VBから始めた人は知らないんじゃないかな。
For i = 1 To 10
For j = 1 To 10
(処理)
Next j, i
436:デフォルトの名無しさん
09/01/07 20:31:28
>>435
あったなぁ・・
そうだ、For文みて思い出したけど、VBは1からカウントするのが好きくね?
配列とか。あれキモイ。
まともな人間なら数字は0からカウントするものだ。
という言葉を思い出した。
437:デフォルトの名無しさん
09/01/07 20:36:44
fortranなんかは1からだろ
数学も1から
C系で0ベースなのはメモリの配置とか低レベルな理由
438:デフォルトの名無しさん
09/01/07 20:38:03
>>436
配列はN-BASICもVBも0からだろ。
439:433
09/01/07 20:39:17
あのー。少しは私のことも思い出してあげてください。。(^^;)
440:デフォルトの名無しさん
09/01/07 20:40:30
>>439
修飾(ボールドとかイタリックとか)も考慮しないとずれるよ
441:デフォルトの名無しさん
09/01/07 20:43:21
>>440
嗚呼~。ほんとだ。そうですよね。。
あ、433のやり方で大筋はOKで、かつ、ボールドも考慮みたいな感じでしょうか?
442:デフォルトの名無しさん
09/01/07 21:25:06
>>407>>409
表示形式色々変えたんですけど、
Msgboxで表示しても0だし、EXCELのセル上に表記しても#VALUEになります。
なんでなのでしょう。
EXCELのバージョンは2000です。
443:デフォルトの名無しさん
09/01/07 21:27:33
>>441
細かいことを言えば、Excelは同じセル内でも1文字ごとにフォントを変更できる。
すべてに対応するのはけっこうめんどくさそう。
444:デフォルトの名無しさん
09/01/07 21:28:40
>>442
元の日付けデータがシリアル値になってないんでねーの?
445:デフォルトの名無しさん
09/01/07 21:31:48
>>443
そういやそうですね。ちょっとそこらへんも含めて作ってみます。
446:デフォルトの名無しさん
09/01/07 21:50:11
VBAっていつ無くなるんだっけ?次のバージョンから?
447:デフォルトの名無しさん
09/01/07 21:55:32
>>444
そもそも08.02.01のような表記をシリアル値にする方法がわからないのですが。
=DATEVALUE("08.02.01")
みたいに表記してもVALUEになるだけですし。
448:デフォルトの名無しさん
09/01/07 22:01:53
>>447
VBA関係ないよな
=DATEVALUE(SUBSTITUTE("08.02.01",".","/"))
次に何かわからないことがあったら総合相談所行ったら?
449:デフォルトの名無しさん
09/01/07 22:03:37
>>446
Mac版の2008ではなくなったけど、その次でまた復活する予定。
Win版はなくならない。
450:デフォルトの名無しさん
09/01/07 22:18:53
>>449
サンクス
本職はC++だけどVBA使えると経理の女の子から結構重宝されるので助かる
451:デフォルトの名無しさん
09/01/07 23:29:12
てか、事務職でVBAって何に使うんだよw
452:デフォルトの名無しさん
09/01/07 23:49:34
1行目が項目名で、2行目から201行目までデータが入っています。
オートフィルター後のA列のデータを取得したい。
どんなマクロになりますか?
453:デフォルトの名無しさん
09/01/08 00:20:50
うぇー Workbook.Save False すると Wrokbook_Before_Close動かん
454:デフォルトの名無しさん
09/01/08 00:29:40
>>452
オートフィルタの実行はAutoFilterメソッド
結果を配列として取り出すのはCurrentRegion.SpecialCellsメソッド
>>451
単純作業をVBAで自動化してやるとけっこう喜ばれるよ
毎日在庫を確認して発注伝票を印刷してFaxで送信するとか
中小だとアバウトな部分が多くて完全な自動化は難しいから
できるところだけやる
455:デフォルトの名無しさん
09/01/08 00:35:23
>>451
どんだけ想像力ねぇの?
456:デフォルトの名無しさん
09/01/08 00:35:29
下記のような感じで、セルに他のセルを参照した値を入力したいのですが、
下記の入力方法だと、絶対参照になってしまいます。
相対参照にする指定方法をご存じないでしょうか?
Cells(i + 1, 9).Value = "=" & Cells(i, 9).Address & "+" & Cells(i + 1, 6).Address
457:デフォルトの名無しさん
09/01/08 00:43:52
>>451
Officeって言うくらいだから・・・
458:デフォルトの名無しさん
09/01/08 00:53:51
>>456
Cells(i, 9).Address(False, False)
459:デフォルトの名無しさん
09/01/08 01:14:30
OS:WinXP
Ver:Office2000
以下のマクロが意図したとおりに動きません。
aの値によってaddstに入力した値に異なる係数をかけた値を作りたいのですが、
係数をかけたはずのaddをセルに入力してみるとゼロになっています。
参考文献にはCaseの後はコンマで区切って複数条件を入れれるとありますが、
それはできないのでしょうか。。
なおプログラム自体は上記係数を無視する他は問題なく動いています。
Dim a As Integer
(中略:aはFor構文で1から18まで増える)
Dim addstd As Double
Dim add As Double
addstd = 0.3
Select Case a
Case 3, 4, 8, 11, 13, 18
add = addstd
Range("A5").Value = add
Case 2, 6, 7, 10, 15, 17
add = addstd / 2
Range("A5").Value = add
Case 1, 5, 9, 12, 14, 16
add = addstd / 3
Range("A5").Value = add
End Select
460:デフォルトの名無しさん
09/01/08 01:22:28
>>458
ありがとう
461:デフォルトの名無しさん
09/01/08 01:49:40
>>459
表示形式
462:デフォルトの名無しさん
09/01/08 02:57:09
ウォッチやDebug.Printで値を見るくらいは自分でやれよ
ほんと、VBA使いって問題起こるとそこで思考停止してしまい
試行錯誤することが出来ない奴が多いよな
エラー出たらそこで終わりってなら機械と同じだぜ
処理速度では機械に敵わないんだから機械以下とも言える
463:デフォルトの名無しさん
09/01/08 06:24:19
多いって何人だよ
464:459
09/01/08 08:48:02
ありがとうございます。ググってみました。
もしかすると、これに近い問題でしょうか。
URLリンク(questionbox.jp.msn.com)
また、デバッグ方法もありがとうございました。
VBAというか、プログラミング的なものを初めて2日目なもので、まだよく使い方がわかっていませんでした。
今から会社に行っていろいろ試してみようと思います!
465:デフォルトの名無しさん
09/01/08 09:05:06
>>459
計算自体はできてるようなので
書式設定の少数点以下の桁数が0になってるんじゃ?
466:デフォルトの名無しさん
09/01/08 09:52:07
非アクティブシートの選択セルを操作する事は可能ですか?
467:デフォルトの名無しさん
09/01/08 10:48:21
無理
468:デフォルトの名無しさん
09/01/08 15:28:00
VBAを作成してもらいたいのですが
もし作成していただけるようでしたらメールをお願いします。
1つの縦列から文字や数字を抽出し、横行書き出す作業を繰り返すマクロの作成をお願いしたいです。
469:468
09/01/08 15:30:04
メール入力し忘れてました(´A`)
470:デフォルトの名無しさん
09/01/08 19:05:09
幾ら出すの?
471:デフォルトの名無しさん
09/01/08 19:42:27
カラダで良かったら...
472:デフォルトの名無しさん
09/01/08 20:41:14
>>468
形式を選択して貼り付け→行列を入れ換える
473:デフォルトの名無しさん
09/01/08 23:45:40
EXCELのWebブラウザでプレビューの機能を使って作ったブラウザをVBAで閉じるにはどうしたらいいんですか?
474:デフォルトの名無しさん
09/01/09 00:43:19
Webbrowser.Fuck
475:デフォルトの名無しさん
09/01/09 00:44:26
OS:XP
Version:2003
取得したデータをセルに表示させる処理を作ったのですが
少し処理速度が遅いので、配列を使って処理しようと思っています。
その際、特定データに対してセルの色付けを行っているのですが
配列を使って最後にRangeオブジェクトで貼り付ける場合、どのタイミングで
セルに色付けするのがいいんでしょうか?
配列に入れる処理中に色付けをするぐらいしか思い浮かばないのですが
どなたか知恵を貸して下さい
476:デフォルトの名無しさん
09/01/09 00:50:04
> 配列に入れる処理中に色付けをする
それでいいじゃん、何か問題有るの?
477:デフォルトの名無しさん
09/01/09 03:10:36
>>473
穴だらけのコードだけど、とりあえず…
環境依存かもしれない
Option Explicit
Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Const GW_HWNDLAST = 1
Public Const GW_HWNDNEXT = 2
Public Const WM_CLOSE = &H10
Public Const ml = 255
Dim wh1 As Long
' コールバック関数
Public Function EnumWindowsProc(ByVal Handle As Long, ByVal lParam As Object) As Long
Dim strClassName As String * ml
Dim strCaption As String * ml
GetClassName Handle, strClassName, ml ' クラス名取得
GetWindowText Handle, strCaption, ml ' キャプション取得
If Left(strClassName, 7) = "IEFrame" And Mid(strCaption, 4, 22) = "Documents and Settings" Then wh1 = Handle
EnumWindowsProc = True
End Function
Private Sub test1() '「ブラウザでプレビュー」を閉じる
wh1 = 0
Dim Ret As Long
Ret = EnumWindows(AddressOf EnumWindowsProc, ByVal 0&)
If wh1 <> 0 Then Call PostMessage(wh1, WM_CLOSE, 0, 0)
End Sub