どなたか教えて頂ければと思います。
仕事の案件ベースでのシフト表を作成しております。案件情報一覧から必要なデータをLOOPで引っ張る事までは出来たのですが、一度作成後に案件が追加となった場合全て上書きされてしまうため割振りした内容とズレが生じてしまう事に気がつきました。
そこで、一度作成したシフト表にある情報はスキップ(データ貼り付けさせない)&新しい情報は最終行に追加する方法があれば教えて頂ければと思います。
備考?として、下記まとめておきます。
①案件が実行中のデータのみを抽出してシフト表へ転記している
②月の途中でも案件が募集中から実行中に変わる為、追加案件としてシフト表へ転記させることがある③新しい案件は最終行に追加させたい
現在つけているVBAを下記、記載しますのでご指摘、ご教授頂ければと思います。
---------------------
Sub シフト表≪案件ベース≫()
'使用シートの設定
Dim wb1 As Workbook
Dim wb2 As Workbook
Dim sh1 As Worksheet
Dim sh2 As Worksheet
Dim sh3 As Worksheet
Set wb1 = Workbooks.Open(ThisWorkbook.Path & "\案件情報一覧.xlsm")
Set wb2 = Workbooks("シフト表.xlsm")
Set sh1 = wb1.Worksheets("案件一覧")
Set sh2 = wb2.Worksheets("案件ベース原紙")
Set sh3 = wb1.Worksheets("☆")
'実行中データの抽出
sh1.Range("$A$6:$AH$10000").AutoFilter Field:=2, Criteria1:="=実行中"
sh1.Range("A7").CurrentRegion.SpecialCells(xlCellTypeVisible).Copy sh3.Range("A1")
Dim i As Long: i = 3 '案件情報のDim
Dim k As Long: k = 6 'シフト表のDim
With sh2
Do While sh3.Cells(i, 3).Value <> "" '繰り返す処理
.Cells(k, 3).Value = sh3.Cells(i, 3).Value
.Cells(k, 4).Value = sh3.Cells(i, 4).Value
.Cells(k, 5).Value = sh3.Cells(i, 13).Value
.Cells(k, 6).Value = sh3.Cells(i, 15).Value
.Cells(k, 7).Value = sh3.Cells(i, 7).Value
.Cells(k, 8).Value = sh3.Cells(i, 8).Value
i = i + 1: k = k + 1
Loop
End With
'シートを閉じる
wb1.Close savechanges:=False
End Sub
No.6ベストアンサー
- 回答日時:
こんな感じはいかがでしょうか?
Sub シフト表≪案件ベース≫()
Dim A_Dic As Object '案件コード⇒行番号対応辞書
'使用シートの設定
Dim wb1 As Workbook
Dim wb2 As Workbook
Dim sh1 As Worksheet
Dim sh2 As Worksheet
Dim sh3 As Worksheet
Set A_Dic = CreateObject("Scripting.Dictionary")
Set wb2 = ThisWorkbook
Set sh2 = wb2.Worksheets("案件ベース原紙")
Dim k As Long 'シフト表の行番号
Dim S_ERow As Long 'シフト表の最終行番号
'案件コード辞書に行番号を登録
sh2.Activate
S_ERow = Cells(Rows.Count, 3).End(xlUp).Row
If S_ERow <= 5 Then Exit Sub
For k = 7 To S_ERow
If A_Dic.Exists(Cells(k, 3).Value) = False Then
A_Dic.Add Cells(k, 3).Value, k
End If
Next
Set wb1 = Workbooks.Open(ThisWorkbook.Path & "\案件情報一覧.xlsm")
Set sh1 = wb1.Worksheets("案件一覧")
'実行中データの抽出
Dim i As Long '案件情報の行番号
Dim A_ERow As Long '案件一覧の最終行番号
sh1.Activate
A_ERow = Cells(Rows.Count, 3).End(xlUp).Row
For i = 7 To A_ERow
If Cells(i, 2).Value = "実行中" Then
If A_Dic.Exists(Cells(i, 3).Value) Then
k = A_Dic.Item(Cells(i, 3).Value)
Else
S_ERow = S_ERow + 1
k = S_ERow
A_Dic.Add Cells(i, 3).Value, k
End If
With sh2
.Cells(k, 3).Value = Cells(i, 3).Value
.Cells(k, 4).Value = Cells(i, 4).Value
.Cells(k, 5).Value = Cells(i, 13).Value
.Cells(k, 6).Value = Cells(i, 15).Value
.Cells(k, 7).Value = Cells(i, 7).Value
.Cells(k, 8).Value = Cells(i, 8).Value
End With
End If
Next
'シートを閉じる
wb1.Close savechanges:=False
End Sub
コピペして実行したところ、追加できました!!ただ、シートになにもないときは何もシフト表へ貼付されませんでした・・・そこは、最初に作ったマクロを月初用として使い、GooUserラックさんに頂いたものを更新用としてボタン二つにして使用していこうとおもいます!!
No.5
- 回答日時:
No2です
>認識としてはあってますか??
その通りです。
ご質問の場合は、「既存のデータと一致しないデータ」を追加で貼付けすればよいのだと思います。
No2の回答は、何らかのID(データの識別子)が存在することを仮定したものですが、その点は問題がないものとして、以下簡単に説明しておきます。
別回答のコードの処理のおおまかな手順は、
1)シート内の作業列にできる列を設定(最終列)
2)作業列に関数(後述)を設定。
この結果、「すでに存在するか/しないか」が計算されます
3)上記の結果で、必要なデータをオートフィルタ
4)フィルタされたデータをコピペ
のようなものです。
>f=”〜のところです。
変数fには関数式(文字列)を設定しています。
通常のシートに直接関数を記入することを考えると
=COUNTIF(既存のデータリスト, 調べたいデータ)
とすることで、そのデータが既にリストに掲載済みであるかどうかがわかります。
無ければ0、あれば1以上の数が返ります。
既出のマクロでは、
=(COUNTIF(既存のデータリスト, 調べたいデータ)>0)*1
として、有→1、なし→0 という結果になるようにしています。
(*1は無くて、TRUE、FALSE の結果でも十分なのですが)
さらに、「調べたいデータ」が必ず存在するのか(空白の場合がないのか)質問文からでは不明でしたので、念のために、
=IF(調べたいデータ="","",COUNTIF(~~))
という形式の式にすることで、空白のデータが紛れ込まないようにしています。
(空白が無いことがはっきりしていれば、複雑化する必要はないのですが…)
「f=~」の部分は、リストの範囲等が固定ではないため、その時のシートの状態に合わせた関数式を(文字列で)作成する処理を行っています。
※ 他の回答を例に抽象的な説明になってしまっているので、わかり難いとは思いますが、質問者様のケースでのセル位置やセル範囲が明確ではないので、やむを得ずこのような説明になっていることをご理解願います。
今回、とても勉強になりました。今後も一つ一つ勉強しながら進めて行きたいと思います。fujillinさんにもベストアンサー押したい気持ちです!!
No.4
- 回答日時:
このマクロですがコードを見る限り「シフト表.xlsm」に有るようですが、写真を見ると「案件一覧」シートですよね?そのシートは「案件情報一覧.xlsm」に有るんですよね?
写真に写っている「作成」ボタンは何でしょうか?
No.3
- 回答日時:
①「案件情報」「シフト表」どちらもデータは7行目から始まるという認識でよろしいですか?
② 一度転記されたものは「募集ステータス」が変わってもそのまま残すという認識でよろしいですか?
③「☆」シートは作業用にしか使っていないようですが、代用出来たら「☆」シートは不要と考えても良いですか?(範囲を決めて一機に張付け出来ないのでフィルターを使う意味があまりない)
No.2
- 回答日時:
こんにちは
No1様も質問なさっていますが、各データ(=行)を識別できるIDに該当するデータは存在しないのでしょうか?
存在しない場合は、同一性を識別するのに全データを比べてみるというあやふやな方法しかとれないと思いますので、処理の確実性が失われますし、いたずらに時間が掛かる可能性もでてきます。
もしも、IDが存在するなら、先ほど回答した別の質問と(意味的に)同じと考えることができます。
https://oshiete.goo.ne.jp/qa/11459160.html
上記の「コード一覧」に当たるのが、ご質問の「シフト表」ということになります。
『シフト表に記載が無いデータだけ抜き出してコピペする』
(↑)の質問では「存在するものも別のシートへコピペ」するようになっていますが、この処理は不要ですね。
コピペのペースト先を「別のシート」ではなく「シフト表」にして、最終行以降に追加するようにすれば、他に関してはまったく同じ内容として考えることができるはずです。
No.1
- 回答日時:
レイアウトが判らないので具体的なアドバイスは出来ません。
重複しているか判定するためのキーはどの列に有るのでしょうか?
(キーになるのは一般的には社員番号とかですが、同姓同名が絶対にいなければ氏名を使う事もあると思います)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 【ご教示ください】VBAの記述方法がわかりません。 2 2022/08/12 21:28
- Visual Basic(VBA) vbaを早くしたい 5 2022/09/09 10:58
- Visual Basic(VBA) 【前回の続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/16 16:44
- Visual Basic(VBA) VBA 別ブックからの転記の高速化について VBA 別ブックからの転記の高速化についてご教授下さい。 19 2022/07/26 13:07
- Visual Basic(VBA) 2つ目のコンボボックスが動作しません。 3 2023/03/25 12:29
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Visual Basic(VBA) マクロで最終行を取得したい 4 2023/05/28 12:14
- Visual Basic(VBA) Excelで下記のようにマクロを作ったところ、一回目は実行できたのですが、二回目以降「実行時エラー1 1 2022/03/25 08:08
- Excel(エクセル) VBAの指示の内容 昨日こちらでご教示頂いたのですが初心者な為、一つ一つの指示が何をやっているのかわ 2 2022/10/25 18:08
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルでの作業計算方法について
-
Microsoft1Officeの互換ソフト...
-
【マクロ】その時、その時で変...
-
はがきについて。
-
【マクロ】読取専用のファイル...
-
エクセル初心者です 関数の入れ...
-
【関数】適切な文字数の数字を...
-
LOOKUP関数を使えばいいのでし...
-
【関数】先頭だけにある、半角...
-
Excel ピボットテーブルで日付...
-
Excelのpivotについて質問です
-
時間によってファイル名が変わ...
-
エクセル 白黒印刷で白線を印刷...
-
Aというブックの1というシート...
-
エクセル関数を教えてください
-
WPS OFFICEでの縦書きについて
-
Excelのチェックボックスの使い...
-
エクセルの条件付き書式につい...
-
エクセルのセルに同じ大きさの...
-
エクセルの関数について教えて...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel 2019 のピボットテーブル...
-
[関数得意な方]教えて下さい・...
-
Excelにてある膨大なデータを管...
-
[関数について]わかる方教えて...
-
Excel初心者です。 詳しい方、...
-
excelの不要な行の削除ができな...
-
エクセル関数に詳しい方教えて...
-
INDIRECTを使わず excelで複数...
-
[オートフィルタ]で抽出された...
-
エクセルの神よ、ご回答を! エ...
-
エクセル関数に詳しい方、教え...
-
各ページの1番上の表示について
-
Excelで写真のような表を作った...
-
エクセルで不等号記号(≠)が上に...
-
数学 Tan(θ)-1/Cos(θ)について...
-
Excel 2019 は、SPILL機能があ...
-
Excelで全角を半角にしたいので...
-
条件付き書式を教えてください
-
Excel フィルターを掛けた状態...
-
[オートフィルタ]の適用範囲の...
おすすめ情報
ご指摘ありがとうございます。
レイアウトを写真にて添付致しますのでご確認頂ければと思います。
画像はデータ元の案件一覧となります。
シフト表のレイアウトも同様のイメージです。(画像2枚はれなかったので言葉ですみません、、)
また、重複を確認するのは案件コードにて行いたいと思っております。
添付頂いたものを見ながら作成してみましたが、データ抽出のところでエラーが起きてしまいました。f=”〜のところです。
知識不足エラーを解くこともできませんでした。。
ただ、ベースとなる実行中のデータを抽出。そこからシフト表のデータと一致するもの、しないものをわけて貼付けをすればよい。と言う事は理解しました。
認識としてはあってますか??
ご親切にありがとうございます。
①案件情報→7行目、シフト表→6行目となります。
②はい、一度シフト表へ転記されたものは同じ月内ではそのまま残す認識であっております。
③代用できるのであれば無しで構いません。私が作れたのがこれしかなく、、
宜しくお願い致します。
案件情報一覧自体もマクロで別シートからまとめているため、作成ボタンがあります。
流れとしては案件情報一覧を作成後にシフト表への転記となります
ご丁寧にありがとうございます。
CountIFで、案件情報一覧の案件コードと、シフト表記載済の案件コードとをかけてみます!!
マクロ組むの初心者すぎて何度もごめんなさい。まだ初めて1週間なので右も左も状態で、、
本当に皆さん親切で嬉しい限りです。
ちなみに、シフト表の写真こちらにアップしておきます。
案件情報一覧からはシフト表C〜H列までの情報を引っ張ってきてる状態です。