Sheet2に1051行、28列のデータがあります。1列、3列には全部の行にデータがあります。
Sheet2のデータからIf分を使って抽出されたデータをSheet1の転記しています。
Sheet1は1,2行目に表題、発行日などがあり、3行目が項目にいなって4行目から抽出データが入るようになっています。行は1000行まであります。下記のコードを配列に書き換えるとどのようになるか教えてください。今のままで特に時間がかかるわけではないのですが、変数の意味、配列でのIf文の書き方が知りたいです。
Sub KousinMeibo()
Dim wS1 As Worksheet, wS2 As Worksheet, wS3 As Worksheet
Set wS1 = Worksheets("Sheet1")
Set wS2 = Worksheets("Sheet2")
Set wS3 = Worksheets("Sheet3")
wS2.Select
Dim cnt
Dim rw
Dim i, j, l, m As String
i = "前回 "
j = "札付 /"
l = "~ /"
m = "/"
wS1.Unprotect
With wS1
wS1.Range("B2").Value = wS3.Range("I15").Value
wS1.Range("K1").Value = wS3.Range("I16").Value
wS1.Range("H1").Value = Date
rw = 4
.Range("B4:N1300,P4:T1300").ClearContents
Application.EnableEvents = False
Application.ScreenUpdating = False
For cnt = 2 To 1051
If wS2.Range("W" & cnt).Value = wS3.Range("I15").Value _
Or wS2.Range("N" & cnt).Value = 1 And wS2.Range("K" & cnt).Value < Worksheets("表紙").Range("I16").Value Then
Application.StatusBar = cnt & "回目の処理をしています..."
.Range("B" & rw).Value = wS2.Range("Q" & cnt).Value + vbLf + wS2.Range("C" & cnt).Value
.Range("C" & rw).Value = wS2.Range("E" & cnt).Value + vbLf + wS2.Range("D" & cnt).Value _
+ vbLf + wS2.Range("F" & cnt).Value
.Range("D" & rw).Value = wS2.Range("J" & cnt).Value
.Range("E" & rw).Value = wS2.Range("L" & cnt).Value
.Range("F" & rw).Value = wS2.Range("W" & cnt).Value
.Range("G" & rw).Value = wS2.Range("X" & cnt).Value
.Range("H" & rw).Value = m
.Range("I" & rw).Value = i & wS2.Range("N" & cnt).Value
.Range("J" & rw).Value = wS3.Range("I16").Value
.Range("K" & rw).Value = l
.Range("M" & rw).Value = j
.Range("N" & rw).Value = wS2.Range("AB" & cnt).Value
.Range("Q" & rw).Value = wS2.Range("C" & cnt).Value
.Range("R" & rw).Value = wS2.Range("D" & cnt).Value
.Range("S" & rw).Value = wS2.Range("K" & cnt).Value
.Range("T" & rw).Value = wS2.Range("X" & cnt).Value
rw = rw + 1
End If
Next
End With
Application.EnableEvents = True
Application.ScreenUpdating = True
Application.Goto wS1.Range("B1")
Application.StatusBar = False
wS1.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
End Sub
No.2ベストアンサー
- 回答日時:
こんにちは
>配列の勉強をしています
少し乱暴な回答ですみませんでした
#1で使用しているは配列の参考サイトです
エクセルの神髄 _ 鵜原パソコンソフト研究所
https://excel-ubara.com/excelvba1/EXCELVBA414.html
https://excel-ubara.com/excelvba1/EXCELVBA413.html
よねさんのWordとExcelの小部屋
http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/v …
理解と言うよりは、実際に行い(実験)ながら覚える方が良いと思います
質問とは関係ない所なのですが・・・
Rangeオブジェクトなどとの混同を避ける為?setが無いので良いのだけれど
aryWs2 = wS2.Range("C2:AB1051") は
aryWs2 = wS2.Range("C2:AB1051").Value とするべきかも知れません
ただ、aryWs2(cnt, 21).Valueなどはダメ
Dim cnt
Dim rw
Dim i, j, l, m As String
i = "前回 "
j = "札付 /"
l = "~ /"
m = "/"
i j l はStringになりませんのでご注意を (As Variant)
また、じょうすうで決まっているのなら
Const i As String = "前回 " のような書き方の方が良いかも知れません
Dim cnt As Long, rw As Long
配列のインデックスやRangeの行方向のカウント変数には、個人的にLong型を使っています
(もちろん今回は範囲が限定的なのでAs Integerでも範疇ですね)
あと・・
Worksheets("表紙").Range("I16").Value
wS3.Range("I15").Value
wS3.Range("I16").Value
についてもループ内で繰り返されるので
あらかじめ変数に格納してしまうのが好ましいかと・・
検証が遅れてしまって申し訳ありません。
何しろ配列のコードに慣れないため戸惑っています。
インデックスの間違い、1か所がありましたがあとは完璧でした。
配列なしのコードと同じ結果が得られました。
類似のプログラムが十数本ありますので、それを配列に直しながら勉強していきたいと思います。
ご指摘の箇所も変数直します。
ありがとうございました。
No.1
- 回答日時:
こんにちは
>変数の意味、配列でのIf文の書き方が知りたいです。
具体的なものが判らないので何とも・・ 検索などで調べた方が良いかと
>下記のコードを配列に書き換えるとどのようになるか教えてください。
説明とコードが若干違うように思いますが・・コード内の実数を参考に書いて見ると・・(参考になるか分かりませんが)
With wS1
wS1.Range("B2").Value = wS3.Range("I15").Value
wS1.Range("K1").Value = wS3.Range("I16").Value
wS1.Range("H1").Value = Date
.Range("B4:N1300,P4:T1300").ClearContents
Application.EnableEvents = False
Application.ScreenUpdating = False
Dim aryWs2, aryWs1a, aryWs1b
ReDim aryWs1a(1 To 1300, 1 To 13), aryWs1b(1 To 1300, 1 To 4)
aryWs2 = wS2.Range("C2:AB1051")
rw = 1
For cnt = LBound(aryWs2) To UBound(aryWs2)
If aryWs2(cnt, 21) = wS3.Range("I15").Value Or aryWs2(cnt, 12) = 1 And aryWs2(cnt, 9) < Worksheets("表紙").Range("I16").Value Then
Application.StatusBar = cnt & "回目の処理をしています..."
aryWs1a(rw, 1) = aryWs2(cnt, 15) + vbLf + aryWs2(cnt, 1)
aryWs1a(rw, 2) = aryWs2(cnt, 3) + vbLf + aryWs2(cnt, 2) + vbLf + aryWs2(cnt, 4)
aryWs1a(rw, 3) = aryWs2(cnt, 8)
aryWs1a(rw, 4) = aryWs2(cnt, 10)
aryWs1a(rw, 5) = aryWs2(cnt, 21)
aryWs1a(rw, 6) = aryWs2(cnt, 22)
aryWs1a(rw, 7) = m
aryWs1a(rw, 8) = i & aryWs2(cnt, 12)
aryWs1a(rw, 9) = wS3.Range("I16").Value
aryWs1a(rw, 10) = l
aryWs1a(rw, 11) = "" 'L
aryWs1a(rw, 12) = j
aryWs1a(rw, 13) = aryWs2(cnt, 26)
'Q
aryWs1b(rw, 1) = aryWs2(cnt, 1)
aryWs1b(rw, 2) = aryWs2(cnt, 2)
aryWs1b(rw, 3) = aryWs2(cnt, 9)
aryWs1b(rw, 4) = aryWs2(cnt, 22)
rw = rw + 1
End If
Next
.Range("B4").Resize(UBound(aryWs1a, 1), UBound(aryWs1a, 2)) = aryWs1a
.Range("Q4").Resize(UBound(aryWs1b, 1), UBound(aryWs1b, 2)) = aryWs1b
End With
未検証なのでインデックス間違えていたらごめんなさい
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) なぜExit Subがあるのかわかりません 4 2023/02/19 12:34
- Visual Basic(VBA) エクセルVBAで教えて頂きたいのですが? 2 2022/12/31 20:28
- Visual Basic(VBA) VBAが止まります。 3 2022/08/31 14:09
- Visual Basic(VBA) セルS2に入力した「月」と一致したB列の右隣へセルS110の値を転記する下記マクロを実行するとエラー 2 2022/12/06 17:32
- Visual Basic(VBA) 動きっぱなしです。止め方とプロシージャの間違いを教えて下さい! 5 2022/08/15 23:08
- Visual Basic(VBA) 稀に1円合いません? Sheet1から金額と個数を貼り付ける下記コードで、金額を切り上げるコードを何 3 2022/09/05 15:11
- Visual Basic(VBA) エクセルのマクロを使ってメールを送る方法について教えてください 2 2022/03/29 01:36
- Visual Basic(VBA) 別シートのデータを参照して値を入れたい。 まとめデータシートのC列D列の値を商品一覧シートのコードが 7 2022/08/17 13:20
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) VBAでoutlook365が起動しません。 4 2022/08/25 13:31
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
教えて下さい
-
配列でデータが入っている要素...
-
【エクセル】測定時間がバラバ...
-
EXCELVBAでSQLserverからデータ...
-
VBA 空白セルを削除ではない方...
-
メモ帳(テキストデータ)をExc...
-
この行は既に別のテーブルに属...
-
C言語の度数分布の問題
-
ユーザーフォームのテキストボ...
-
CString型の文字列連結について
-
エクセルで2つの時系列のデー...
-
S9タイプからXタイプにデータ...
-
パースとはなんですか?
-
ACCESSからEXCELに出力する際、...
-
FORTRANで区切りを無視する方法
-
VBでカードリーダ(USB)のイベ...
-
チェックサムとCRC
-
データ取得時のエラーに関して
-
大学のゼミのレポートがムカつ...
-
チェックサムの実装方法について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
教えて下さい
-
【エクセル】測定時間がバラバ...
-
配列でデータが入っている要素...
-
メモ帳(テキストデータ)をExc...
-
VBA 空白セルを削除ではない方...
-
カンマからスラッシュに
-
VBA 円グラフ 特定条件に一致し...
-
特定のデータの抽出方法を教え...
-
EXCELVBAでSQLserverからデータ...
-
CString型の文字列連結について
-
[C言語] コメント文字列を無視...
-
エクセルで2つの時系列のデー...
-
多量のSUMIF式を軽くしたい
-
この行は既に別のテーブルに属...
-
ACCESSからEXCELに出力する際、...
-
Accessで該当データにフラグを...
-
ユーザーフォームのテキストボ...
-
モジュラス103の算出方法について
-
S9タイプからXタイプにデータ...
-
ブレーカー落ちで壊れたりしな...
おすすめ情報