プロが教える店舗&オフィスのセキュリティ対策術

Excelについて教えていただきたいです。

おそらくマクロかVBAを使用するしかないと思うのですが、

シート1にシート2とシート3の内容を列単位で反映させたい。

しかし、シート2やシート3は今後行が増えたり減ったりする場合がある。

シート2やシート3の行が増減した場合にシート1の行が自動で増減する方法を教えてください。

例を挙げますと下記のようにしたいのです。

シート1
A列 B列 C列 D列 E列 F列 G列
1行目 名前 無関係列 無関係列 発注先 無関係列 無関係列 個数
2行目 あ A社 2
3行目 い B社 5
4行目 う A社 4
5行目 え B社 10
6行目 お C社 25
7行目 か A社 2
8行目 き B社 1
9行目 く D社 7
10行目 け F社 30
11行目 こ C社 25


シート2
A列 B列 C列 D列
1行目 番号 名前 個数 発注先
2行目 1 あ 2 A社
3行目 2 い 5 B社
4行目 3 う 4 A社
5行目 4 え 10 B社
6行目 5 お 25 C社


シート3
A列 B列 C列 D列
1行目 番号 名前 個数 発注先
2行目 1 か 2 A社
3行目 2 き 1 B社
4行目 3 く 7 D社
5行目 4 け 30 F社
6行目 5 こ 25 C社

シート2の行が増えたらシート1の6行目と7行目の間に自動で内容が追加されるようにしたい。
シート2の行が減ったら削除された行がシート1においても自動で削除されるようにしたい。

シート3の行が増えたらシート1の11行目以降に自動で内容が追加されるようにしたい。
シート3の行が減ったら削除された行がシート1においても自動で削除されるようにしたい。


マクロやVBAは使用したこともなく使い方・コードの書き方も全く分かりませんので、教えていただけると幸いです。
特にコードを書いていただけるととても助かります。

よろしくお願い致します。

A 回答 (4件)

こんにちは。



シート2とシート3を合算したのが、シート1でしょうか。
番号が連番でしょうか。

どの行を消したかを判断するのは、マクロで、出来るのでしょうか?。
(前置きはここまで)


自動的に行が増えたり減ったりする考え方をやめて
シート2の最新状態とシート3の最新状態をシート1に反映するのはダメでしょうか。


1.シート2やシート3で追加や削除の作業を終えたら…。
 (当然、シート1は自動で変化しないです。)

2.シート1の2行目以下で値のあるセルを全てクリア
 (セルの領域選択とDELキー)

3.シート2の2行2列目以下(データがある範囲)をコピーし、
  シート1の2行1列目以下に貼り付け

4.シート3の2行2列目以下(データがある範囲)をコピーし、
  シート1の空白行1列目以下(シート2の値が貼り付けられた
   最終行の次の行)に貼り付け

マクロを使うなら、
シート1、シート2、シート3の各シートの最終行を算出して、
領域選択の範囲を自動で求め、その範囲ごとにコピペすることも
可能ですが…。目で見ながら確認するのもよいかと思います。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
現在、様々な方法を試行錯誤中です。
教えていただいた方法も試してみようと思います。

お礼日時:2020/02/24 16:53

おはようございます。


ご質問を閉じないのは、VBA期待してますか?
>マクロやVBAは使用したこともなく使い方・コードの書き方も全く分かりませんので、教えていただけると幸いです。

残念ながら、
この処理は、簡単そうでなかなかですよ。
知識がなく作ってもらったコードで実行していてもすぐに、対応できないようになりそうですね。(質問を見る限り)
シート1と他のシートの列の順番が変わっていたり、、
既に皆さんのアドバイスがあるので、

///回答部分
VBAは、諦めた(基本的知識を身に付けるまで)方が良いと思います。
ショートカットキーでストレスなく確認しながら出来るのでは、と思います。
///

VBAの事に触れているので、VBAでやる場合のさわりだけ、、多分意味不明

Option Explicit
Dim MAXROW As Variant
Private Sub Workbook_Open()
  Dim Sh As Worksheet
  ReDim MAXROW(1 To ThisWorkbook.Worksheets.Count)
  For Each Sh In ThisWorkbook.Worksheets
    With Sheets(Sh.Index)
      MAXROW(Sh.Index) = .Range("A1", .UsedRange).Rows.Count
    End With


Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim NewRow As Long, i As Long, J As Long
Dim key As String
Dim Arr_Row As Variant
  If Sh.Name = "シート2" Or Sh.Name = "シート3" Then
    NewRow = Sh.Range("A1", Sh.UsedRange).Rows.Count
    If NewRow > MAXROW(Sh.Index) Then '挿入の場合
      If Target.Columns.Count = Columns.Count Then
        Application.EnableEvents = False
        Arr_Row =

  If NewRow < MAXROW(Sh.Index) Then  '削除の場合
      On Error Resume Next ’1行目を削除時2行目が空白の場合エラー、キーワードがない
      If key = Sh.Cells(Target.Row, "B") = "" Then
        J = -1
      Else
        J = 1
      End If
      key = Sh.Cells(Target.Row + J, "B") & Sh.Cells(Target.Row + J, "D") & Sh.Cells(Target.Row + J, "C")
      If Sh.Cells(Sh.Selection(1).Row, Sh.Columns.Count) <> Sh.Cells(Selection(1).Row, Sh.Columns.Count).Row Then


シート1を考えなくてもこんな感じで、、、簡単な処理なら、説明を付け参考コードを書きますが、ちょっと無理がありますよね。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
現在、様々な方法を試行錯誤中です。
VBAがかなり難しいのは承知しているので今回は他の方法でやっていこうと思っています。

お礼日時:2020/02/25 08:52

シート1を作って、シート2と3に分ける方が早くないですか?

    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
現在、様々な方法を試行錯誤中です。
教えていただいた方法も試してみようと思います。

お礼日時:2020/02/24 16:54

数式でもできるけど……面倒。



まずは「名前」を重複なく拾い集める。
「名前」に該当するデータを拾って表示する。
…って手順ですね。

これなら Excel よりも Access のほうが得意な分野です。
マクロとか考えなくても、標準の機能で出来ちゃいますよ。
通信教育などもありますので、そういった物を利用して覚えると良いと思います。


・・・余談・・・

ここは「代わりに作ってください」と作業依頼をする場所ではありません。
自身で作れるようにアドバイスをもらえる場所と思ってください。

もしも「作業依頼」が目的であれば、専門の業者に委託することを強く勧めます。
無責任な回答を採用して不具合が生じても自身で手直しすることもできないのでは業務に支障をきたしますよね。
また気づかずに損害が発生してもそれは質問者さん一人の責任になります。(認めた上司の責任もあるけどね)
ならば専門業者に委託して穴のないシステムを構築することの方が望ましいと思いませんか。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
現在、様々な方法を試行錯誤中です。
教えていただいた方法も試してみようと思います。

余談につきましてはその通りですね。
今後勉強していきたいと思います。

お礼日時:2020/02/24 16:54

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A