実現したいこと
Excel VBA で、データベースへ取り込むためのマスターシートを作成中です。
VBAは他の方が作ったものを業務で使用していたことは多々ありましたが、
自分でゼロベースから作成するのが、今回初めてになります。
色々調べて、何とか少しずつ理解し、進めているのですが、
上手くいかないことが多く、質問させていただきました。
・・・超初心者で恥ずかしいですが、今後のためにも習得したいです。
どなたかご教示いただけると幸いです。宜しくお願い致します。
【やりたいこと①】
シート①にあるデータを、必要な項目だけを抜粋して、シート②に転記したい。
この時シート①にあるデータは、毎月行数が変わるので、
何行目まで必要になるか不明。
また、B列からD列の値がブランクでも、E列以降に値が入っていたら、
その行はシート②に転記が必要。
ある特定の文字列(例えば"小計")がある行まで処理が進んだら、
その行以降はシート②に転記せず終了する。
文章で表しにくかったので、画像を。。。
例えば、品目が「バナナ」で、2行目はA列からG列まで値が入っているので、
これは2行目を全てシート②へ転記。
3行目はA列からC列はブランク⇒C列からG列まで値が入っているので、
このC列からG列までの値を上記で転記した行の下に追記。
7行目まで、同じ処理をしたい。
D列の<小計>がある行は転記不要なので、この"<小計>"の文字列に来たら、
転記せず、次の処理に進みたい。
次の処理とは、
品目が「マンゴー」で、
10行目はA列からG列まで値が入っているので、
これは10行目を全てシート②へ転記。
11行目から13行目まではA列からC列はブランク⇒C列からG列まで値が入っているので、このC列からG列までの値を上記で転記した行の下に追記。
*「バナナ」の時と同じ要領で行いたいです。
シート②の貼付先シートの完成図は
以下の画像のようになるように処理を行いたいです(可能でしたら)
【やりたいこと②】
シート①にある、該当するセルの値(文字列)を、シート②に値として転記したいが、
そのシート①にあるセルの値(文字列)は、行・列ばらばらに入っているので、
繰り返し処理がうまく書けない。
色々やっても自分で書いたソースでは、値を抽出できなかったので、
恥ずかしながら、この処理は「マクロの記録」で行ったものです。単純にシート①にある必要な値をコピペでシート②に貼り付けした作業です。
【やりたいこと③】
シート①のあるセルに入っている値を、シート②の所定の箇所に転記した際、
数字が一桁なら、頭に一つ0をつけて表示したい。その時この抽出した値の
先頭に"WK"という文字列をつけて、"WK01"、"WK02"~"WK15"などと表示させたい。
私の書き方が誤っているせいだと思うのですが、
一つのプロシージャ内に、まとめて処理を記述すると、
必ずどちらかが動かず(もしくはエラーが出ました)、
処理が進まないので、今はひとまずVBAの基本の基本から手を動かして覚えなくては!
と思い、一つの処理に対して、一つのソースコードを書いています。
該当のソースコード
【やりたいこと①のソースコード】
Sub Weeklyシート加工() Dim S1 As Worksheet, S2 As Worksheet 'S1は"Weekly"シート 'S2は"Weeklyシート加工"シート Set S1 = Worksheets("Weekly") '元データ Set S2 = Worksheets("Weeklyシート加工") '転記先 '"Weekly"シート(元データ)の値を"Weeklyシート加工"シート(貼付先)に転記する S1.Range(S1.Cells(5, 2), S1.Cells(5, 9)).Copy S2.Range(S2.Cells(2, 3), S2.Cells(2, 10)) End Sub
⇒S1.Range(S1.Cells(5, 2), S1.Cells(5, 9)).Copy S2.Range(S2.Cells(2, 3), S2.Cells(2, 10))
この部分を繰り返しすればいいのかも知れませんが、loop処理方法が分かりません。シートとセルの指定で混乱してしまい、指定の行まで順に処理を進め、上記に記載した、「B列からD列の値がブランクでも、E列以降に値が入っていたら、
その行はシート②に転記が必要。
ある特定の文字列(例えば"小計")がある行まで処理が進んだら、
その行以降はシート②に転記せず終了する。」
という処理をしたいです。
【やりたいこと②】のソースコード
Sub WK抽出() ' ' CalendarからWK_No.を抽出 ActiveCell.FormulaR1C1 = "='[2019 Calendar FM.xlsx]Calendar'!R9C9" Range("E4").Select ActiveCell.FormulaR1C1 = "='[2019 Calendar FM.xlsx]Calendar'!R10C9" Range("E5").Select ActiveCell.FormulaR1C1 = "='[2019 Calendar FM.xlsx]Calendar'!R11C9" Range("E6").Select ・・・・・以下同上と同じ処理を繰り返しています。 ActiveCell.FormulaR1C1 = "='[2019 Calendar FM.xlsx]Calendar'!R32C36" Range("E75").Select End Sub
Calendarのイメージ
【やりたいこと③】のソースコード
Sub 値に変換() Range("E3:E74").Select Range("F3:F74").Select Range("F3:F74").Value = Range("E3:E74").Value Selection.Copy ActiveWindow.SmallScroll Down:=-72 Range("F3").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False ActiveSheet.Paste Application.CutCopyMode = False End Sub
Sub 【やりたいこと③ 転記用データ() ⇒頭に"WK"の文字列をつけるソースコード】
Sub 転記用データ() ActiveCell.FormulaR1C1 = "=IF(RC[-1]<>"""",""WK"" & RC[-1],"""")" Range("G3").Select Selection.AutoFill Destination:=Range("G3:G74") Range("G3:G74").Select ActiveWindow.SmallScroll Down:=60 Range("G3:G74").Value = Range("G3:G74").Value End Sub
【やりたいこと②と③のイメージ】
赤枠内の値(文字列として)、別シートに転記したい。
*下記の自分のソースコードで実行すると、文字列として抽出したいのに、
計算式が入った状態でしか抽出できず、以降の作業でエラーを出さないために、
値で取るようにと言われています。なので、自分で考えたのが、次の画像に
あるように、隣の列で文字列に変換する処理です。
この文字列に変換した値を、さらに隣の列"DB用"に、
値が一桁の数字なら頭に0をつけて見た目を揃え、更にその文字列の頭に
"WK"を付ける処理を行いたいです。
宜しくお願い致します。
teratailに登録したばかりで、質問文がわかりににく、
申し訳ございません。

回答5件
あなたの回答
tips
プレビュー