Excel VBA 質問スレ Part39 [転載禁止]©5ch.io
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2015/11/27(金) 20:36:45.35ID:9HV+ag/s___
___ /____ヽ ____
/____\ | |´・ω・`| | /___ヽ
.l |´・ω・`| ニX二 . ̄ ̄ ̄ 二X二 |´・ω・`| l 俺たちに任せろ
!、 ̄ ̄ ̄ ヽ | | /  ̄ ̄ ̄/
ヽ_/ヽ、 ヽ__) \__/\_/. /_/ ノヽ_/
 ̄  ̄ ̄
このスレはコード書き込みOKです。
作成依頼もOKですが、作成依頼限定ではありません。
コードが嫌な人・作成依頼が嫌な人は別スレ建ててください。
※前スレ
Excel VBA 質問スレ Part38 [転載禁止]2ch.net
http://peace.2ch.net/test/read.cgi/tech/1441619979/
0002デフォルトの名無しさん
2015/11/30(月) 19:06:16.48ID:zHM+I8Nt0003デフォルトの名無しさん
2015/11/30(月) 21:18:18.94ID:QHANvkhd0004デフォルトの名無しさん
2015/12/01(火) 19:27:05.42ID:m+Ed34Zj前スレで大量のセルを処理するときは配列に入れろみたいな書きこみを見ましたが、配列が役に立つ局面を教えていただけないでしょうか。
よろしくお願いします
0005デフォルトの名無しさん
2015/12/01(火) 20:28:12.95ID:eT3ZeD+F配列処理はワークシートのレイアウトとかと無関係に独立したライブラリにしやすい。
0006デフォルトの名無しさん
2015/12/01(火) 21:07:28.65ID:3m4PeF6rZ80エミュレータからやり直せ。
0007デフォルトの名無しさん
2015/12/01(火) 21:20:20.66ID:bdqEzHLJそもそもエクセルのセル自体が広義の意味では2次元配列そのものなので
エクセルを使うという事はすなわち配列を使うことに他ならないわけです。
(A1セル一個しか使わないというなら話は別ですが、そんな人はまず居ないでしょうし。)
貴方の言う「配列」がVBAにおける「配列変数」の事であれば、
連続したデータを順に扱う、
複数のデータに対して繰り返し同じ処理をする、
といったような操作をする際には
配列変数は非常に便利(というか無しではお話にならない)です。
0008デフォルトの名無しさん
2015/12/01(火) 23:23:09.59ID:DoIn4zBF例えばワークシートに値を入力するときに
Worksheets(1).Name = "2ちゃん"
でシート1のシート名が変更されますよね。でもオブジェクト名のsheet1を使っても変更できますよね。
オブジェクト名を変えた場合にWorksheets(1)かどうか確認するのはどうやったらいいんでしょうか。
シートのプロパティウィンドウみてもオブジェクト名は書いてるけどWorksheets(1)かどうか載ってない
0009デフォルトの名無しさん
2015/12/01(火) 23:41:37.98ID:VMDnA6sJDebug.Print Worksheets("sheet1").Index
ちなみに index値は シートタブの左から 1 2 3 ・・・・
となりますので シートオブジェクトと index値は常に 一致するとは限りませんよ
0010デフォルトの名無しさん
2015/12/01(火) 23:44:42.53ID:6iNC03K1(たとえば、2015と12と入れればその下に
1
火
2
水
といったぐあいに31日まで出力してくれるようなのを目指してます)
自分なりに組んでみたのですが、なかなかうまくいきません
Offsetが悪いのかな、とも思うのですが代替案が浮かびません、どうか助言をお願いします
Excel2013です
Sub Sample()
Dim a As Range
Dim b As Variant
Dim u As Integer
Dim v As Integer
Dim w As Integer
Dim x As Integer
Dim y As Integer
Dim z As Integer
v = 0
w = Range(
0011デフォルトの名無しさん
2015/12/01(火) 23:48:55.25ID:DoIn4zBFそれではWorksheets(1)というのはシートタブの1番左という意味でいいのでしょうか?
0012デフォルトの名無しさん
2015/12/01(火) 23:49:02.31ID:6iNC03K1w = Range("B1")
z = Range("D1")
If z = 2 And Day(Dateserial(w,2,29)) = 29 Then
y = 29
Else: y = 28
If z = 4 Or 6 Or 9 Or 11 Then
y = 30
Else: y = 31
End If
End If
For x = 1 To y
w = v * 2
Range("B3").Offset(0,w) = x
b = "Weekday(w,z,x)"
u = w + 1
Range("B3").Offset(0,u) = b
Next x
End Sub
0013デフォルトの名無しさん
2015/12/01(火) 23:52:23.38ID:VMDnA6sJそゆこと
ちなみにこれで確かめてみればどうかな?
Debug.Print Worksheets(1).Name
シート名が返ります
0014デフォルトの名無しさん
2015/12/01(火) 23:57:05.93ID:DoIn4zBFなるるー
イミディエイトで確認できました!ありがと
0015デフォルトの名無しさん
2015/12/02(水) 00:19:38.80ID:iA4P55nLこんなかんじ?
日と曜日は別の列のほうが良い気もするけど(セルの書式が違っちゃうから)
Sub test()
Dim yr As Long
Dim mo As Long
Dim dy As Long
With ThisWorkbook.Sheets(1)
.Cells(3, 2).CurrentRegion.Clear
yr = .Range("B1")
mo = .Range("D1")
For dy = 1 To Day(DateSerial(yr, mo + 1, 0))
.Cells(dy * 2 + 1, 2) = dy
.Cells(dy * 2 + 2, 2) = DateSerial(yr, mo, dy)
.Cells(dy * 2 + 2, 2).NumberFormatLocal = "aaa"
Next dy
End With
End Sub
0016デフォルトの名無しさん
2015/12/02(水) 00:29:46.76ID:YKAbvKrpありがとうございます
こんなに簡素化できるものなんですね……精進します
0017デフォルトの名無しさん
2015/12/02(水) 00:33:35.11ID:BpyWczK7添削してみた
変数はわかりやすい名前にした方が良いと思うぞ
If z = 2 And Day(DateSerial(w, 2, 29)) = 29 Then
y = 29
Else: y = 28
If z = 4 Or z = 6 Or z = 9 Or z = 11 Then '変更
y = 30
Else: y = 31
End If
End If
For x = 1 To y
v = x * 2 '変更
Range("B3").Offset(0, v) = x
b = Weekday(DateSerial(w, z, x)) '変更
u = v + 1
Range("B3").Offset(0, u) = WeekdayName(b) '変更
Next x
001817
2015/12/02(水) 00:34:44.42ID:BpyWczK7>>12 さんへね
0019デフォルトの名無しさん
2015/12/02(水) 00:38:55.45ID:iA4P55nLとりあえず年(仮にyrとする)と月(仮にmoとする)が定まれば
Day(DateSerial(yr, mo + 1, 0))
つまり、翌月のゼロ日(1日の前の日)を求める事で、
その月の日数をエクセルが自動的に出してくれるんですよ
あと、セルの書式設定も日と曜日が別の列なら
曜日の列だけをNumberFormatLocal = "aaa"でいっぺんに設定できます
例えば曜日をC列にするなら
.Columns(3).NumberFormatLocal = "aaa"
だけで済むわけです
>>15みたいにループの中で1セルずつ変更するってのは
あまり格好良いもんじゃないですよね?
0020デフォルトの名無しさん
2015/12/02(水) 10:37:37.63ID:CO7jH6lO叩かれること覚悟で書きますが、同じ処理の繰り返しなら配列変数ではなくても、for next
とかfor eachステートメントでは、望ましくないのでしょうか?
00217
2015/12/02(水) 11:33:14.55ID:ZeoaW+75番号で指定すると言うことは
配列変数との親和性が高いと思いませんか?
既に言及したとおり、
エクセルのセルは2次元の配列ですから、
セルに対してfor next で繰り返し処理をするというのは
まさしく配列操作そのものなのです。
もし、広義の配列そのものではなく、
redimで宣言する狭義の配列変数のみについて
有効性を論じたいと言うのであれば、
セルに代入するよりも速度が速いとか
メモリの消費量が少ないとか、
3次元以上の配列を扱いたいケース
(まぁ、多次元配列は遅いらしいですけど)
とか、そんな理由があげられますね。
とはいえ、配列など不要だと思うならば
無理に使う必要は無いですし、
その辺は使う人の自由ですよね。
0022デフォルトの名無しさん
2015/12/02(水) 11:50:42.44ID:tBPWNP4P配列を使わず for next とはどのようなものを想定しているんですか?
00234
2015/12/02(水) 12:15:32.57ID:IdfHYqnbてっきり、配列とは
Dim i(5) as long
みたいなものだけを指すと考えており、上手い使い方がよくわかっていませんでした
0024デフォルトの名無しさん
2015/12/02(水) 12:32:59.22ID:1aVlPH12そういう固定長配列とReDimで作る可変長配列がある。>>21氏の言うところの狭義の配列ですね。
「For Nextも配列だっのですか」という文は意味不明ですが、何かを勘違いしてる?。
0025デフォルトの名無しさん
2015/12/02(水) 13:35:58.72ID:ES2jo2hu演算子を変数に格納することはできませんか?
b = ”<=”
If n & b & 10 then
みたいに使いたいのですが、型が一致しませんというエラーとなります。
00267
2015/12/02(水) 14:29:54.99ID:xdo22nBPでいけます
0027デフォルトの名無しさん
2015/12/02(水) 15:59:46.36ID:IdfHYqnb自分にとって配列とは狭義のものと、(A1:C5)みたいなものだけをだけだと思ってました。
Fornextは、配列と関係ないと考えてました
0028デフォルトの名無しさん
2015/12/02(水) 17:50:57.38ID:megPAB6Iありがとうございました!
0029デフォルトの名無しさん
2015/12/02(水) 18:37:30.73ID:l3wtZpWO配列を別の変数に格納するときは、次のようなコードで大丈夫でしょうか?一応テストでは成功していますが、なんとなく作って出来てしまったもので、、使い方が危ない場合、ご指摘お願いします。
dim varA as variant
redim a(10,0)
redim b(10,0)
if n = 0 then
varA = a()
else
varA = b()
end if
0030デフォルトの名無しさん
2015/12/02(水) 19:04:11.72ID:1aVlPH12varA = a、varA = bでいい。後ろの()は不要。varAはVariantだからそれでいける。
代入したものは元の配列のコピーであって別物だよ。コピーする意味はあまりないと思うけど?
0031デフォルトの名無しさん
2015/12/02(水) 19:26:54.23ID:UPwzPe+Lありがとうございます。助かりました!
a.bは既に要素が入ってる配列のつもりでした。
後に場合分けで参照するときにコード短縮の為に変数格納しました。
少し書き方が悪かったですね。すいません。
0032デフォルトの名無しさん
2015/12/04(金) 14:58:36.71ID:R21wXbu/0033デフォルトの名無しさん
2015/12/04(金) 17:23:30.92ID:gPECvysoできるシリーズのヤツ
お勧めはしないけど
■ このスレッドは過去ログ倉庫に格納されています