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


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

Excel VBA 質問スレ Part22



1 名前:デフォルトの名無しさん mailto:sage [2011/11/27(日) 22:36:18.78 ]
01 pc11.2ch.net/test/read.cgi/tech/1054356121/
02 pc11.2ch.net/test/read.cgi/tech/1168308855/
03 pc11.2ch.net/test/read.cgi/tech/1180192018/
04 pc11.2ch.net/test/read.cgi/tech/1189814602/
05 pc11.2ch.net/test/read.cgi/tech/1197448064/
06 pc11.2ch.net/test/read.cgi/tech/1205231499/
07 pc11.2ch.net/test/read.cgi/tech/1212587819/
08 pc11.2ch.net/test/read.cgi/tech/1219673793/
09 pc11.2ch.net/test/read.cgi/tech/1228372971/
10 pc12.2ch.net/test/read.cgi/tech/1235332603/
11 pc12.2ch.net/test/read.cgi/tech/1241885130/
12 pc12.2ch.net/test/read.cgi/tech/1247566074/
13 pc12.2ch.net/test/read.cgi/tech/1254281104/
14 pc12.2ch.net/test/read.cgi/tech/1262748898/
15 pc12.2ch.net/test/read.cgi/tech/1271261239/
16 hibari.2ch.net/test/read.cgi/tech/1280045912/
17 hibari.2ch.net/test/read.cgi/tech/1289182437/
18 hibari.2ch.net/test/read.cgi/tech/1298240666/
19 hibari.2ch.net/test/read.cgi/tech/1305754555/
20 hibari.2ch.net/test/read.cgi/tech/1312435844/

前スレ:
Excel VBA 質問スレ Part21
hibari.2ch.net/test/read.cgi/tech/1316931607/

610 名前:デフォルトの名無しさん mailto:sage [2012/01/03(火) 16:31:29.29 ]
オマエモナー

611 名前:デフォルトの名無しさん mailto:sage [2012/01/03(火) 16:55:54.97 ]
悔し紛れにオウム返しするも、的を射て無くて完全に負け犬の遠吠え状態w

612 名前:デフォルトの名無しさん mailto:sage [2012/01/03(火) 16:57:00.48 ]
答える能力のない自分を顧みずに上から目線ですか
哀れな屑ですね

613 名前:デフォルトの名無しさん mailto:sage [2012/01/03(火) 17:03:53.01 ]
遠吠え谺す

614 名前:デフォルトの名無しさん mailto:sage [2012/01/03(火) 17:23:29.76 ]
ユウナレスカ検定一級ですがなにか

615 名前:デフォルトの名無しさん mailto:sage [2012/01/03(火) 18:29:34.79 ]
ねえマジで
この程度の質問にも答えられないの?
大した事ないっていうか…お前ら…
好きなエクセルでもこんなレベルって
きっと他の分野じゃ本当に無能なんだろうな

616 名前:デフォルトの名無しさん mailto:sage [2012/01/03(火) 18:46:20.35 ]
>>615
あんた質問書いてないじゃん
書いてない質問にどう答えろと?

617 名前:デフォルトの名無しさん [2012/01/03(火) 20:12:26.74 ]
Sub sample()

Dim a, i As Double

a = Cells(2, 3).Value
For i = 1 To a
Cells(i, 1).Value = i
Nexti

End Sub

上記のように、マクロを使用せずに、シート1のセル(2,3)の部分に数字を
入れれば、自動的に、(1,1),(2,1),(3,1)の部分に1,2,3といったように
表示させたく上のコードを作りました。
しかし、なぜかエラーとして
subあるいはfunctionが定義されていません。
と出ました。
どうすればよいのでしょうか?
またfunction関数を作る場合は、module以外のシートに作る必要があるのでしょうか?


何卒よろしくお願いします。

618 名前:デフォルトの名無しさん mailto:sage [2012/01/03(火) 20:23:11.61 ]
×Nexti
○Next i



619 名前:デフォルトの名無しさん [2012/01/03(火) 20:29:03.06 ]
早急なご返事大変ありがとうございます。
できました。
しかし、これは再生ボタンを押さないと表示されないです…
自動的に数字が変わる方法はご存じでしょうか?
よろしくお願いします。

620 名前:デフォルトの名無しさん mailto:sage [2012/01/03(火) 20:36:32.52 ]
セルが変更された場合のイベントを補足して処理する
Worksheet_Change
とかで検索

621 名前:デフォルトの名無しさん mailto:sage [2012/01/03(火) 20:57:23.13 ]
できました。本当にありがとうございました。失礼します。

622 名前:デフォルトの名無しさん mailto:sage [2012/01/03(火) 21:51:20.18 ]
>>617
これはOption Explicitを指定しないせいで
Nextiが変数として処理されたために起きたトラブルだから、
モジュールの先頭にOption Explicit を書いておけば
Nextiと書いた部分がエラーになってその時点でトラブルが防げた。
OptionExplicitを書く癖をつけといたほうが良いと思う。

あと、変数iをDouble型で宣言している意味が分からない。
整数しか入れないならLongやIntegerで宣言しとけば良いと思うし、
さらにいうと変数aはVariantで宣言してるんだから
それならiもVariantで良いんじゃないかとも思う。
もしかして宣言の仕方自体が分かってないのかもしれないから補足しておくと、

Dim a,i As Double

と書くと、a は Variant型、i は Double型で宣言される。
両方ともDouble型で宣言するなら

Dim a As Double,i As Double

と書かなきゃ駄目だし、そんなこと書くぐらいなら

Dim a,i

で両方ともVariant型にしちゃっても良かったと思う。


623 名前:デフォルトの名無しさん mailto:sage [2012/01/03(火) 21:59:05.03 ]
ハリキッテルネ!

624 名前:デフォルトの名無しさん mailto:sage [2012/01/03(火) 22:00:21.24 ]
オマエモネ!

625 名前:デフォルトの名無しさん mailto:sage [2012/01/03(火) 22:11:50.50 ]
ソクレス・・・スレカンシゴクロウサマデス!

626 名前:デフォルトの名無しさん mailto:sage [2012/01/03(火) 22:14:06.89 ]
いや、たまたま新着レスがあったから
適当に書き込んだだけなんだけどw

627 名前:デフォルトの名無しさん mailto:sage [2012/01/03(火) 22:54:22.81 ]
>>622
詳しいアドバイスありがとうございます。
ところで、さらに質問が出てきました。まったくべつのものですが、、、

Sub test1()
Dim x(100, 100) As Integer
a = 0
For i = 1 To 20
For n = 1 To 20
a = a + 2
Cells(i + 4, n + 4).Value = a
Next n
Next i

a = UBound(x, 1)
Cells(2, 2).Value = a

End Sub

ためしに、UBound(x,1)が100なのか、それとも数字が入っている20行までなのか
試してみたのですが、結局上記の場合、UBound(x,1)=100でした。。。

数字が入っているところまで20とすることは可能なのでしょうか?


628 名前:デフォルトの名無しさん mailto:sage [2012/01/03(火) 23:06:28.37 ]
その例では、20はリテラル値なんだから
a = UBound(x, 1)

a = 20
にすれば良いだけじゃん

20の部分が変数になったとしても、同じく
a = 変数
で事足りる

固定のリテラル値にしろ変数にしろ、前段階の処理でどこまで数字を
入れたかが解ってるんだから、配列から取得する必要など何も無い



629 名前:デフォルトの名無しさん mailto:sage [2012/01/03(火) 23:36:02.44 ]
>>616
そこに気づいたか
だがもう一歩だ

630 名前:622 mailto:sage [2012/01/03(火) 23:43:36.86 ]
>>627
>ためしに、UBound(x,1)が100なのか、それとも数字が入っている20行までなのか
>試してみたのですが、結局上記の場合、UBound(x,1)=100でした。。。
>
>数字が入っているところまで20とすることは可能なのでしょうか?


申し訳ないんだけど質問の意図がまったく分からない。

UBound(X,1)はXという配列変数の1次元目の上限を求めているわけで
変数の宣言時にX(100,100)と宣言してるのだから
(その後Redimで大きさを変更したりしない限り)
その時点で100になるのは当然のこと。

そして、ForNextのネストの中でCellに値を代入しているけど
そこでもX()はまったく出てきてないんだから
UBound(X,1)が100から変化すると貴方が考えた理由が分からない。

んで、

>数字が入っているところまで20とすることは可能なのでしょうか?

というのも何の事だかさっぱり意味が分からない。
できたらもう一度、意味が通じるように質問しなおしてほしい。

631 名前:デフォルトの名無しさん mailto:sage [2012/01/03(火) 23:46:56.36 ]
ありがとうございます。
今、行列の計算のプログラムを作っています。
www.fastpic.jp/images/023/1362403442.bmp
しかしながら、上記のように正しい計算結果を得ることができません。
コードは以下のようになっています。大変わかりにくくてすみません。
Sub 行列掛け算()
Dim z(100, 100) As Double
Dim x(100, 100) As Double
Dim y(100, 100) As Double
Dim s As Double


'aの行列
For i = 16 To 19
For j = 4 To 6

'xの要素に、入れていく(1から)
For n = 1 To 4
For nn = 1 To 3
x(n, nn) = Cells(i, j).Value
Next nn
Next n

Next j
Next i


632 名前:デフォルトの名無しさん mailto:sage [2012/01/03(火) 23:47:48.94 ]
'bの行列
For i1 = 16 To 18
For j1 = 8 To 12
'yの要素に、入れていく(1から)
For n1 = 1 To 3
For nn1 = 1 To 5
y(n1, nn1) = Cells(i1, j1).Value
Next nn1
Next n1
Next j1
Next i1

'逆行列の計算
For i2 = 1 To 4
For j2 = 1 To 5
s = 0
For k2 = 1 To 3
s = s + x(i2, k2) * y(k2, j2)
Next k2
z(i2, j2) = s
Cells(i2 + 21, j2 + 4).Value = z(i2, j2)
Next j2
Next i2
End Sub
書き込めなかったので2つに分けて書き込みます。
何卒よろしくお願いします。

633 名前:デフォルトの名無しさん mailto:sage [2012/01/03(火) 23:52:11.31 ]
>>630
すみません。もう一度理由を述べます。
なぜxboundで100ではなく20がほしかったのかというと、
自分が今から作ろうとするFEM法を使った方法でやると、
行列の数が40行くらいになってしまう可能性があるからです。
しかもその行列の数は、節点数によって変わってくるため(この辺は専門的ですみません;)
行列の数が予測できないため、最初にx(100,100)と置きました。
さすがに、100行列まではいかないだろうということで、です。

今回は試しに、20行列を作ってみたので、ひょっとすれば
xboundで20が出るのかな(つまり数字が入っているところまで)
と思いましたが駄目でした。



634 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 00:07:00.57 ]
当たり前だろ

635 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 00:08:52.43 ]
>>633
それは無理。
行列の数がわからないのであればRedimすればいい。

636 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 00:16:13.38 ]
>>633
あなたは>>501


637 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 00:18:21.02 ]
>>633
x(n, nn) に期待通り取り込まれているのは確認できているか

638 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 00:19:00.82 ]
もはや"xbound"とか勝手な事書いてるけど、
"UBound"ってのはあくまでも配列の上限を返す関数であって
その配列の中でどこまで実際に値が入ってるかを調べるものじゃないから
そういう使い方は出来ない。

っつーか貴方、ここ最近行列云々で質問続けてる人だったのね?
VBAのこと事前に学習してないでしょ?

試行錯誤は決して悪いことじゃないけど、
中途半端な知識でプログラミングして失敗するよりも
一度きちんと学習してからプログラミングしたほうが良いと思うよ。
どっち道失敗はするだろうけど、今みたいなどうでも良い間違いは減ると思う。
本を買うなりWeb上の解説サイトを読むなり、多少基礎知識つけてから出直したほうが
ゴールに早くたどり着けるはずだよ。
こっちだってこんなどうでも良いこと質問されるのも正直迷惑だし。



639 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 00:23:42.80 ]
>>637
今確認しました。期待通りではなかったです…
なぜか、yはすべての成分が121の3行5列で、
xはすべての成分が20の4行3列でした。


640 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 00:31:33.33 ]
>>639
For〜Nextが理解できていない

641 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 00:37:38.67 ]
すみません。。たしかにfornextの部分頭の中でやっておかしいですね。。。
もう昨日の夜の12時からまったくの不眠不休でほかの研究作業もやりながらなので
ぜんぜん思考回路が回っていません。

寝て、もう一度再プログラムしてみます。失礼しました。




642 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 00:39:14.20 ]
もうすこし自分で考えてきてから質問してね
ここの人たちだって貴重な時間を割いてアドバイスしてくれてるのよ


643 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 09:05:14.29 ]
答えたくて答えてるだけだろ
思いっきりスレチだから
答えてる方も荒らしだから

644 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 10:18:47.09 ]
Range("A100").Formula = "=countif(A1:A80,""<=2"")"
<=2の部分をA90の値にしたいのですがどう書けばいいんでしょうか

645 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 10:34:11.32 ]
"=countif(A1:A80,""" & Range("A90").Value & """)"


646 名前:644 mailto:sage [2012/01/04(水) 10:41:57.67 ]
ありがとうございます!

647 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 10:44:32.37 ]
おはようございます。>>642、643 まことに大変申し訳ございません。。。
最後の質問です。この分野さえ終わることができれば終了です…
以下の行列の逆行列を求めようとしましたができませんでした。。

1 2 2
1 1 5
1 2 1


答えが 
-9 2 8
4 -1 -3
1 0 -1
ですが、
0 0 0
1 0 0
1 2 0

になってしまいました;


648 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 10:45:33.63 ]
コードは以下です。
Sub 逆行列()
Dim x As Double
Dim A(100, 100) As Double
For i = 1 To 3
For j = 1 To 6
A(i, j) = Cells(i, j).Value

'ちゃんと数字が入っているか確認
Cells(i + 5, j).Value = A(i, j)
'確認OK
Next j
Next i
'逆行列計算
For k = 1 To 3
x = A(k, k)
For j = k To 6
A(k, j) = A(k, j) / x
Next j
For i = 1 To 3
If i = k Then
x = A(i, k)
For j = k To 6
A(i, j) = A(i, j) - x * A(k, j)
Next j
End If
Next i
Next k





649 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 10:47:50.04 ]
'ここでAをセルに代入
For i = 6 To 8
For j = 6 To 8
Cells(i + 10, j + 1).Value = A(i - 5, j - 5)
Next j
Next i

End Sub


www.econ.nagoya-cu.ac.jp/~kamiyama/siryou/minv.html
このページを参考にしました

650 名前:デフォルトの名無しさん [2012/01/04(水) 12:58:01.29 ]
"=countif(A1:A80,""" & Range("A90").Value & """)"
これでセルの値を指定することができたのですが
<=を入れるとエラーになってしまいます
あとRCを使ったやり方で<=をつけるにはどうしたらいいですか?

651 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 13:30:28.28 ]
ここはVBAのスレです

VBAでの式入力方法ならまだしも
それ以前の式の作り方についてはスレ違い

652 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 14:26:11.02 ]
>>650

" で囲まれた中に " 自体を記述したいときは "" と2つ続けて書く

だから、

=countif(A1:A80,"<=2")

の前後を"で囲むと

"=countif(A1:A80,""<=2"")"

になる。

また、""で囲まれた部分は文字列だから、
& で他の文字列や文字列型変数と結合できる

つまり、 上記の式の"2"の部分をA90の値に変更したいなら、
"2"以前の部分の文字列と"2"以降の部分の文字列を作って、
Range("A90").Valueを & ではさめばよい。
(>>645は"<=2"をA90の値に置き換えてる)
ちなみに"2"以前の部分は
"=countif(A1:A80,""<="
になる。
後ろのほうは>>645とおなじだから後は自力でやって

653 名前:デフォルトの名無しさん [2012/01/04(水) 14:38:33.01 ]
普通のカッコ ( ) は、たとえば数学の計算式では
y=(-b+(b^2-4ac))/2a
のようにいくらでもネスト構造がありえるのに

なぜダブルクオーテーション " は、内部のは二つ重ねるルールにしたのですか?
欠点は、三重以上に重ねられなくなってしまってないですか?
二つ重ねるルールの利点を挙げてください。

654 名前:653 [2012/01/04(水) 14:39:41.54 ]
疑問の一つに、

=countif(A1:A80,"<=2")
の前後を"で囲むと
"=countif(A1:A80,""<=2"")"
になるなら、

"=countif(A1:A80,""<=2"")"
の前後をさらに"で囲むとどうなるの?

655 名前:653 [2012/01/04(水) 14:40:31.63 ]
オフィス田中の人は、このダブルクオーテーションのネストについて
なにか研究成果を発表はしてないのですか?

656 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 14:54:58.92 ]
単純すぎて研究するほどのことでもあるまいに

文字列の囲い記号(開始記号と終了記号)が「"」の場合
囲い記号としてではなく文字として「"」を表したくても
途中に"を入れるとそれが「文字 "」なのか「囲い終了記号」なのか判別できない

そこで、囲い開始記号以降の「"」は、1つなら「囲い終了記号」、
2つなら「文字 "」として扱うというルールにしただけのこと

この単純なルールだけで
> 三重以上に重ねられなくなってしまってないですか?
なんて欠点も無く、どんなものでも表現できる

657 名前:デフォルトの名無しさん [2012/01/04(水) 14:59:18.98 ]
できましたw
自力では無理だったと思うので助かりました
"=countif(A1:A80,"">=" & Range("A90").Value & """)"

658 名前:デフォルトの名無しさん [2012/01/04(水) 15:09:23.33 ]
redim kmax(100,100,100) as double
redim k(100,100) as double


for zzz=1 to 5
for z1=1 to 100

for z2=1 to 100
kmax(z1, z2, zzz) = k(z1, z2)
next z2
next z1

next zzz
とすると、kmaxの(z1,z2)の部分にはちゃんと、kの(z1,z2)は入るのでしょうか?




659 名前:デフォルトの名無しさん [2012/01/04(水) 15:14:55.75 ]
>にはちゃんと、kの(z1,z2)は入るのでしょうか?


自分で試せよ w

660 名前:デフォルトの名無しさん [2012/01/04(水) 15:20:51.45 ]
>>656
なるほど、あなた超頭いいですね。
こういう"の用法をたとえば本で書くときに
>>656の説明までちゃんと書いてくれてる本の作者こそ
物を書くセンスがあるといえる。
いままで"の由来について書かれたものは見たことがなかった。
>>656さんは自分でこの考えを発見したの?

そうすると、先の
「"=countif(A1:A80,""<=2"")" の前後をさらに"で囲むとどうなるの?」
の回答は、こうなるね。↓

"""=countif(A1:A80,""""<=2"""")"""

661 名前:デフォルトの名無しさん [2012/01/04(水) 15:21:30.46 ]
ここで皆に宿題だが
「"""=countif(A1:A80,""""<=2"""")"""」をさらに"で書くと、どうなるかね?

662 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 15:30:48.26 ]
>>660
俺は

VB言語では文字リテラルの囲いは「"〜"」
VB言語では「文字 "」のエスケープシーケンスは「"」

という説明を本で読んで、それをちょっと詳しく解説しただけで
このルールを発案した人じゃないから、べつにそう大げさに褒められるほどのものじゃないが

663 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 16:17:05.03 ]
早く 冬休み終わらないかなーー
スレチ話しがウザイ

664 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 16:28:28.39 ]
ちょっとしたスレチ話にムキになって突っかかっていくような幼稚な奴も
冬休みが終れば消えますかね?

665 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 16:31:25.24 ]
残念、永遠に冬休みでした

666 名前:デフォルトの名無しさん [2012/01/04(水) 16:49:58.19 ]
スレチを指摘する人はいるけど
適切なスレに誘導する人はあまりいないね。
そのほうがウザイスレチ話が減って有益だと思うんだけどな。

スレチ話ですまん。


667 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 17:32:31.98 ]
ここ以外でVBAを扱ってるスレはないからね

668 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 17:48:08.95 ]
そうでもないけどね



669 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 18:32:42.17 ]
>>647 をお願いします。。。

670 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 19:20:53.96 ]
>>669
これが最後ね

Sub 逆行列2()
Dim A
Dim x As Double
Dim z
Dim i As Long, j As Long, k As Long

A = Range("a1").Resize(3, 6)

For k = 1 To 3
x = A(k, k)
For j = k To 6
A(k, j) = A(k, j) / x
Next j
For i = 1 To 3
If i <> k Then
x = A(i, k)
For j = k To 6
A(i, j) = A(i, j) - x * A(k, j)
Next j
End If
Next i
Next k

Range("a10").Resize(3, 6) = A

End Sub

671 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 20:33:36.18 ]
>>670
もう来るなよ

672 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 21:57:59.60 ]
>>671
>>669に言えよ w

673 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 23:36:33.96 ]
間違ってはいない

674 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 23:38:23.54 ]
そう言えば、前スレで話題になったサンプルコレクションの本、第3版出たのね。

パラパラ見たけど、印刷文字薄くて見にくくなってた。でも、2010での動作可否が載ってるのはいいなと思た。

参考までに…


675 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 14:07:22.28 ]
Dこーてーしょんは、ユーザー自作メニューを汎用コードで作る時に地獄をみるのだ

676 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 22:22:32.41 ]
ボタンとかラベルとか動的に作成するとこはできますか?
出来る場合、動的に作成した物へのアクセスはどうすれば良いですか?

677 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 23:04:23.48 ]
私の辞書に調べるという文字はない

678 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 23:19:10.07 ]
>>676
VBAは知らんが、普通のOOPなら、できて当然だな
ボタンなりラベルなりのオブジェクトを作ってビューに配置
してやればいいだけだもんな
アクセスも自分で作ったオブジェクトだからわかるし



679 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 00:03:31.02 ]
>>676
たとえばボタンを作成して制御するなら
Dim button1 As Object
Set button1 = ActiveSheet.Buttons.Add(200, 200, 100, 25) ' left, top, width, height
button1.OnAction = "Macro2"

既存のボタンにアクセスするなら
Dim button1 As Object
Set button1 = ActiveSheet.Buttons(ボタンのインデックス)

たぶん

680 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 00:03:40.27 ]
VBA知らん奴が何しに来たの?ん?質問かい?

681 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 00:12:11.56 ]
VBA(VBも?)の場合、オブジェクト変数に代入する場合、
変数名の前にSetをつけなければならない理由はなんなのでしょうか?

そういう言語仕様だからというだけでしょうか?
それとも、同じオブジェクト変数に代入する場合でも、Setを伴う場合と
伴わない場合の2ケースあるのでしょうか?

682 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 00:49:42.22 ]
引数が9つある関数って他人が見たらどう思う?

683 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 00:59:14.44 ]
それなりの理由があれば問題無いな。
Excelのメソッドも、省略可能とはいえ引数がやたら多いのが結構あるし。

684 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 01:05:06.22 ]
>>681
もともと初期の vb にはオブジェクトの概念がなく、後付けでオブジェクトを導入したとき、
既存仕様を維持してオブジェクトをサポートするために、特別な Set キーワードを導入した
とかそんな話だった気がする

Dim a
Dim b
Set a = Range("b2")
b = Range("b2")

変数 a には Range オブジェクトが格納される
変数 b には Range オブジェクトのデフォルトプロパティが格納される

685 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 01:16:11.71 ]
>>684
変数にオブジェクトは格納されないよ〜

686 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 01:16:15.37 ]
>>684
なるほど、SetありもSetなしも文法上は許容されるのですね
であれば、Setキーワードの意味はありますね

この例でいうと、デフォルトプロパティは何を指しているのでしょうか?

687 名前:684 mailto:sage [2012/01/06(金) 01:55:17.69 ]
>>685
すみません、オブジェクトの参照ですね

>>686
厳密にはかなり面倒で、
Range には _Default という隠しプロパティがあってそれがデフォルトプロパティになるらしい
_Default には引数(RowIndex, ColumnIndex)を与えることができて、
引数ありだと Item(引数)の評価結果、引数なしの場合は Value の評価結果を返すらしい

まあ、通常は Value と覚えておけばよいかと

688 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 02:27:20.28 ]
Setは参照の代入だが、Setは省略できないぞ
Letっていう値を代入する命令があって、これは省略できる(というか書いてる事がほとんどない)
文法的には省略されてるのはLet



689 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 02:30:27.74 ]
>>688
つまり、>>684

Dim a
Dim b
Set a = Range("b2")
b = Range("b2")

のb = 〜の行は、

Let b = Range("b2")

と解釈されて、そのとき代入されるのが_Defaultプロパティということ?


690 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 03:07:22.43 ]
>>689
うん

691 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 03:11:34.65 ]
Letなんてキーワード見たの何年ぶりだろ
昔の教科書には必ず書いてあったけど最近の入門書は最初からスルーしてるよな

試してみたらこれはエラーになった

Let a = Range("A1")._Default

692 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 07:21:26.80 ]
>>691
Let a = Range("A1").[_Default]

693 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 07:30:27.21 ]
LETとかN-BASICですら使ったことがないなw

694 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 09:57:24.70 ]
やたら丁寧なコードを書くやつがよくLet使ってたな。
長く書くのが趣味だったんだな。

695 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 19:40:30.41 ]
>>681
>>457じゃないよね?

696 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 20:07:54.28 ]
凄くどうでもいいです……

697 名前:681!=467 mailto:sage [2012/01/06(金) 22:35:09.33 ]
>>695
ちがいます

698 名前:681!=457 mailto:sage [2012/01/06(金) 22:35:30.94 ]
>>697
あミスったw



699 名前:681!=457 mailto:sage [2012/01/06(金) 22:36:55.85 ]
>>690
どうもありがとうございました。
了解しましたm(_ _)m

700 名前:デフォルトの名無しさん [2012/01/07(土) 02:53:29.64 ]
質問です。
beebee2see.appspot.com/i/azuYl9K_BQw.jpg
このように、選択してある[C]の列だけを別の場所(あらかじめ決めているCという枠)へ移したい場合はどうすればいいのでしょうか?
コピーは出来なかったのです。

701 名前:デフォルトの名無しさん mailto:sage [2012/01/07(土) 07:40:10.04 ]
Areasプロパティ

702 名前:デフォルトの名無しさん [2012/01/07(土) 09:12:33.09 ]
>>700

質問の仕方が悪いと思うよ

Excelで単純に"C"と書いたら、通常はシート左端から3列目の"C列"のことだと思われる。
貴方が貼った画像だと"A列"に"C"と書いてある"2","3","4","9"の"行"が選択されてる。
コピーしたいのは選択範囲の"すべての行"なのか、それとも選択範囲の"C列"なのか、
どっちか分からない。


703 名前:デフォルトの名無しさん [2012/01/07(土) 09:50:23.96 ]
>>700
ふつうにA列をフィルタして
抽出されたセルたちを「切り取り」して
他所に「貼り付け」してOKと思ったけど、

うまくできないね。
「切り取り」して「貼り付け」だと、フィルタで隠れた行まで移動してしまう。
「コピー」して「貼り付け」だと、フィルタしたものだけがコピーされるのに。

自分もこんな発見をして勉強になったよ。
力にはなれなかったけど、うまくいく方法が見つかるといいね。

704 名前:デフォルトの名無しさん mailto:sage [2012/01/07(土) 09:51:31.30 ]
>>702
すいませんでした。
2.3.4.9の選択されている行です。

705 名前:デフォルトの名無しさん mailto:sage [2012/01/07(土) 12:53:42.20 ]
22 名前:名無し募集中。。。[] 投稿日:2012/01/06(金) 23:40:34.39 0
AKB=金正恩

この意味わかるか
AKBという捏造ブームの裏に何があるか見えるか?




706 名前:デフォルトの名無しさん mailto:sage [2012/01/07(土) 12:56:07.04 ]
>>700
選択範囲は Application.Selection で取得できるけど、
選択範囲が複数になる場合、Application.Selection.Areas に各選択範囲(Rangeオブジェクト)のコレクションが格納される

面倒だけど、最初に Areas の値を保存しておいて、ループ処理で各 Range 毎に処理するとかになるんじゃないかなあ

707 名前:デフォルトの名無しさん mailto:sage [2012/01/07(土) 13:16:59.99 ]
>>700
とりあえず手動で今の状態からコピーしたいなら複数行の選択じゃなくセル範囲の選択でコピーしたら
貼り付け先には飛ばした行を詰めて貼り付けできるけど。


708 名前:デフォルトの名無しさん mailto:sage [2012/01/07(土) 15:02:44.54 ]
>>700
関数使いたいなら作業列使えば可能

作業列1 =IF($J$2=A2,COUNTIF($A$2:A2,A2),"")
作業列2 1から連番
作業列3 =MATCH(G2,$E$2:$E$28,0)
L列 =IFERROR(INDEX($B$2:$B$28,H2),"")
M列 =IFERROR(INDEX($C$2:$C$28,H2),"")

ozcircle.net/_uploader/69930900

常にデータが増える表ならVBAの方が楽だけどそうでもないなら関数の方が早い。



709 名前:デフォルトの名無しさん mailto:sage [2012/01/07(土) 15:28:48.21 ]
>>704
やっぱりよく分からない
複数選択範囲(行単位)の移動(カット&ペースト)が行いたいが、通常では複数選択範囲のカットができない、というだけ話なら
移動先を ActiveSheet.Range("100:100") と仮定した場合、

Application.Selection.Copy(ActiveSheet.Range("100:100"))
Application.Selection.Delete()

のようにコピー+削除でいけると思うけど、そういう話ではないの?

710 名前:デフォルトの名無しさん mailto:sage [2012/01/07(土) 18:08:58.21 ]
>>703.>>706->>709
レスありがとうございます!
>>700の者です!
初心者かつ、語彙力がなく、説明不足ですいません。
わからなかった言葉もぐぐってみます!

>>709さんの回答が一番近いと思うのですが、
私はカットではなく、[A.B.C]とグループ分けをしたうちの[C]だけを別のページをコピーペーストしたいです。

簡単にいうと、複数選択のコピーの方法が知りたいです。

beebee2see.appspot.com/i/azuY3Iu-BQw.jpg

この画面でいうと、3.5.6.7.12.15行目をコピーしたいです。
右クリックでコピーを選択すると
beebee2see.appspot.com/i/azuYvILBBQw.jpg
このような画面が出ます。

一つ一つ貼っていくには膨大な量なので時間が足りません。

皆さんが教えて下さった数式(?)関数(?)を今から試してみようと思います!
それらが出来たらまたここに来て見ます。

何度もすいません、もう少しお付き合い下さい…
ありがとうございます。







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

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

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