[[20150618132536]] 『マクロで指定した所へデータを貼り付けたい』(お肉) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『マクロで指定した所へデータを貼り付けたい』(お肉)

例えばデータの一覧表を作成していて別なシートで入力したモノをその一覧表に貼り付けしたいのですが、貼り付け先の行を変更したい場合どうすればよろしいでしょうか?

データの一覧表と入力シートは別にあります。
30人分のデータを入力したいです。
必要事項は入力シートで入力し、最後にボタン(マクロを登録)を作って貼り付けをしたいです。
指定の行は入力シート(仮にA2に入力規則で番号を選択出来るようにします)で選択します。

このような感じで行いたいのですがいかがでしょうか?
質問に不備な点はあるとは思いますが何卒よろしくお願いします。

< 使用 Excel:Excel2010、使用 OS:Windows7 >


 >質問に不備な点はあるとは思いますが何卒よろしくお願いします。

 具体例を挙げたら如何ですか?

 一発で解決しますよ。

(半平太) 2015/06/18(木) 20:23


ありがとうございます。
例としては、30人分の顧客情報を入力していくときに、情報の一覧とは別に入力シートを作り、必要な部分を情報の一覧のシートに転写させたいのです。
出来ればその時に番号を指定して、指定した番号の所にデータを転写できれば嬉しいです。
例えば15人分入力済みの所に後で16番目の方の情報を転写したり、5番目の方の所に上書きしたり、てきな事が出きれば良いのですがいかがでしょうか?

(お肉) 2015/06/19(金) 10:04


 顧客情報というのがどういった項目があるのかわからないので、とりあえずこちらも例として

 ※入力シート
   A    B    C     D   E 
 1  番号 従業員ID  氏名   住所  TELL
 2 1   0001   山田太郎 東京都  080

 入力欄に貼付る行番号を指定したいとのことでしたので
 挿入→名前→名前の定義で以下のように設定します。
 名前…なんでもいいです。
 選択範囲…=OFFSET(一覧表!$A$2,0,0,COUNTA(一覧表!$A:$A)-1,1)

 入力シートのA列を選択して
 入力規則
 入力規則の種類…リスト
 元の値…=上でつけた名前

 これでたぶん一覧表のA列の番号がでるようになると思います。

 次にシートにボタンを設置して以下のマクロを登録

 Option Explicit

 Sub test()

 Dim wsI
 Dim wsN
 Dim v2 As Variant
 Dim i As Long
 Dim lastRow As Long
 Dim TargetNo As Long
 Dim PasteNo As Variant

 Set wsI = Worksheets("一覧表")
 Set wsN = Worksheets("入力")

 v2 = wsN.Range("A1").CurrentRegion.Value

 For i = 2 To UBound(v2)
    If v2(i, 1) = "" Then
        With wsI
            lastRow = .Cells(Rows.Count, 1).End(xlUp).Row
            If lastRow = 1 Then
                TargetNo = 1
            Else
                TargetNo = .Cells(lastRow, 1).Value + 1
            End If

            With .Cells(lastRow + 1, 1)
                .Value = TargetNo
                .Offset(, 1).Value = v2(i, 2)
                .Offset(, 2).Value = v2(i, 3)
                .Offset(, 3).Value = v2(i, 4)
                .Offset(, 4).Value = v2(i, 5)
                .Offset(, 5).Value = v2(i, 6)
            End With
        End With
    Else
        TargetNo = v2(i, 1)
        With wsI
            PasteNo = Application.WorksheetFunction.Match(TargetNo, .Columns(1), 0)
            With .Cells(PasteNo, 2)
                .Value = v2(i, 2)
                .Offset(, 1).Value = v2(i, 3)
                .Offset(, 2).Value = v2(i, 4)
                .Offset(, 3).Value = v2(i, 5)
                .Offset(, 4).Value = v2(i, 6)
            End With
        End With
    End If
 Next i
 End Sub

 入力シートの番号が空白の場合は一覧表シートの最終行に追加でデータを転写
 入力シートの番号が選択されている場合はその番号を検索してその行に上書き

 イメージとしてはこんな感じでしょうか?
 一人ずつ入力していくならフォームを立ち上げたほうがいいような気もしますが。

(KUKI) 2015/06/19(金) 12:17


丁寧な文でありがとうございます。早速試してみたいと思います。
また分からなくなりましたらよろしくお願いします。
(お肉) 2015/06/19(金) 19:25

早速すいません。
マクロを作動させると、
実行時エラー9
インデックスに有効範囲がありませんと出ますが何がいけないのでしょうか?

デバックは
.Offset(, 4).Value = v2(i, 6)
の部分で色がついています。

それともう少し踏み込むと
入力シートで

   A   B     C    D    E 

 1 番号 従業員ID  氏名   住所  TELL
 2  6  0006   高橋勉  新潟県  090
と入力した時に

一覧表シートが
   A   B     C    D    E  

 1  番号 従業員ID  氏名   住所  TELL
 2  1   0001   山田太郎 東京都  080
 3   2     0002      佐藤太  埼玉県  070
 4   3     0003   蜷川一郎 東京都  080
 5   4     0004   飯沼博美 新潟県  090
 6   5     0005   藤堂太郎 埼玉県  070
 7   6      

の様な状態の時に
入力シートの『A2〜E2』を、
一覧表シート『A7の所からE7まで』に貼り付けたい
尚、行の指定は入力シートの番号の内容(B2に入力した数字)によるものとする

と言うようなイメージですがよろしかったでしょうか?

不勉強で申し訳ありませんがお付き合い頂ければ助かります。
よろしくお願いします。

(お肉) 2015/06/19(金) 20:33


 >それともう少し踏み込むと 

 踏み込んだとおっしゃいますが、私が「具体例を挙げたら」と云ったのがこのレベルです。

 質問に際して、始めからこういうものを掲示する様にしていただくと、
 回答者はあれこれ想像(=妄想)する必要が無く、無駄な回答を書かないで済みます。

 中間で「必要な部分を情報の一覧のシートに転写させたいのです」との説明がありましたが、
 これとて「必要な部分とは入力情報の内のどの部分なのか? 全部なのか、飛び飛びのデータになるのか?」と云う
 疑問が生じますので、十分とは言い難い代物です。

 やむなく、KUKIさんがたたき台を作って、話を先に進めた・・・のですが、

 > ※入力シート
 >   A    B    C     D   E 
 > 1  番号 従業員ID  氏名   住所  TELL
 > 2 1   0001   山田太郎 東京都  080

 レイアウトはE列までのものでした。(左端の番号は行番号であって、データではない)
 つまり「5」列までしかデータが無いのです。
                      ↓
 にも関わらず、.Offset(, 4).Value = v2(i, 6) と書いたので、配列の無いところ指定してしまった。

 なので、このエラーが出ました。
      ↓
 >インデックスに有効範囲がありませんと出ますが何がいけないのでしょうか? 
 >デバックは 
 >.Offset(, 4).Value = v2(i, 6) 
 >の部分で色がついています。

 ・・で、その問題を解消しようかなと思ったのですが、
 今度はお肉さんが、こんなレイアウトに(微妙に)変えてしまった。
           ↓
 > A  B    C    D    E   F 
 > 1 番号 従業員ID  氏名   住所  TELL
 > 2  6  0006   高橋勉  新潟県  090

 6列の入力のデータになったのはいいのですが、一体A列の番号は何なのですか? 
 そのデータはどうするんですか?

 入力シートにあって、一覧表にもある。なら、転記しないとまずそう・・・・でも

 >入力シートの『B2〜F2』を、 
 > 一覧表シート『B7の所からF7まで』に貼り付けたい

 とリクエストされたら、また妄想しなければならない羽目になります。

(半平太) 2015/06/20(土) 15:50


すみません。KUKIさんのをそのまま使った方が良いかなと思い転記してデータを追加してみたのですが、ずれてしまったみたいで大変ご迷惑おかけしました。
修正しますので再度よろしくお願いします。
マクロの方はわかりました。ありがとうございます。
(お肉) 2015/06/20(土) 16:18

 >修正しますので再度よろしくお願いします。 

 相変わらず、仕様が明瞭とはいいにくい状況です。

 こっちで勝手に決めますよ。
          ↓
 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
 入力シートの『A2〜E2』を 一覧表シート『A7の所からE7まで』に貼り付ける。
 A7にする理由は「入力シートのA2セル(番号)が、一覧表シートのA7の値と一致するから」
 もし、一致するものが無かった場合は、一覧表シートの最下行の下に追加する。

 入力シートのデータが複数行ある場合は、上から順に実行し、
 A列のデータが空白になるところで処理を中止する。

 従って、入力シートのA列が空白の場合は、たとえB列に何かデータがあったとしても無視されます。
 また、更にその下の行のA列にはデータがあったとしても、それらの行は何の処理も行われないことになります。
 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

 <一覧表 実行前>
  行  __A__  ____B____  ____C____  ___D___  __E__
   1  番号   従業員ID   氏名       住所     TELL 
   2     1          1   山田太郎   東京都     80 
   3     2          2   佐藤太     埼玉県     70 
   4     3          3   蜷川一郎   東京都     80 
   5     4          4   飯沼博美   新潟県     90 
   6     5          5   藤堂太郎   埼玉県     70 

 <入力 データ> 2行あったと仮定します。(高橋さんは新規従業員)
  行  __A__  ____B____  ___C___  ___D___  __E__
   1  番号   従業員ID   氏名     住所     TELL 
   2     6          6   高橋勉   新潟県     90 
   3     2          2   佐藤太   埼玉県   9999 

 <一覧表 結果図>
  行  __A__  ____B____  ____C____  ___D___  __E__
   1  番号   従業員ID   氏名       住所     TELL 
   2     1          1   山田太郎   東京都     80 
   3     2          2   佐藤太     埼玉県   9999 ←電話番号変更
   4     3          3   蜷川一郎   東京都     80 
   5     4          4   飯沼博美   新潟県     90 
   6     5          5   藤堂太郎   埼玉県     70 
   7     6          6   高橋勉     新潟県     90 ←新規

  Sub test2()
      Dim wsI
      Dim wsN

      Dim i As Long
      Dim lastRow As Long
      Dim PasteNo As Variant

      Set wsN = Worksheets("入力")
      Set wsI = Worksheets("一覧表")

      For i = 2 To wsN.Cells(wsN.Rows.Count, 1).End(xlUp).Row
         If wsN.Cells(i, "A").Value = "" Then
             Exit Sub
         Else
             PasteNo = Application.Match(wsN.Cells(i, "A").Value, wsI.Columns(1), 0)

             If IsNumeric(PasteNo) Then '該当あり
                 wsN.Range("A" & i).Resize(1, 5).Copy wsI.Cells(PasteNo, "A")
             Else '要追記
                 lastRow = wsI.Cells(Rows.Count, 1).End(xlUp).Row
                 wsN.Range("A" & i).Resize(1, 5).Copy wsI.Cells(lastRow + 1, "A")
             End If

         End If
      Next i

  End Sub

(半平太) 2015/06/20(土) 17:47


つたない文を元にご理解頂き、そして丁寧に教えて頂き誠にありがとうございます。
イメージ通りのモノが出来そうです。
本当にありがとうございました。
(お肉) 2015/06/20(土) 19:21

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.