[表示 : 全て 最新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)


89 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 09:42:52 ]
と学生が申しております
仕事で使うわアホ


90 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 11:06:52 ]
>>89
VBAがまともに使えない上に仕事したことないやつが若気の至りってやつで書き込んだんだろう
あまり責めてやるなよw

91 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 12:55:10 ]
>>89>>90
どんなことに使ってるの?

92 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 13:49:36 ]
ルーチンワークは大体そう
他は資料をデータベースっぽく正規化するために使うことも

・・まぁ、大企業ならこんなことしなくても既にシステムは完成されてるんだけどね

93 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 13:51:22 ]
SAPのBWなんかはExcelマクロ

94 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 13:57:12 ]
オフコンからデータ(CSVとか)受け取って
帳票(見積書とか)の形に整えて印刷とか

95 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 18:51:26 ]
WindowsXP、Excel2002ユーザの質問です。

現在VBAマクロ内で、OSのXP/Vistaの違いを問わず、 インストールされているFirefox 3.0.xの
実行ファイルのフルパスを取得しようとしています。Firefox3が

・標準のフォルダ以外にインストールしている可能性がある
・HTML、HTTP等に関連付けられている
・デフォルトブラウザに指定されている

という状態で使われているとき、マクロ上で何をすればスマートにフルパスが得られるでしょうか?
検索すると、既存ファイルを利用する方法、レジストリの関連付けを参照する方法がありますが、
他の方法は無いでしょうか?

参考になる情報をご存知の方、教えてください。

96 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 19:27:43 ]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\firefox. exe]


97 名前:デフォルトの名無しさん mailto:sage [2008/12/18(木) 01:52:45 ]
問屋でデータ処理に未知のオフコン使ってて、送られてくる売り上げデータのフォーマットが変態的なんで
VBAで整形&正規化してる。なんか>>94とよく似た境遇だな。おまけに受け渡しはいまだにフロッピーディスク。
社内でデータベース処理してるマシンも松下製の見たことない機種だったなあ。
こっちはなんとPC-9821が専用ケーブルでつながってて、N88-BASICで書かれた端末ソフトが走ってる。

中小企業でコンピューターの知識がないと、メーカーの営業の言うがままにシステム構築して
記憶媒体から何から何まで汎用性ゼロのシステムで囲い込まれてにっちもさっちもいかないことが多い希ガス。



98 名前:デフォルトの名無しさん mailto:sage [2008/12/18(木) 10:56:24 ]
何年前に作ったシステムだよ?

99 名前:デフォルトの名無しさん mailto:sage [2008/12/18(木) 11:40:21 ]
wikiによるとPC-9821が入ったのは早くても15年位前らしいな

パソコンで動くエミュレーターがあるにもかかわらず
いまだにバカ端が業務で現役ってところもあるしそんなに珍しくもないんじゃね?

まぁスレ違いだしこの辺で流れ斬ろうか・・・

100 名前:デフォルトの名無しさん mailto:sage [2008/12/18(木) 13:42:45 ]
ダム端って言うんだよ

101 名前:sage mailto:sage [2008/12/18(木) 15:09:13 ]
いまユーザーフォームを利用してモグラたたきを作っているのですが
じかんをカウントダウンさせるプログラムとモグラの動きのプログラムが
うまく作用せず、モグラの動きのプログラムが終了すると
再びカウントダウンするようになってしまいます。両方とも独立して動くように
したいのですがよい方法はありませんか。

102 名前:sage mailto:sage [2008/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 mailto:sage [2008/12/18(木) 15:18:27 ]
ソースの続き

Private Sub back1_Click() back1はイメージオブジェクトです
If startflag = 1 Then
Call moguratataki
End If
End Sub
コマンドボタンを押したら時間のカウントダウンとゲームの開始したいと
思っていますがそれもまだ分からないので調べ中です。
call命令で、もぐらたたきゲームが始まるような感じで作りたいと思っています。


104 名前:sage mailto:sage [2008/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 mailto:sage [2008/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 mailto:sage [2008/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 mailto:sage [2008/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 mailto:sage [2008/12/18(木) 15:30:53 ]
わかりにくく読みにくいコードだと思いますが(すいません)よい方法あれば
教えてください。

109 名前:デフォルトの名無しさん mailto:sage [2008/12/18(木) 15:31:07 ]
Application.Ontimeでゴリゴリやるか、時間計測用のActiveX EXEを作ってイベントドリブンにしろ。
っつってもわかんねーかな。

110 名前:デフォルトの名無しさん mailto:sage [2008/12/18(木) 15:46:55 ]
<<109 さん
おはやい回答ありがとうございます。
Application.Ontimeを調べてみました。なんとなくできそうな気が
しそうですのでこれでやってみようと思います。ありがとうございました!

111 名前:デフォルトの名無しさん [2008/12/18(木) 20:25:38 ]
セルのある列全体ににプルダウンの選択式で○、×を選ぶとします。

それをif判定で、試してみたところうまく結果がでませんでした。
プルダウンの選択式だと、"○"として扱われないのでしょうか?

112 名前:デフォルトの名無しさん mailto:sage [2008/12/18(木) 20:46:33 ]
>>111
何のプロパティをチェックしてるの?

113 名前:デフォルトの名無しさん [2008/12/18(木) 20:48:17 ]
>>112
cellsでとってvalueを参照しております。
イミディエイトで中身みたら、ちゃんと×や○になってたのに・・・

114 名前:デフォルトの名無しさん mailto:sage [2008/12/18(木) 21:40:37 ]
>>113
実際のif文は?

115 名前:デフォルトの名無しさん mailto:sage [2008/12/18(木) 21:41:19 ]
>>113
そもそも、プルダウンじゃなくすれば判定できるの?

116 名前:デフォルトの名無しさん [2008/12/18(木) 21:48:14 ]
>>114
do until なんとか =""
with ほにゃらら
if .cells(x, y).value = "○" then
処理
end if
loop

.valueにはいってる値を確認したところ、×とかちゃんとはいってました

セル全体にプルダウンの選択がそれぞれ入ってるからループ文では聞かないのかな



117 名前:デフォルトの名無しさん [2008/12/18(木) 22:26:25 ]
sheet1の2-24行、D列に○×のプルダウンがはいっています。
これでやるとエラーがでますifの行に

x = 1
i = 2
y = 4
Do Until Cells(i, y).Value = ""

If Cells(i, y).Value = "○" Then
Sheets(2).colums(x).Delete

x = x + 1
i = i + 1

End If
Loop



118 名前:デフォルトの名無しさん mailto:sage [2008/12/18(木) 22:36:44 ]
i=i+1はEndIfとLoopの間だと思う。

sheets(2)の列x(初期値1)を削除した後のループで再び削除する時にはxがインクリメントされてるから初期状態の列番号でいう所の3列目が削除されると思うがそれで良いのか、ふと疑問に思った。

どちらもエラーの原因じゃないけど。
というか、俺には「○×のプルダウンが入ってます」の意味が理解できない。
すまんな。

119 名前:デフォルトの名無しさん mailto:sage [2008/12/18(木) 22:46:18 ]
あとcolums→columns、だね

それでもif文の行にはエラーは出ない。
力になれなくてすまんな。

120 名前:デフォルトの名無しさん [2008/12/18(木) 22:48:29 ]
そうでした^^;
たしかにインクリメントしないといけませんね

Dim i As Integer
Dim y As Integer
Dim x As Integer

x = 1
i = 2
y = 4


Do Until Cells(i, y).Value = ""

If Cells(i, y).Value = "○" Then
Sheets(2).colums(x).Delete
x = x - 1

End If
i = i + 1
x = x + 1

Loop

End Sub


これでやったらif文にオブジェクトはプロパティかメソッドをサポートしてない
ってでてまたエラーになってしまいました

121 名前:デフォルトの名無しさん [2008/12/18(木) 22:53:48 ]
ありがとうございます!
columnsがまちがっていたようでした
無事いけました
ご指摘いただいたcolumnsが間違っていたことが一番の原因だったようです

122 名前:デフォルトの名無しさん mailto:sage [2008/12/18(木) 23:16:55 ]
失礼します


シート1から実行するとしてセルB2には名前という文字が入っております
const mojicell as string "B2"

のようにしてシートの対応するセルに格納されてる値をとりだすことはできますか?
やってみたところ、セルを格納するのはできなかったので・・・何か方法があるのかと思いまして

実際どのように試し方といいますと

Sheets(mojicell).cells(...... のように使いました。
SHeets("名前").cells(...  に置き換えられるかとおもっていたのですが、
実際はSheets("B2")と 入っておりました。

const で指定したセルが参照する値を格納することはできないのでしょうか?

123 名前:デフォルトの名無しさん mailto:sage [2008/12/18(木) 23:19:36 ]
セル参照だけならrangeオブジェクト使いなさい。
シートまで含むならまずconstの値を工夫しなさい。

124 名前:デフォルトの名無しさん mailto:sage [2008/12/18(木) 23:21:20 ]
>>122
const mojicell as string = "B2"
worksheets(range(mojicell).value).cells(...

125 名前:デフォルトの名無しさん [2008/12/18(木) 23:50:23 ]
>>124
これだと
シート1からこのマクロ実行してシート1にあるセルを参照するならわかりやすいですが
シート2からこのマクロを実行してシート1にあるセルを参照するとなると、
できなくなるのでは?

126 名前:デフォルトの名無しさん [2008/12/19(金) 00:50:28 ]
>>124
これだとエラーでます・・・

127 名前:デフォルトの名無しさん [2008/12/19(金) 00:59:34 ]
A17にテストという文字をセットしておくとします

Sub tes2()
Const moji As String = "A17"
Sheets("テスト").Cells(3, 1).Value
Sheets(Range(moji).Value).Cells(3, 1).Value

これだと下の文がインデックスが有効範囲にないとエラーでます



128 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 01:03:33 ]
>>127
"A17"は、シート名じゃねーだろ

129 名前:デフォルトの名無しさん [2008/12/19(金) 01:06:10 ]
>>128
これの意味するところは
range("A17").value = テスト   という所なのでは?
よって
sheets("テスト")  と>>124さんがおっしゃってた意味かとおもってたのですが
動作がうまくいかないということは違いますよねorz

130 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 01:16:52 ]
>>129
どのシートの"A17"で
どこのマクロだよ

131 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 01:18:18 ]
>>129
右辺を書け!

132 名前:デフォルトの名無しさん [2008/12/19(金) 01:23:35 ]
sheets(1)にあるマクロでsheets(1)のA17セルには、テスト という値が入っております

で、このsheets(1)のA17セルの値をconstとして間接的に参照できる形にして
sheets("テスト")の3行1列目のセルの値を取得します


でも、なぜか
print Range(moji).value
テスト
とは表示されるのに、先ほどの下の文では表示されません


133 名前:デフォルトの名無しさん [2008/12/19(金) 01:26:27 ]
Sheets(Range(moji).Value).Cells(3, 1).Value

これではインデックス範囲のエラーがでますorz

134 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 01:35:00 ]
実際のファイルを作って、アップしろ

135 名前:デフォルトの名無しさん [2008/12/19(金) 01:42:37 ]
Sub tes2()
Const moji As String = "A17"
Sheets("Range(moji).Value").Cells(3, 1).Value
End Sub

sheets(1)のA17セルには、テスト という値が格納されている
sheets("テスト")のセル(3行1列目)の値には、たとえば 100 といった値が格納されている

このマクロをsheet("テスト")にて実行する方法ということです
今のままじゃエラーがでますので

136 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 01:46:07 ]
>>135
実際に作ったものをアップしろって

137 名前:デフォルトの名無しさん [2008/12/19(金) 02:16:52 ]
まったくわからない・・・



138 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 02:19:01 ]
うpされたものを拾う気はあるのかや?俺には無いよ。めんどくさい。

質問の意味不明度が増してきたのでそろそろ寝てほしいと思う。適当に脳内補完してみたから。
const moji as string = "A17"
debug.print worksheets(sheet(1).range(moji)).cells(3,1)

139 名前:デフォルトの名無しさん [2008/12/19(金) 02:22:16 ]
>>138
それを実行してみたところ型が一致していません。とでました。

140 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 02:23:02 ]
>>138

>>135
>Sheets("Range(moji).Value").Cells(3, 1).Value
この辺の行の意味不明度からして、根本的な間違いがあると思う。

141 名前:デフォルトの名無しさん [2008/12/19(金) 02:24:54 ]
シートの名前は
1がSheet1
2がテスト
です。

Sheet1のA17セルには、テスト と書かれています。他のすべてのセルは空白です。
テストのcells(3,1)の場所には適当に文字を書き込んでいます。

で、お教え頂いたマクロを実行したところ>>139のエラーがでました。
const moji as string = "A17"
debug.print worksheets(sheets(1).range(moji)).cells(3,1)

142 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 02:26:16 ]
>>141
だから、実際のものをアップしないと話にならねーって

143 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 02:35:29 ]
>>138
デバッグどころかコンパイルも通らない物貼り付けて、えらそうに・・・

144 名前:デフォルトの名無しさん [2008/12/19(金) 02:37:35 ]
うーむ、簡単に見えてむずかしいようですね・・・

145 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 02:41:18 ]
>>144
オマエが単純に間違ってんだよ。
現物をアップしろよ

146 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 02:43:48 ]
ごめんよ、テストなんてしてなかったからさ。

だいぶゴツクなっちゃったけど、それでもよければどうぞ。
Sub test()
Const moji As String = "A17"
Dim sh As Worksheet
Dim obj

For Each obj In ThisWorkbook.Worksheets
If obj.Name = Worksheets(1).Range(moji) Then
Set sh = obj
Exit For
End If
Next obj

If IsObject(sh) And (Not sh Is Nothing) Then
MsgBox sh.Cells(3, 1)
End If

End Sub

147 名前:デフォルトの名無しさん [2008/12/19(金) 02:44:20 ]
sheet1のA1セルに テスト  と入力します
sheet2のシート名を手動でテストという名前に変更します
sheet2のA1セルに 値 と入植します

このブックをつくって
マクロを
sub テスト()
const moji as string = "A1"
debug.print worksheets(sheets(1).range(moji)).cells(1,1)
end sub

これでエラーがでてしまうということです。下から2行目のところにエラーが・・・



148 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 02:45:00 ]
>>147
それはもういいんだよ。
現物上げろよバカ

149 名前:デフォルトの名無しさん [2008/12/19(金) 02:45:47 ]
>>146
さすがにこれは長いですね・・・

150 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 02:46:35 ]
>>148
現物をあげてダウンロードするまでにかかる時間のほうが長いと思うのですが・・・・


151 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 02:47:40 ]
>>150
こんだけバカなんだから、根本的なところで間違ってんだよ。
どのセルに何の値を入れてるのかさえ、あてにならない。

152 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 02:48:58 ]
>>150
概ね>>135通りのコードを書き込んで、コンパイルもしてないだろうさ


153 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 03:05:44 ]
もっとスマートに出来ないものかとぐぐったけどINDIRECTばっかでてくる…orz
VBAでの良策ってどんなだろう。

>>149
長いのが気になるだけなら別関数にしてね^^

154 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 03:06:30 ]
でもこれじゃconstでセルを指定しずらいというか面倒なのって痛いですね

155 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 03:10:01 ]
>>154
オマエがバカなだけ。
Debug.Printもついてない行でエラーになるのはあたりまえ。

156 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 03:11:19 ]
>>155
先ほどdebug.printがかかれてたマクロを実行してもエラーがでたのですが・・・

157 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 03:13:36 ]
ごめん。それは俺のミス。

以上で終了───



158 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 03:13:43 ]
>>156
rangeのデフォルトはValueじゃない。
それとDebug.Printが付いてないやつとは別のコード。
その区別がつかないのは、バカだから。

159 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 03:31:01 ]
おぉ。rangeってrangeなのね。そうなのね。
そおしたら随分と無駄なコード書いてきたんだなぁ今まで。反省orz

160 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 07:04:25 ]
rangeが指定する値を保存する方法って?

161 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 07:10:54 ]
オブジェクト変数にrangeをセット

162 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 13:17:19 ]
>>147
質問するとき小文字でコードアップするんじゃねーよ。
実際にVBEからコピペしろ。
回答者でも長いコードをオール小文字とかオール大文字は嫌味なくらいだ。

Sub テスト( )
Const moji As String = "A1"
Debug.Print Worksheets(Worksheets("Sheet1").Range(moji).Value).Cells(1,1).Vallue
End Sub

と.Valueが抜けてるから型が一致しないとなるんだよ。
最後の.Valueはなくても動くが途中のは必須。
>>158が書いてるのはこういうこと。

163 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 13:22:11 ]
>>162
その発言、なんかのギャグ?

164 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 13:25:02 ]
>>162
流れから見てその件はもう終わったものかと思っていたが・・・
勘違いかな?

165 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 14:00:42 ]
日本人はひとつのジョークで3回笑う
1回目はジョークを聞いたとき
2回目はジョークの意味を教えてもらったとき
3回目は家に帰った後、やっとジョークの意味がわかったとき


166 名前:デフォルトの名無しさん [2008/12/19(金) 14:09:44 ]
excel2002 SP3を使っています。

以下のようなへたくそなマクロを作りました。

------------------------ここから------------------------

Private Sub Macro1()
Worksheets("IV").Range("B2:B96").Select
Selection.Copy
Worksheets("IV").Range("C2").Select
Selection.Insert Shift:=xlToRight
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Worksheets("IV").Columns("C:C").Select
Worksheets("IV").Application.CutCopyMode = False

nextTime = Now() + TimeValue("00:01:00")
Application.OnTime nextTime, "Macro1"
End Sub

------------------------ここまで------------------------

"IV"のシートを表示させているときは問題なく動作するのですが、
他のシートを表示させると以下のエラーとなって動作してくれません。

実行エラー"1004"RangeクラスのSelectメソッドが失敗しました。

何がいけないのか教えていただけますでしょうか。お願いします。

167 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 14:13:32 ]
>>166
アクティブにしないとセレクトできないんじゃないの?




168 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 14:24:07 ]
>>167
そうなんですか。困ったな。。。

普段は他のシートを表示させているので、
非アクティブでも動作をさせるにはどうしたらいいですか?

169 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 14:40:39 ]
Worksheets("IV").Range("B2:B96").Copy
Worksheets("IV").Range("C2").Insert Shift:=xlToRight
Worksheets("IV").Range("C2").PasteSpecial ...
Application.CutCopyMode = False


170 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 14:51:43 ]
>>169
おおおおおお!!!!!!
ありがとおおおおお!!!!
さっそくやってみます。

171 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 14:56:51 ]
>>169
できたああああ!
ありがとう!!!!
感謝感謝!!!!

172 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 20:04:42 ]
質問させてください。
指定した範囲内にあるデータの種類の数を取得するにはどうしたらいいでしょうか?
汚いながらもVBAで配列に入れながら総当りで調べることはできるのですが
ワークシート関数でそのようなものがあれば高速なのでそちらを使いたいと思っています。

例:範囲 A1:C3
  A   B  C 
1 山  川  海
2 海  海  川
3 川  都  南

この場合、「山、川、海、都、南」の5種類が出現するので 5を返してくれる関数を知りたいです。

よろしくお願いします。

173 名前:デフォルトの名無しさん [2008/12/19(金) 20:14:52 ]
このファイルで別シートからマクロを実行して
特定の列だけ抽出して別のシートに表示したいです。

列を抽出するとき、たとえばA列とC列とE列を削除して表示させたい結果が
下のテーブルです。

このように別のシートからマクロを実行して他の別シートに抽出した結果を表示させるには
どのようしすればいいでしょうか?
単にセル結合を考えない抽出ならできるのですが、
セル結合も考慮して、元の分類タイトルがあるまま抽出するにはどういった
手順でやるのが最適でしょうか?よろしくお願いしますm(__)m

ファイルは以下のやつをみていただければわかりやすいかとおもいます
www.dotup.org/uploda/www.dotup.org5812.xlsx.html

174 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 22:38:02 ]
101で質問したものです。
もぐらたたきが大まかですがだいたいできたので
UPします 
ttp://www.mediafire.com/?bj352f2jaxz
ttp://www.mediafire.com/?mn94db0mc4j

まだもんだいはありますがよろしければ批評してください

175 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 23:33:05 ]
>172
配列数式でも良ければ
{=SUM(1/COUNTIF(A1:C3,A1:C3))}

176 名前:デフォルトの名無しさん mailto:sage [2008/12/20(土) 00:54:59 ]
>>172
配列の使い方はどうしてる?
for eachで選択範囲をコレクションとして、
.valueが配列に含まれていなかった場合には、配列にぶち込んで、
最後にuboundでカウントすれば高速だと思うんだが。

このロジカルなら一瞬だと思うけど。
配列で総当たりってのがちと気になった。




177 名前:デフォルトの名無しさん mailto:sage [2008/12/20(土) 01:05:35 ]
>>173
シート名を明示してやればOKだね。

タイトル行が空白だったら、空白じゃなくなるまで左に移動してタイトルを取得する。

これを組むのが面倒なら、
結合を全部解除して、全てのセルにタイトルを振ってしまう。
最後に、重複するタイトルの場合に削除なりmergeなりで処理すれば良いと思う。

削除って考えじゃなくて、抽出したい物を残すって考えにしないとタイトルは取得出来ないな。



178 名前:デフォルトの名無しさん [2008/12/20(土) 08:34:25 ]
>タイトル行が空白だったら、空白じゃなくなるまで左に移動してタイトルを取得する。

抽出してしまった場合、左にもうタイトルはないのではないでしょうか?
あらかじめこれも全ての結合を解除したという前提かな?
でも左に移動してタイトルを取得する場合、元からタイトルがない行があった場合
たとえば、メーカーというタイトルが最初からなかったとすると、本来なくていいタイトルに
別のタイトルが埋め込まれますよね?
このファイルに対してはいけそうですが、ない場合は大変かな?

>結合を全部解除して、全てのセルにタイトルを振ってしまう。
>最後に、重複するタイトルの場合に削除なりmergeなりで処理すれば良いと思う。

これもタイトルがない行があった場合、処理に困るかな・・・

追加、条件で大変申し訳ないですが、もしタイトルが空白のセルがあった場合はこれじゃ難しいでしょうか?

179 名前:デフォルトの名無しさん mailto:sage [2008/12/20(土) 12:23:58 ]
すみません。CLASSモジュールの書き方がわからないんですが
どこかに説明しているサイトないですか?

180 名前:デフォルトの名無しさん mailto:sage [2008/12/20(土) 12:29:58 ]
>>178
元からタイトルが無い列があるなんて知らないし。
てか、excelでレイアウトするなら、VBAで処理しようと考えない事だな。

人間が見やすい見た目と、計算機が処理しやすい(出来る)のは全く違うからね。
帳票として見やすく加工・レイアウトするのは、全ての演算処理が終わってから最後にやるもの。
レイアウトされたものに処理を掛ける事ほど無意味かつ煩雑になる事はないぞよ。

いったん全部のmarge解除して、全てのタイトルをはめ込むしかないでしょ。

181 名前:デフォルトの名無しさん [2008/12/20(土) 19:32:18 ]
Excel2003を使ってます。
VBAの勉強をしたいのですが、良い本や教材はありますでしょうか?
バカでもわかるようなのでいいです。

182 名前:デフォルトの名無しさん mailto:sage [2008/12/20(土) 22:48:34 ]
VBAで何やりたいの?


183 名前:デフォルトの名無しさん [2008/12/21(日) 00:50:07 ]
質問です。

アクティブになっているシートから別のシートを選択したいのですが、
エラーが出てとまってしまいますが、なぜでしょうか?

エラーの内容はシートの保護がかかっている状態で、
そのシートを選択したとき(Activate)と同じエラーです。

エクセル2003で、自宅PCでは動作しますが、会社PC(2003だと思う)ではダメです。
もちろん保護ははずしましています。
考えられる原因はなにがあるでしょうか。

文章がわかりにくかったらすいません。

184 名前:デフォルトの名無しさん mailto:sage [2008/12/21(日) 02:20:11 ]
>>183
>>167


185 名前:166 mailto:sage [2008/12/21(日) 12:41:12 ]
>>166です。先日はありがとうございました。
動作のたびに画面がフラッシュして非常にストレスを感じます。

Insert Shiftが重たいのかなとおもうのでInsert Shiftを使わず、
C列、D列、E列・・・と列の最後尾に貼り付けたいと思うのですができますか?
(xlToRightを使うのかな・・・)

あとクリップボード経由だとこれまた重たいようなので、
クリップボードを使わずにそのまま貼り付けできればいいのかな
(Destinationを使う???)と思っているのですが、どうなのでしょうか?


作成したマクロは以下です。アドバイスください。
よろしくお願いします。

---------------ここから---------------

Private Sub Macro1()

Worksheets("IV").Range("B1:B96").Copy
Worksheets("IV").Range("C1").Insert Shift:=xlToRight
Worksheets("IV").Range("C1").PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False

nextTime = Now() + TimeValue("00:01:00")
Application.OnTime nextTime, "Macro1"

End Sub

---------------ここまで---------------


186 名前:デフォルトの名無しさん mailto:sage [2008/12/21(日) 13:44:32 ]
>>185
画面がフラッシュするのは仕方ないと思うぞ。Windowsってのはそういうもんだ。
とりあえず右端にコピーする方法
Worksheets("IV").Activate
Range("B1:B96").Copy Destination:=Range("IV1").End(xlToLeft).Offset(0, 1)

187 名前:デフォルトの名無しさん mailto:sage [2008/12/21(日) 13:53:12 ]
>>185
細かいことを言うと、それだと処理が1分よりも少し長い間隔で実行される。
nextTimeはSubの先頭でセットした方が誤差が少なくなる。



188 名前:デフォルトの名無しさん mailto:sage [2008/12/21(日) 14:27:42 ]
>>186>>187

ありがとうございます。値貼り付けにできますか?
あとこのマクロは時間処理が少しおかしいです。

しばらく席を離れて画面が黒くなりパソコンが待機状態になったとき
(マウスを触るとすぐに画面は表示される状態)などマクロがとまってしまいまいます。

そして再度実行させると、たまっていた処理を一気に吐き出すような感じで、
3連続処理を繰り返すことが多々あります。安定動作にはまだまだ遠いです。

189 名前:デフォルトの名無しさん mailto:sage [2008/12/21(日) 16:06:47 ]
>>172
矩形範囲の種類を数える高速なワークシート関数なんてない。
1列とか1行でソートされてるとかなら簡単だが、矩形範囲ならユーザー定義関数作れ。
Dictionaryオブジェクトの方が簡単だが、>>176の書いてるCollectionを使うなら

Function CountKinds(r As Range) As Long
  Dim col As Collection
  Dim element As Variant
  Dim cnt As Long
  Set col = New Collection
  On Error Resume Next
  For Each element In r.Value
    If Not IsEmpty(element) Then
      col.Add Empty, CStr(element)
      If Err.Number = 0 Then
        cnt = cnt + 1
      Else
        Err.Clear
      End If
    End If
  Next
  CountKinds = cnt
End Function

一次元配列に移してからソートして数える方法もあるが。






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

前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