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


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

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

190 名前:183 [2008/12/21(日) 16:15:46 ]
>>184
少し意味がわかりませんが。
PCが違うときに同じマクロでもエラーが出るんです・・・。
自宅PC>動く
会社PC>エラー
ということです。
シートの保護やファイルの保護などの設定の問題のような気はするんですが。
わかる方いたらお願いします。

191 名前:デフォルトの名無しさん mailto:sage [2008/12/21(日) 16:34:38 ]
>>190
単純に考えて、同じマクロではないのだろう。

192 名前:デフォルトの名無しさん [2008/12/21(日) 16:46:37 ]
VBAで組んだマクロの仕様書を作ってくれるソフトって無いですか?
VBとかcとかはあるんだけど、VBAのやつは見つからない。


193 名前:183 [2008/12/21(日) 17:33:42 ]
>>191
すいません。
厳密に言うと違うんですが。
中身はコードのコピー貼り付けなのでコードは同じです。
(ファイルは別物)
ファイル名シート名の書き換えとかはしますけど。

会社のファイルがシート保護されていたので、
ためしに自宅PCでシートの保護をした状態だと、同様のエラーがでました。
なので設定の問題かなと予想してますが。

エラー箇所は毎回切り替えの部分です。
(アクティブシート・ファイルの切り替え)


194 名前:166 mailto:sage [2008/12/21(日) 17:49:37 ]
>>187
Copy Destinationですと値貼り付けできないようなので、
PasteSpecial Paste使ってデータをとることにしました。

もう少し研究して使いやすいものを作ってみたいと思います。
(作成したマクロは下です)。ありがとうございました。

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

Private Sub Macro1()

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

Worksheets("IV").Range("B1:B96").Copy
Worksheets("IV").Range("IV1").End(xlToLeft).Offset(0, 1).PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False

End Sub

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




195 名前:デフォルトの名無しさん mailto:sage [2008/12/21(日) 18:00:59 ]
.valueを転載したいだけなら、forなりfor eachなりでまわして、
sheets(2).cells(1,1).value = sheets(1).cells(1,1).value
の考えで代入して行っても良いんでないかな。

まぁ、ある程度の量以上になると遅いけど。

196 名前:デフォルトの名無しさん mailto:sage [2008/12/21(日) 20:18:24 ]
>>195
For Eachで回さんでも、Rangeオブジェクトを使えば値が配列として取り出せるから複数のセルを一気にコピーできる。
Set r = Range("IV1").End(xlToLeft).Offset(0, 1)
Range(r, r.Offset(95, 0)).Value = Range("B1:B96").Value

197 名前:デフォルトの名無しさん mailto:sage [2008/12/22(月) 07:46:08 ]
rangeをvariant型の2次元配列に代入するのもいいね。

198 名前:デフォルトの名無しさん mailto:sage [2008/12/22(月) 11:08:13 ]
>>197
>>196も入れてる。
右辺のRange("B1:B96").Valueが2次元配列。
左辺はResize使った方がすっきりするが。

199 名前:166 [2008/12/22(月) 17:36:11 ]
>>195->>198
ありがとうございます。
>>196さんのVBAを使わせてもらってます。

あと3分間に3回も4回も動作を繰り返す症状があり、
以下のサイトを参考にしてexcelを強制リロード
させるようにしたところ安定動作するようになりました。
www.efcit.co.jp/cgi-bin2/exqalounge.cgi?print+200502/05020118.txt

お礼まで。

200 名前:デフォルトの名無しさん [2008/12/22(月) 21:47:11 ]
Cells(1, 1) = Format("2008 / 12 / 22", "aaa")

これを実行すると (月) ってなるんだけど
両側の括弧を消したい場合は文字を操作するしかないですか?

201 名前:デフォルトの名無しさん mailto:sage [2008/12/22(月) 21:49:23 ]
>>200
replaceで括弧取り除くユーザ関数でも作れば?

202 名前:デフォルトの名無しさん mailto:sage [2008/12/22(月) 21:51:41 ]
>>200
ならないよ

203 名前:デフォルトの名無しさん mailto:sage [2008/12/22(月) 22:04:30 ]
>>202
申し訳ない、環境書きます
osx excel 2004

この環境特有の処理かな?

204 名前:デフォルトの名無しさん [2008/12/22(月) 22:18:23 ]
st = "個"
Range("d5").NumberFormatLocal = "0.0""個"""

これだと設定を変えられました。stに代入する意味はありませんが

st = "個"
Range("d5").NumberFormatLocal = "0.0""st"""

これだとエラーがでます。文字列なので""をとってみても
"0.0"st"" 無理でした。
どうすれば代入した値を扱えるのでしょうか?





205 名前:デフォルトの名無しさん mailto:sage [2008/12/22(月) 22:46:05 ]
>>203
mac版って不便だね
Cells(1, 1) = Mid("日月火水木金土", Weekday(2008 / 12 / 22), 1)


206 名前:205 mailto:sage [2008/12/22(月) 23:05:03 ]
>>203
すいません
こうですね
Cells(1, 1) = Mid("日月火水木金土", Weekday("2008/12/22"), 1)
若しくは
Cells(1, 2) = WeekdayName(Weekday("2008/12/22"), True)


207 名前:デフォルトの名無しさん mailto:sage [2008/12/22(月) 23:05:49 ]
IF文でCELLS(5,4).VALUE の値が小数点ならとかいう指定はできますでしょうか?
もしくは小数点を含まないといった指定はどうやればできるのでしょうか?

208 名前:デフォルトの名無しさん mailto:sage [2008/12/22(月) 23:11:10 ]
>>204
st = "個"
Range("d5").NumberFormatLocal = "0.0" & st

209 名前:デフォルトの名無しさん mailto:sage [2008/12/22(月) 23:15:04 ]
>>196 198さんのに関して、横レスですが、是非、教えてください。

>右辺のRange("B1:B96").Valueが2次元配列。
office tanaka で調べても、これは2次元配列ようにありますが、私には
1次元配列に見えるのです。こう書いてもvariant型変数なので2次元配列
となるというように理解するものですか?


210 名前:デフォルトの名無しさん mailto:sage [2008/12/22(月) 23:18:10 ]
>>208
それでもエラーでましたorz

211 名前:デフォルトの名無しさん mailto:sage [2008/12/22(月) 23:29:43 ]
>>207
今思いついたのは

n = (Cells(5, 4).Value * 10) Mod 10
If n <> 0 Then MsgBox "小数"

>値が小数点なら
って言うのをエスパーした結果
2.0は小数点無しでいいんだよね

212 名前:デフォルトの名無しさん mailto:sage [2008/12/22(月) 23:34:53 ]
>>211
2.0も小数点扱いしたいです・・・

213 名前:デフォルトの名無しさん mailto:sage [2008/12/22(月) 23:40:40 ]
>>212
書式で小数点以下の桁数指定すれば
1は1.0とか
2は2.0とか表示されるんだけど
その状態だと全部小数点有りだよね


214 名前:デフォルトの名無しさん mailto:sage [2008/12/22(月) 23:46:52 ]
文字列にして"."をFind



215 名前:デフォルトの名無しさん mailto:sage [2008/12/22(月) 23:50:59 ]
>>210
こうじゃね?
st = """個"""
Range("D5").NumberFormatLocal = "0.0" & st

216 名前:デフォルトの名無しさん mailto:sage [2008/12/22(月) 23:58:08 ]
>>209
調べてみりゃわかる。
MsgBox UBound(Range("B1:B96").Value, 1)
MsgBox UBound(Range("B1:B96").Value, 2)
96と1が返るから2次元配列。






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

前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