質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

1回答

476閲覧

マクロでシート同士の転記をしたい

ichijava

総合スコア3

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

1グッド

0クリップ

投稿2020/09/30 13:35

編集2020/10/01 11:27

マクロを使って、「Sheet1」から「Sheet2」に、以下のように転記したいです。
Sheet2ではSheet1の日付セルの最大値と最小値を取得し、1ヶ月ごとに羅列します。

そこでさらに別のマクロで以下の2点を実装したいです。

・担当者をC列に転記していきます。(重複するものは転記しない)
・各担当者の行の数字を転記していく。(この時、年月日が重複する場合は加算する)

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

icecleam👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kuma_kuma_

2020/09/30 15:17 編集

質問者様 処理を小出しにしてますが、もうこれは「作成依頼」と変わりません。 「やってほしいことだけを記載した丸投げの質問」に抵触します。 あと以前と別ユーザで入られていますよね?悪質ですよ
ttyp03

2020/09/30 23:55

コード提示されてますが、中身ないじゃないですか。 丸投げと同じですよ、これは。
guest

回答1

0

以下のコードでいかがでしょうか。
「Microsoft Scripting Runtime」へ参照設定してください。

VBA

1Option Explicit 2 3Const cnsWsh1RowBgn = 2 4Const cnsWsh1Col担当者 = 3 'C列 5Const cnsWsh1Col年月日Bgn = 4 'D列 6Const cnsWsh1Col年月日End = 12 'L列 7Const cnsWsh2Row年月日 = 2 8Const cnsWsh2RowBgn = 3 9Const cnsWsh2Col担当者 = 3 'C列 10Const cnsWsh2Col年月日 = 4 'D列 11 12Sub SheetTenki2() 13 Dim lngWsh1Row As Long 14 Dim lngWsh1RowEnd As Long 15 Dim strWsh1担当者 As String 16 Dim lngWsh1Col As Long 17 Dim datWsh1年月日 As Date 18 Dim lngWsh2Row As Long 19 Dim lngWsh2Col As Long 20 Dim lngWsh2ColEnd As Long 21 Dim datWsh2年月日 As Date 22 Dim wsh1 As Worksheet 23 Dim wsh2 As Worksheet 24 Dim dctWsh2Row担当者 As Dictionary 25 Dim dctWsh2Col年月日 As Dictionary 26 Dim var As Variant 27 28 Set wsh1 = Worksheets("Sheet1") 29 Set wsh2 = Worksheets("Sheet2") 30 Set dctWsh2Row担当者 = New Dictionary 31 Set dctWsh2Col年月日 = New Dictionary 32 33'設定先消去 34 35 wsh2.Range(wsh2.Cells(cnsWsh2RowBgn, cnsWsh2Col担当者), wsh2.Range("A1").SpecialCells(xlCellTypeLastCell)).ClearContents 36 37'年月日のDictionaryの設定 38 39 lngWsh2ColEnd = wsh2.Cells(cnsWsh2Row年月日, wsh2.Columns.Count).End(xlToLeft).Column 40 For lngWsh2Col = cnsWsh2Col年月日 To lngWsh2ColEnd 41 datWsh2年月日 = wsh2.Cells(cnsWsh2Row年月日, lngWsh2Col).Value 42 dctWsh2Col年月日(datWsh2年月日) = lngWsh2Col 43 Next lngWsh2Col 44 45'担当者のDictionaryの設定 46 47 lngWsh1RowEnd = wsh1.Cells(wsh1.Rows.Count, cnsWsh1Col担当者).End(xlUp).Row 48 lngWsh2Row = cnsWsh2RowBgn - 1 49 For lngWsh1Row = cnsWsh1RowBgn To lngWsh1RowEnd 50 If IsDate(wsh1.Cells(lngWsh1Row, cnsWsh1Col担当者).Offset(, 1).Value) = False Then 51 strWsh1担当者 = wsh1.Cells(lngWsh1Row, cnsWsh1Col担当者).Value 52 If dctWsh2Row担当者.Exists(strWsh1担当者) = False Then 53 lngWsh2Row = lngWsh2Row + 1 54 wsh2.Cells(lngWsh2Row, cnsWsh2Col担当者).Value = strWsh1担当者 55 dctWsh2Row担当者(strWsh1担当者) = lngWsh2Row 56 End If 57 End If 58 Next lngWsh1Row 59 60'値の加算 61 62 For lngWsh1Col = cnsWsh1Col年月日Bgn To cnsWsh1Col年月日End 63 For lngWsh1Row = cnsWsh1RowBgn To lngWsh1RowEnd 64 var = wsh1.Cells(lngWsh1Row, lngWsh1Col).Value 65 Select Case True 66 Case var = "" 67 Case IsDate(var) 68 datWsh1年月日 = var 69 Case IsNumeric(var) 70 strWsh1担当者 = wsh1.Cells(lngWsh1Row, cnsWsh1Col担当者).Value 71 lngWsh2Row = dctWsh2Row担当者(strWsh1担当者) 72 lngWsh2Col = dctWsh2Col年月日(datWsh1年月日) 73 wsh2.Cells(lngWsh2Row, lngWsh2Col).Value = wsh2.Cells(lngWsh2Row, lngWsh2Col).Value + var 74 End Select 75 Next lngWsh1Row 76 Next lngWsh1Col 77 78 Set dctWsh2Col年月日 = Nothing 79 Set dctWsh2Row担当者 = Nothing 80 Set wsh2 = Nothing 81 Set wsh1 = Nothing 82 83End Sub

投稿2020/09/30 20:36

編集2020/09/30 22:59
kitasue

総合スコア314

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kuma_kuma_

2020/10/01 11:30

この人にコード丸投げしちゃだめだよ 「やってほしいことだけを記載した丸投げの質問」を繰り返し 指摘を受けると削除してユーザまで変えて再質問を繰り返しているんだから 気をつけないとkitasueさんが違反行為の加担者になってしまいますよ
kitasue

2020/10/01 12:35 編集

https://teratail.com/questions/293303 この質問も私には丸投げに感じますが、kuma_kuma_さんは回答してらっしゃいますよね。 そもそも、丸投げは非推奨行為であって、違反行為ではないのでは。 それとも「非推奨」な質問に回答すると「違反行為に加担」したことになるのでしょうか。
kuma_kuma_

2020/10/01 12:44

まずはここでの丸投げ回答についてですがこんな質問者様だとは思わず答えてしましました。 その時は以前からしつこく書かれていたため今後この様な事が無い様にと どこがいけないのか、丸投げにならないよう最低限の知識をつけましょう 等半日以上かけて説明して回答してしまいました。 これで丸投げ回答はなくなる。 質問者様も最低限プログラムの知識をえ、 他の方が見た時もこういう点を注意して考えどこを質問すればよいのかという参考になってほしいと 思って行った行為でした。 ただ残念な事にその後も何もコードを提示せずにさらにユーザを変えてまで「丸投げ」状態の質問を繰り返すばかり。 kitasueさんにも同じ目にあってほしくないからこそ書いているのです。
kitasue

2020/10/01 13:17 編集

kuma_kuma_さん、どうもありがとございます。 「違反行為の加担者」という言葉に過剰に反応してしまいました。ごめんなさい。 例えば、「非推奨」な質問なのに、それに回答してしまうと、「非推奨」な質問を助長しかねないから、好ましくないということであれば、それはその通りだと思いますので、今後は控えることにします。 ただ、私の中にあるのは、「自分の興味の持てる質問か否か」だけなのです。質問者に対する教育的な配慮は、あまりありません。 いずれにせよ、この場で語ることではないですね。失礼いたしました。
kuma_kuma_

2020/10/01 13:13

https://teratail.com/questions/293303 こちらについては 追記欄で「文章で書くよりコードにコメント残したほうが書きやすいのですが」と断りを入れ コード+ロジックの解説という方式をとらせていただきました。 (処理が正しいか検証するためにコードを書かなければならなかった為) 私としては「ロジックの解説」をコードを踏まえ解説しているつもりですが? ただし過去にはたしかにコード丸投げもしたことがあります。 ここは私の反省点でもあります。 >「非推奨」な質問に回答すると「違反行為に加担」 これに関しては通常の方(特に初心者)などは気が付かないで「やってほしいことだけを記載した丸投げの質問」になっている場合があります。 その様な方を見つけたら私はできるだけ質問の問題点を整理して全部ではなく判らない部分を質問しましょうとアドバイスしています。そういう意味では私も「回答」していますので「違反行為」ととらえていません。 ただ今回の場合は別です。 明らかに悪意がある方法で自分のほしいシステムをタダで取得しようとしています。 もしこんな方法でここに質問するとタダでシステムが手に入るとなったらどうなりますか? 私もよく「自分なら作れる。ソースも簡単だ。そうすればきちんとした回答になる。」という場面が往々にしてあります。基本的な内容で10行程度なら答えるのもいいでしょう。 ただビジネスロジックが含まれる場合は別です。その時点で「システムの作成依頼」になります。 今回の処理も以前からの質問内容からして完全に「ビジネスロジック」です。 (質問を分散して誤魔化していますが) kitasueさんがとても優しい方で何度でも質問に答えます。という形でひとつずつ回答されるなら別ですが (そういう意味で以前回答された時は止めませんでした) このような丸投げ回答が続くと「やってほしいことだけを記載した丸投げの質問」(システムの作成依頼)に対して「無料で全部答える人」となってしまいますよ?その場合「わからない事に対して答える場」というコンセプトから大きく外れ非難されかねないですよ?という気持ちで書いたわけです。 少なからすkitasueさんの書かれたソースはキチンと考慮もされていて素晴らしいものだと思います。 ただ相手をえらばないと大変なことになりますよという事です。
kuma_kuma_

2020/10/01 13:16

すみません。長文書いていたためにお返事と内容が被ってしまいましたね。申し訳ないです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問