![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67b6d)
どなたか教えて頂ければと思います。
仕事の案件ベースでのシフト表を作成しております。案件情報一覧から必要なデータを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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・「I love you」 をかっこよく翻訳してみてください
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・昔のあなたへのアドバイス
- ・かっこよく答えてください!!
- ・あなたが好きな本屋さんを教えてください
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・【大喜利】【投稿~8/27】 こんなガソリンスタンド二度と来るか!なぜそう思った?
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・【お題】動物のキャッチフレーズ
- ・【お題】甲子園での思い出の残し方
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・自分用のお土産
- ・人生で一番お金がなかったとき
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・ちょっと先の未来クイズ第1問
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルでの2項目比較および...
-
【マクロ】ファイル名の一括変...
-
Excelでの表の作り方
-
【マクロ】フォルダ内にあるPDF...
-
Excelの複数条件の関数
-
Excelの条件付き書式について
-
Excelの警告について
-
【マクロ】functionプロシージ...
-
EXCELの散布図で日付が1900年に...
-
エクセルの数式バーのフォント...
-
エクセルでファイルの最終更新...
-
【Excel】版が同じ事を示す番号...
-
googleのスプレッドシート
-
エクセルの問題です。絶対値の...
-
Excelの数式について教えてくだ...
-
Excelで数値を時間数に変換する...
-
エクセルまたはGoogleスプレッ...
-
GoogleスプレッドシートでA1に...
-
2列に入っているデータを1列...
-
【マクロ】 IFERROR関数をマク...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excelの警告について
-
Excelで数値を時間数に変換する...
-
エクセルの数式バーのフォント...
-
エクセルで数字の組み合わせを...
-
エクセルを使用して、円周率を...
-
Excelで特定の文字列が含まれて...
-
Excel 対象のセルに入力が無い...
-
任意の値が存在する行に名前を...
-
エクセルでファイルの最終更新...
-
index関数の説明をお願いします。
-
条件付き書式でやりたいのですが
-
重複しない値を取り出したい
-
【ExcelVBA】UTF-8(BOM無)でC...
-
【マクロ】マクロが割当てされ...
-
エクセル IF計算式?でしょうか?
-
エクセルで曜日を入れたい
-
表中の指定した条件の文字列を...
-
【Excel】版が同じ事を示す番号...
-
EXCELの散布図で日付が1900年に...
-
Excelについて。Excelに縦1列に...
おすすめ情報
ご指摘ありがとうございます。
レイアウトを写真にて添付致しますのでご確認頂ければと思います。
画像はデータ元の案件一覧となります。
シフト表のレイアウトも同様のイメージです。(画像2枚はれなかったので言葉ですみません、、)
また、重複を確認するのは案件コードにて行いたいと思っております。
添付頂いたものを見ながら作成してみましたが、データ抽出のところでエラーが起きてしまいました。f=”〜のところです。
知識不足エラーを解くこともできませんでした。。
ただ、ベースとなる実行中のデータを抽出。そこからシフト表のデータと一致するもの、しないものをわけて貼付けをすればよい。と言う事は理解しました。
認識としてはあってますか??
ご親切にありがとうございます。
①案件情報→7行目、シフト表→6行目となります。
②はい、一度シフト表へ転記されたものは同じ月内ではそのまま残す認識であっております。
③代用できるのであれば無しで構いません。私が作れたのがこれしかなく、、
宜しくお願い致します。
案件情報一覧自体もマクロで別シートからまとめているため、作成ボタンがあります。
流れとしては案件情報一覧を作成後にシフト表への転記となります
ご丁寧にありがとうございます。
CountIFで、案件情報一覧の案件コードと、シフト表記載済の案件コードとをかけてみます!!
マクロ組むの初心者すぎて何度もごめんなさい。まだ初めて1週間なので右も左も状態で、、
本当に皆さん親切で嬉しい限りです。
ちなみに、シフト表の写真こちらにアップしておきます。
案件情報一覧からはシフト表C〜H列までの情報を引っ張ってきてる状態です。