[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『2つのCSVファイル間の操作を簡略化』(日向)
エクセル達人の皆様、ご相談させて下さい。
この度、今まで紙で行っていた給与明細の配布をWebに移行する事になりました。
現在、使用中の給与ソフトから書き出したCSVファイルをインターネットに取り込むことで従業員が閲覧できるようになるサービスなのですが、現在使用している給与ソフトから書きだしたCSVでは、いくつか加工を行わないといけない状況で困っています。
インターネットに取り込む際のCSVファイルには必須項目として
「社員コード」
「氏名(姓)」
「氏名(名)」
の3つの項目が必要なのですが、現在、使用している給与ソフトから書きだした給与一覧.csvには「社員コード」しかありません。
現在、使用中の給与ソフトから書きだし可能なファイルは、
1.全従業員が載っている「従業員一覧.csv」
2.一か月分の全従業員の給与情報が載っている「給与一覧.csv」
の2つで「従業員一覧.csv」には「氏名(姓)」「氏名(名)」のデータが、BとC列に入っています。
現在は以下の手順で加工を行って使用しています。
1.給与一覧.csvを開き、BとC列を挿入 ※シート名は「給与明細データ」の1つのみです。
2.挿入したセルに項目名「氏名(姓)」「氏名(名)」を追加
3.従業員一覧.csvを開き、シート「従業員データ」を選択し、移動またはコピーを選び、給与一覧.csvにシート「従業員データ」を移動
4.シート「給与明細データ」に切り替え、B列に計算式「=VLOOKUP($A4,従業員データ!$A$1:$HN$220,2,FALSE)」C列に「=VLOOKUP($A4,従業員データ!$A$1:$HN$220,3,FALSE)」を手入力し、入力されている従業員の列までドラッグしてコピー
5.B列とC列の従業員名が入っているデータを選択して、コピー→形式を選択して貼り付け→値を選び、計算式を値で上書き
6.B列とC列の従業員名が入っているデータを選択して、置換。検索する文字列を全角スペース、検索後の文字列を何も入力せず全置換で不要なスペースを削除。※従業員一覧.csvの名前の中に不要な全角スペースがたくさん入っている為。
以上です。
ご相談したいのは、この上記の手順を可能な限り簡略化したいです。
やり方が全く分からないのですが、マクロ等で自動化可能なのでしょうか?
もし可能であれば、大変厚かましいのは重々承知しておりますが、ご教授頂けると幸甚です。
よろしくお願いいたします。
< 使用 Excel:Office365、使用 OS:Windows10 >
1.簡単なデータ(2、3人分)で、 その手順をマクロの記録でコードを書かせて、ここにアップして頂けませんか?
※開示するのが不適切な情報は、別の文字列に置き換えて下さい。
2.csvファイルの名とシート名が一致していないような記述があるんですが、本当なんですか?
(半平太) 2020/12/07(月) 16:03
衝突しましたが…
>「従業員一覧.csv」には「氏名(姓)」「氏名(名)」のデータが、BとC列に入っています A列に社員コードが入っているんですかね?そうでないとlookupできないはずなのでそうと仮定して…
365であればpowerqueryの使用でどうでしょうか?
給与一覧 社員コード 給与 1111 100円 2222 200円 3333 300円 4444 400円 5555 500円
従業員情報 社員コード 姓 名 1111 佐藤 太郎 2222 佐藤 花子 3333 田中 太郎 4444 田中 花子 5555 佐々木 太郎
として、 = Table.NestedJoin(給与一覧, {"社員コード"}, 従業員情報, {"社員コード"}, "従業員情報", JoinKind.LeftOuter) = Table.ExpandTableColumn(ソース, "従業員情報", {"姓", "名"}, {"従業員情報.姓", "従業員情報.名"}) = Table.ReplaceValue(#"展開された 従業員情報1"," ","",Replacer.ReplaceText,{"従業員情報.名"})
社員コード 給与 従業員情報.姓 従業員情報.名 1111 100円 佐藤 太郎 2222 200円 佐藤 花子 3333 300円 田中 太郎 4444 400円 田中 花子 5555 500円 佐々木 太郎
というテーブルができます。 上記のみで全角スペースも置換できている状態です。 (ななし) 2020/12/07(月) 16:14
あ、名前ってもしかして姓もですかね? その場合、最後は = Table.ReplaceValue(#"展開された 従業員情報1"," ","",Replacer.ReplaceText,{"従業員情報.姓", "従業員情報.名"}) でお願いします。 (ななし) 2020/12/07(月) 16:16
ファイル名や計算式、手入力してて間違って入力してしまったところがいくつかありました。
本当に申し訳ございません。
ご指示の通り、マクロの記録をやってみました。
よろしくお願いいたします。
Sub Macro1()
'
' Macro1 Macro
'
'
Columns("B:C").Select Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove Range("B3").Select ActiveCell.FormulaR1C1 = "氏名(姓)" Range("C3").Select ActiveCell.FormulaR1C1 = "氏名(名)" Range("B4").Select Sheets("従業員一覧").Select Sheets("従業員一覧").Move Before:=Workbooks("給与一覧.csv").Sheets(1) Sheets("給与一覧").Select ActiveCell.FormulaR1C1 = "=VLOOKUP(RC1,従業員一覧!R1C1:R220C222,2,FALSE)" Range("B4").Select Selection.AutoFill Destination:=Range("B4:C4"), Type:=xlFillDefault Range("B4:C4").Select Range("C4").Select ActiveCell.FormulaR1C1 = "=VLOOKUP(RC1,従業員一覧!R1C1:R220C222,3,FALSE)" Range("B4:C4").Select Selection.AutoFill Destination:=Range("B4:C129"), Type:=xlFillDefault Range("B4:C129").Select Selection.Copy Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Selection.Replace What:=" ", Replacement:="", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False End Sub (日向) 2020/12/07(月) 16:30
従業員と給与どちらのcsvも、1行目は社員コードになります。
従業員csvは1行目が項目なのですが、給与は3行目が項目となっております。
(日向) 2020/12/07(月) 16:33
○ 従業員と給与どちらのcsvも、1列目は社員コードになります。
すみません汗
(日向) 2020/12/07(月) 16:34
VLOOKUPで毎回計算して値に置換するなら 社員コードと姓名のリストを作業用BOOKであらかじめ作っておいて そのBOOKの別シートに給与一覧を張り付けてリストにVLOOKUPで呼び出した表を 新しいBOOKでCSVにした方が 給与一覧を張り付けてCSV用データ作るだけなので毎回VLOOKUP書いてコピーしたり 氏名を置換する必要がないのではそれをマクロ化すればもう少し簡単なような
(なるへそ) 2020/12/07(月) 16:43
>ご相談したいのは、この上記の手順を可能な限り簡略化したいです
>3.従業員一覧.csvを開き、シート「従業員データ」を選択し、移動またはコピーを選び、給与一覧.csvにシート「従業員データ」を移動
移動する必要があるかな?そのまま参照すればよいのでは?
>C列に「=VLOOKUP($A4,従業員データ!$A$1:$HN$220,3,FALSE)」を手入力し、入力されている従業員の列までドラッグしてコピー
ドラッグしなくても、フィルハンドルダブルクリックでOKのはず。
>5.B列とC列の従業員名が入っているデータを選択して、コピー→形式を選択して貼り付け→値を選び、計算式を値で上書き
わざわざ値に直さなくても、CSV形式では数式は保存できないから、保存したら勝手に値になってるはず。
>6.B列とC列の従業員名が入っているデータを選択して、置換。検索する文字列を全角スペース、検索後の文字列を何も入力せず全置換で不要なスペースを削除。※従業員一覧.csvの名前の中に不要な全角スペースがたくさん入っている為。
新しいシートを追加し、
表全部をコピーして、新しいシートにリンク貼り付け
セルに入った参照式にTrim関数を追記し、数式をコピー
そのまま名前を付けてCSV形式で保存
(複数シートもCSVでは保存できないので、アクティブなシートのみ保存されます。)
あぁ、先に数式を仕込んでおいて、
参照するファイルを変える方が簡単かもですね。
(まっつわん) 2020/12/07(月) 16:59
複数のブックを扱う時は、どのブックなのか明示しないと、トラブルの元になるので・・
Sub Macro1() Dim LrEmp As Long Dim LrPay As Long
With Workbooks("給与一覧.csv").Sheets("給与一覧") .Columns("B:C").Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove .Range("B3").Value = "氏名(姓)" .Range("C3").Value = "氏名(名)" End With
With Workbooks("従業員一覧.csv").Sheets("従業員一覧") .Copy Before:=Workbooks("給与一覧.csv").Sheets(1) LrPay = .Cells(.Rows.Count, "A").End(xlUp).Row End With
With Workbooks("給与一覧.csv").Sheets("給与一覧") LrEmp = .Cells(.Rows.Count, "A").End(xlUp).Row
.Range("B4:B" & LrEmp).Formula2R1C1 = _ "=VLOOKUP(RC1,従業員一覧!R1C1:R" & LrPay & "C" & LrPay & ",{2,3},FALSE)"
With .Range("B4:C" & LrEmp) .Copy
.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False .Replace What:=" ", Replacement:="", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False End With
Application.DisplayAlerts = False Workbooks("給与一覧.csv").Sheets("従業員一覧").Delete Application.DisplayAlerts = True End With End Sub
(半平太) 2020/12/07(月) 19:50
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.