Excel VBA質問スレ Pa ..
73:デフォルトの名無しさん
08/12/16 00:01:40
仕様です。
おとなしくFlashの勉強するのが吉。
74:72
08/12/16 04:33:53
>>73
レスありがとうございます。
仕様ですか…Excelの描写速度が遅いことは知っています。
しかし、ゲームプログラマーの方々もいらっしゃいますし、自分に否があるように思えてなりません。
コードの書き方に問題がある、ということは考えられませんか?コードは現在700行程です。
自信はありませんが、Sleepが問題な気がします。どうでしょうか。
75:デフォルトの名無しさん
08/12/16 04:41:10
「否」でなく「非」でした
76:デフォルトの名無しさん
08/12/16 06:08:43
だったらコードを晒したら?
それができないなら自分で勝手に調べて答えを出せばいいよ。
77:デフォルトの名無しさん
08/12/16 10:00:26
データ型について質問です。
エクセルのセルに勤務時間が入っており、これをvbaで計算しているのですが
時間の時も日付型(DATE)の方が良いのでしょうか?
それともSingleやDoubleでしょうか?
VBAの勉強も兼ねてやってますので、関数でやれという回答はご容赦下さい・・
78:デフォルトの名無しさん
08/12/16 12:24:26
>>76
やっぱり、コード見ないとどうしようもないですよね…
お騒がせしました
79:デフォルトの名無しさん
08/12/16 13:09:50
そりゃぁ、Sleepが問題だなんて認識している香具師とまともに会話が成立するとは思えないもんねぇ。
80:デフォルトの名無しさん
08/12/16 13:10:45
>>77
勉強を兼ねているんだろ。全部やれ。
81:デフォルトの名無しさん
08/12/16 13:15:49
>>80
試してみてどちらでもできるということは確認済みなんです
でも一般的に、どちらがベターなのかなと思いまして
82:デフォルトの名無しさん
08/12/16 13:27:29
一般的には、シート関数だな。
83:デフォルトの名無しさん
08/12/16 15:03:10
>>79
Sleep関数は問題無いんですね?ありがとうございます!安心しました
Sleepが使えないとなると凄く面倒になるので…
以前に原因を調べていたところ、Sleep関数の欠点(?)を綴ったページを見つけ、
その内容を見て勝手にSleepが原因だと解釈してしまったみたいです。
自己解決出来るよう、もう少し頑張ってみます
84:デフォルトの名無しさん
08/12/16 15:42:22
エクセルでVBAを使ってじゃんけんゲームを作れと言われたのですがわかりません
教えてください
85:デフォルトの名無しさん
08/12/16 15:50:10
宿題丸投げはご遠慮ください。
VBAでなくてもできることの質問は、VBスレ辺りでどうぞ。
86:デフォルトの名無しさん
08/12/16 21:46:59
VBスレでも宿題はお断りだw
87:デフォルトの名無しさん
08/12/16 23:12:04
V=チョキ
B=グー
A=パー
としてじゃんけんを楽しんでください。
88:デフォルトの名無しさん
08/12/17 07:58:32
意地悪なやつらだな。
逆に考えろよ。VBAなんて宿題かゲームくらいにしか使わないだろ。
おまえらのご自慢のテクニックを披露できるチャンスだぞ。
89:デフォルトの名無しさん
08/12/17 09:42:52
と学生が申しております
仕事で使うわアホ
90:デフォルトの名無しさん
08/12/17 11:06:52
>>89
VBAがまともに使えない上に仕事したことないやつが若気の至りってやつで書き込んだんだろう
あまり責めてやるなよw
91:デフォルトの名無しさん
08/12/17 12:55:10
>>89>>90
どんなことに使ってるの?
92:デフォルトの名無しさん
08/12/17 13:49:36
ルーチンワークは大体そう
他は資料をデータベースっぽく正規化するために使うことも
・・まぁ、大企業ならこんなことしなくても既にシステムは完成されてるんだけどね
93:デフォルトの名無しさん
08/12/17 13:51:22
SAPのBWなんかはExcelマクロ
94:デフォルトの名無しさん
08/12/17 13:57:12
オフコンからデータ(CSVとか)受け取って
帳票(見積書とか)の形に整えて印刷とか
95:デフォルトの名無しさん
08/12/17 18:51:26
WindowsXP、Excel2002ユーザの質問です。
現在VBAマクロ内で、OSのXP/Vistaの違いを問わず、 インストールされているFirefox 3.0.xの
実行ファイルのフルパスを取得しようとしています。Firefox3が
・標準のフォルダ以外にインストールしている可能性がある
・HTML、HTTP等に関連付けられている
・デフォルトブラウザに指定されている
という状態で使われているとき、マクロ上で何をすればスマートにフルパスが得られるでしょうか?
検索すると、既存ファイルを利用する方法、レジストリの関連付けを参照する方法がありますが、
他の方法は無いでしょうか?
参考になる情報をご存知の方、教えてください。
96:デフォルトの名無しさん
08/12/17 19:27:43
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\firefox. exe]
97:デフォルトの名無しさん
08/12/18 01:52:45
問屋でデータ処理に未知のオフコン使ってて、送られてくる売り上げデータのフォーマットが変態的なんで
VBAで整形&正規化してる。なんか>>94とよく似た境遇だな。おまけに受け渡しはいまだにフロッピーディスク。
社内でデータベース処理してるマシンも松下製の見たことない機種だったなあ。
こっちはなんとPC-9821が専用ケーブルでつながってて、N88-BASICで書かれた端末ソフトが走ってる。
中小企業でコンピューターの知識がないと、メーカーの営業の言うがままにシステム構築して
記憶媒体から何から何まで汎用性ゼロのシステムで囲い込まれてにっちもさっちもいかないことが多い希ガス。
98:デフォルトの名無しさん
08/12/18 10:56:24
何年前に作ったシステムだよ?
99:デフォルトの名無しさん
08/12/18 11:40:21
wikiによるとPC-9821が入ったのは早くても15年位前らしいな
パソコンで動くエミュレーターがあるにもかかわらず
いまだにバカ端が業務で現役ってところもあるしそんなに珍しくもないんじゃね?
まぁスレ違いだしこの辺で流れ斬ろうか・・・
100:デフォルトの名無しさん
08/12/18 13:42:45
ダム端って言うんだよ
101:sage
08/12/18 15:09:13
いまユーザーフォームを利用してモグラたたきを作っているのですが
じかんをカウントダウンさせるプログラムとモグラの動きのプログラムが
うまく作用せず、モグラの動きのプログラムが終了すると
再びカウントダウンするようになってしまいます。両方とも独立して動くように
したいのですがよい方法はありませんか。
102:sage
08/12/18 15:11:29
ソースです
スタートボタンを押すと時間のカウントダウンを開始
Private Sub CommandButton1_Click()
starttime1 = 2
starttime2 = 0
startflag = 1 'ゲーム開始用フラグ
Do While starttime1 >= 0
keika = Timer + 1
Do While keika > Timer
Loop
starttime2 = starttime2 - 1
If starttime2 < 0 Then
starttime2 = 59
starttime1 = starttime1 - 1
End If
If starttime1 < 0 Then
MsgBox "TIME UP!" '時間が過ぎたら
Exit Do
End If
Label4 = starttime1 & ":" & starttime2 'ラベルに時間のカウントダウンを表示
DoEvents
Loop
End Sub
103:sage
08/12/18 15:18:27
ソースの続き
Private Sub back1_Click() back1はイメージオブジェクトです
If startflag = 1 Then
Call moguratataki
End If
End Sub
コマンドボタンを押したら時間のカウントダウンとゲームの開始したいと
思っていますがそれもまだ分からないので調べ中です。
call命令で、もぐらたたきゲームが始まるような感じで作りたいと思っています。
104:sage
08/12/18 15:22:58
ソースの続き2
Sub moguratataki()
Randomize
kyarass = 15
stsuu = Int((3 * Rnd) + 1)
hozon(0) = stsuu
hozon(1) = stsuu
a = 0
Do While stsuu > 0
stkyara = Int((kyarass * Rnd) + 1) - 1
If krflag(stkyara) <> 1 Then
trkyara(a) = stkyara
krflag(stkyara) = 1
stsuu = stsuu - 1
a = a + 1
End If
Loop
105:sage
08/12/18 15:25:33
ソースの続き3
b = 0
Do While hozon(0) > 0
stbasyo = Int((25 * Rnd) + 1)
If anaflag(stbasyo - 1) <> 1 Then
If stbasyo < 16 Then
anaflag(stbasyo - 1) = 1
yokoti = (stbasyo Mod 5) - 1
If stbasyo = 5 Or stbasyo = 10 Or stbasyo = 15 Then
yokoti = 4
End If
If stbasyo = 15 Then
stbasyo = 14
End If
tateti = Int(stbasyo / 5)
anax(b) = xti1(yokoti)
anay(b) = yti1(tateti)
b = b + 1
hozon(0) = hozon(0) - 1
106:sage
08/12/18 15:26:25
ソースの続き4
Else
anaflag(stbasyo - 1) = 1
yokoti = (stbasyo Mod 5) - 1
If stbasyo = 20 Or stbasyo = 25 Then
yokoti = 4
End If
If stbasyo = 25 Then
stbasyo = 24
End If
tateti = Int((stbasyo - 15) / 5)
anax(b) = xti2(yokoti)
anay(b) = yti2(tateti)
b = b + 1
hozon(0) = hozon(0) - 1
End If
End If
Loop
107:sage
08/12/18 15:27:54
ソースの続き5
For i = 0 To hozon(1) Step 1
mogura(trkyara(i)).Move anax(i), anay(i)
mogura(trkyara(i)).Visible = True
Next i
For i = 30 To 0 Step -3
For j = 0 To hozon(1) Step 1
mogura(trkyara(j)).Move anax(j), anay(j) + i
Next j
DoEvents
ts = Timer + 0.1
Do Until ts < Timer
Loop
Next i
DoEvents
ts = Timer + 0.1
Do Until ts < Timer
Loop
For i = 0 To 30 Step 3
For j = 0 To hozon(1) Step 1
mogura(trkyara(j)).Move anax(j), anay(j) + i
Next j
DoEvents
ts = Timer + 0.1
Do Until ts < Timer
Loop
Next i
For i = 0 To hozon(1) Step 1
mogura(trkyara(i)).Visible = False
Next i
end sub
108:sage
08/12/18 15:30:53
わかりにくく読みにくいコードだと思いますが(すいません)よい方法あれば
教えてください。
109:デフォルトの名無しさん
08/12/18 15:31:07
Application.Ontimeでゴリゴリやるか、時間計測用のActiveX EXEを作ってイベントドリブンにしろ。
っつってもわかんねーかな。
110:デフォルトの名無しさん
08/12/18 15:46:55
<<109 さん
おはやい回答ありがとうございます。
Application.Ontimeを調べてみました。なんとなくできそうな気が
しそうですのでこれでやってみようと思います。ありがとうございました!
111:デフォルトの名無しさん
08/12/18 20:25:38
セルのある列全体ににプルダウンの選択式で○、×を選ぶとします。
それをif判定で、試してみたところうまく結果がでませんでした。
プルダウンの選択式だと、"○"として扱われないのでしょうか?
112:デフォルトの名無しさん
08/12/18 20:46:33
>>111
何のプロパティをチェックしてるの?
113:デフォルトの名無しさん
08/12/18 20:48:17
>>112
cellsでとってvalueを参照しております。
イミディエイトで中身みたら、ちゃんと×や○になってたのに・・・
114:デフォルトの名無しさん
08/12/18 21:40:37
>>113
実際のif文は?
115:デフォルトの名無しさん
08/12/18 21:41:19
>>113
そもそも、プルダウンじゃなくすれば判定できるの?
116:デフォルトの名無しさん
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
マジレスすると、ケースバイケース。
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5102日前に更新/259 KB
担当:undef