Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


1539 / 13645 ツリー ←次へ | 前へ→

【73717】検索してマッチしたら転記 nonoka 13/2/6(水) 13:07 質問[未読]
【73718】Re:検索してマッチしたら転記 UO3 13/2/6(水) 17:04 発言[未読]
【73719】Re:検索してマッチしたら転記 UO3 13/2/6(水) 17:22 発言[未読]
【73723】Re:検索してマッチしたら転記 nonoka 13/2/6(水) 19:42 回答[未読]
【73724】Re:検索してマッチしたら転記 UO3 13/2/6(水) 19:54 発言[未読]
【73725】Re:検索してマッチしたら転記 nonoka 13/2/6(水) 20:20 質問[未読]
【73726】Re:検索してマッチしたら転記 UO3 13/2/6(水) 21:27 発言[未読]
【73727】Re:検索してマッチしたら転記 nonoka 13/2/6(水) 22:05 回答[未読]
【73734】Re:検索してマッチしたら転記 UO3 13/2/7(木) 6:57 発言[未読]
【73735】Re:検索してマッチしたら転記 UO3 13/2/7(木) 7:01 発言[未読]
【73736】Re:検索してマッチしたら転記 nonoka 13/2/7(木) 10:11 回答[未読]
【73737】Re:検索してマッチしたら転記 UO3 13/2/7(木) 12:14 発言[未読]
【73739】Re:検索してマッチしたら転記 nonoka 13/2/7(木) 14:18 質問[未読]
【73740】Re:検索してマッチしたら転記 UO3 13/2/7(木) 18:32 発言[未読]
【73741】Re:検索してマッチしたら転記 nonoka 13/2/7(木) 18:45 回答[未読]
【73742】Re:検索してマッチしたら転記 UO3 13/2/7(木) 22:50 発言[未読]
【73744】Re:検索してマッチしたら転記 nonoka 13/2/8(金) 9:13 回答[未読]

【73717】検索してマッチしたら転記
質問  nonoka  - 13/2/6(水) 13:07 -

引用なし
パスワード
   シート名 Scheduleの中の表に
別シートから入力されたデータが積み上げられます。
表の開始範囲は10行目からデータが積み上げられます。
その表のH列にT1やT2、P2などのコードが入力されます。
入力されたら
シート名 process のD5よりしたに同じようにT1なのどコードがあり
マッチすればその行のE〜R(14個)のセルを
シート名 Schedule のAD〜AQ(14個)に転記したいです。


▼UO3様

下記で実行してみましたが、完了できませんでした。
現象としては部分的に転記されますが、すべての行に転記できていないじょうたいです。


>以前の計画表はH列が、投入数だったように記憶しているんだけど、そこが T1や>T2やP2?
>で【入力されます】ということは、以前のH列はINPUTシートのH列をベースに調>整された数値が
>計画表のH列に転記されたんだけど、そうではなく、Scheduleシートの上で>Processシートとは
>関係なく、独自に入力されるということですか?

以前より少し行を増やしたりして改良しました。
H列にはINPUTからコピーしたものが入ります。

>2つのシートのコード列ですが、同じコードが重複して存在しますか?

重複しないです。


Sub ひとつ目()
  Const fCode As String = "D"   'Processシートのコード列
  Const fLine As Long = 5     '        データ開始行
  Const tCode As String = "H"   'Scheduleシートのコード列
  Const tLine As Long = 10     '        データ開始行
  
  Dim dic As Object
  Dim c As Range
  Dim x As Long
  Dim v As Variant
  Dim i As Long
  Dim j As Long
  Dim shTo As Worksheet

  Set shTo = Sheets("Schedule")
  Set dic = CreateObject("Scripting.Dictionary")
  
  x = shTo.Range(tCode & shTo.Rows.Count).End(xlUp).Row
  v = shTo.Range("AD" & tLine & ":AQ" & x).Formula
  
  For Each c In Range(shTo.Range(tCode & tLine), shTo.Range(tCode & x))
    dic(c.Value) = c.Row - tLine + 1
  Next
  
  With Sheets("Process")
    For Each c In Range(.Range(fCode & fLine), .Range(fCode & .Rows.Count).End(xlUp))
      If dic.exists(c.Value) Then
        i = dic(c.Value)
        For j = 1 To UBound(v, 2)
          v(i, j) = c.EntireRow.Range("E1").Offset(, j - 1).Value
        Next
      End If
    Next
  End With
  
  shTo.Range("AD" & tLine).Resize(UBound(v, 1), UBound(v, 2)).Value = v
  shTo.Select
  
  MsgBox "転記完了"

End Sub

【73718】Re:検索してマッチしたら転記
発言  UO3  - 13/2/6(水) 17:04 -

引用なし
パスワード
   ▼nonoka さん:

こんにちは

>
>下記で実行してみましたが、完了できませんでした。
>現象としては部分的に転記されますが、すべての行に転記できていないじょうたいです。

こちらでは、マッチしたものがすべて転記されているんですが、不思議ですねぇ。
以下のレイアウト規定は間違っていないんですよね?

>  Const fCode As String = "D"   'Processシートのコード列
>  Const fLine As Long = 5     '        データ開始行
>  Const tCode As String = "H"   'Scheduleシートのコード列
>  Const tLine As Long = 10     '        データ開始行

【73719】Re:検索してマッチしたら転記
発言  UO3  - 13/2/6(水) 17:22 -

引用なし
パスワード
   ▼nonoka さん:

もし、シートのレイアウトに誤解がなければ、転記されない原因は1つしか考えられません。

たとえば双方に ABC というコードがあるので、これが転記されるはず・・・
という状況で、見た目 ABC ですが、一方のコードの後ろに スペースがあるとか
目には見えない特殊コードがあるとか。
ないしは全角・半角が異なっているとか。
その場合、同じコードとはみなされません。

同じはずなのに転記されなかった行の、双方のコードのセルに対して、
シート上の、どこかのセルに =LEN(そのセル) こう記述したとき、同じ数字がでますか?

【73723】Re:検索してマッチしたら転記
回答  nonoka  - 13/2/6(水) 19:42 -

引用なし
パスワード
   ▼UO3 さん:
私もそうだと思い確認しましたが、問題ありませんでした。
検証してみます。

Hに前回のコードでコピーされた途端に転記されるようにできますか?

【73724】Re:検索してマッチしたら転記
発言  UO3  - 13/2/6(水) 19:54 -

引用なし
パスワード
   ▼nonoka さん:

>Hに前回のコードでコピーされた途端に転記されるようにできますか?

できますよ。
今回のテーマが片付いたら、前回のINPUT開始の最後、Call 計画調整 の下に
Call 一つ目 をいれればOKです。

【73725】Re:検索してマッチしたら転記
質問  nonoka  - 13/2/6(水) 20:20 -

引用なし
パスワード
   ▼UO3 さん:
Callひとつ目 出来ました!
ですが、テーマ完了しません。

質問です。
このコードは計画調整のように一列ずつ検索していくタイプでしょうか?
現状同じコードが続くことがあります。
昇順などに並んでいません。
関係ありますか?

【73726】Re:検索してマッチしたら転記
発言  UO3  - 13/2/6(水) 21:27 -

引用なし
パスワード
   ▼nonoka さん:

>現状同じコードが続くことがあります。

えっ? コードの重複は無かったんじゃないんですか?
あるならあるで対応できますけど、その場合は、上の方で質問したように
重複した場合の転記先を明確にしてください。
Schedule側で重複した場合、Processで重複した場合、両方で、それぞれ重複があった場合。
そういったケースに分けて教えてください。

>昇順などに並んでいません。

順序は関係有りません。

とにかく、現在のコードはアップ時にコメントしたとおり

Schedule側で重複があればあと勝ち、Process側で重複あればSchedule側、上書き
という仕様にしています。

ということです。

【73727】Re:検索してマッチしたら転記
回答  nonoka  - 13/2/6(水) 22:05 -

引用なし
パスワード
   ▼UO3 さん:

>Schedule側で重複があればあと勝ち、Process側で重複あればSchedule側、上書き
>という仕様にしています。
>
Process側にはコード重複はありません。
Schedule側には重複してコードが並ぶ場合があります。

それで重複した最後の行だけに転記されていたのですね。
理解不足で申し訳ありませんでした。

【73734】Re:検索してマッチしたら転記
発言  UO3  - 13/2/7(木) 6:57 -

引用なし
パスワード
   ▼nonoka さん:

とりあえず、一つ目改訂版です。

Sub ひとつ目()
  Const fCode As String = "D"   'Processシートのコード列
  Const fLine As Long = 5     '        データ開始行
  Const tCode As String = "H"   'Scheduleシートのコード列
  Const tLine As Long = 10     '        データ開始行
  
  Dim dic As Object
  Dim c As Range
  
  Application.ScreenUpdating = False
  
  Set dic = CreateObject("Scripting.Dictionary")
  
  With Sheets("Process")
    For Each c In Range(.Range(fCode & fLine), .Range(fCode & .Rows.Count).End(xlUp))
      dic(c.Value) = c.EntireRow.Range("E1:R1").Value
    Next
  End With
  
  With Sheets("Schedule")
    For Each c In Range(.Range(tCode & tLine), .Range(tCode & .Rows.Count).End(xlUp))
      If dic.exists(c.Value) Then c.EntireRow.Range("AD1:AQ1").Value = dic(c.Value)
    Next
    .Select
  End With
  
  Application.ScreenUpdating = True
  
End Sub

【73735】Re:検索してマッチしたら転記
発言  UO3  - 13/2/7(木) 7:01 -

引用なし
パスワード
   ▼nonoka さん:

二つ目もアップしておきますね。
このコードでは
・SHipped というブックは、すでにマクロブックと同じフォルダに存在する。
・タイトル行、書式などもセット済み。
・常に、Scheduleから洗い替え。(作り直し)としています。(積み上げではない)

Sub ふたつ目()
  Const fLine As Long = 10     '       データ開始行
  Const tLine As Long = 10     '       データ開始行

  Dim shTo As Worksheet
  Dim Wb As Workbook
  Dim c As Range
  Dim z As Long
  
  Application.ScreenUpdating = False
  
  Set Wb = Workbooks.Open(ThisWorkbook.Path & "\Shipped.xls")
  Set shTo = Wb.Worksheets("Shipped")
  
  With shTo
    Range(.Range("A1"), .UsedRange).Offset(tLine - 1).ClearContents
  End With
  
  z = tLine - 1
  With ThisWorkbook.Sheets("Schedule")
    For Each c In .Range("A" & fLine, .Range("A" & .Rows.Count).End(xlUp))
      If c.Value = 1 Then
        z = z + 1
        shTo.Range("A" & z & ":AU" & z).Value = c.EntireRow.Range("A1:AU1").Value
      End If
    Next
    Application.Goto shTo.Range("A1")
  End With
  
  Application.ScreenUpdating = True
  MsgBox "転記完了"
End Sub

【73736】Re:検索してマッチしたら転記
回答  nonoka  - 13/2/7(木) 10:11 -

引用なし
パスワード
   ▼UO3 さん:
ひとつ目完了しました。ありがとうございました。
ふたつ目ですが、ほんと説明不足で申し訳ありません。、
Scheduleのシート及びこのブックにデータを追加していくとデータ量が大きくなってきます。その為、完了したデータをShippedに移動させたいというのが目的です。

Scheduleから洗い替えではなく、Shippedにデータを移していきデータは積み上げとしたいです。
A列に1が入った途端に移動できますか?
イメージは列の切り取り→Shippedに列の貼り付け(値のみ)
移動させるということは行は上に詰まりますか?
詰まるとなると、表の最終行に行を追加したいです。
そのあと2000行目をコピーして同じく2000行目にコピーした列を挿入


>・SHipped というブックは、すでにマクロブックと同じフォルダに存在する。
>・タイトル行、書式などもセット済み。
>・常に、Scheduleから洗い替え。(作り直し)としています。(積み上げではない)
>
>Sub ふたつ目()
>  Const fLine As Long = 10     '       データ開始行
>  Const tLine As Long = 10     '       データ開始行
>
>  Dim shTo As Worksheet
>  Dim Wb As Workbook
>  Dim c As Range
>  Dim z As Long
>  
>  Application.ScreenUpdating = False
>  
>  Set Wb = Workbooks.Open(ThisWorkbook.Path & "\Shipped.xls")
>  Set shTo = Wb.Worksheets("Shipped")
>  
>  With shTo
>    Range(.Range("A1"), .UsedRange).Offset(tLine - 1).ClearContents
>  End With
>  
>  z = tLine - 1
>  With ThisWorkbook.Sheets("Schedule")
>    For Each c In .Range("A" & fLine, .Range("A" & .Rows.Count).End(xlUp))
>      If c.Value = 1 Then
>        z = z + 1
>        shTo.Range("A" & z & ":AU" & z).Value = c.EntireRow.Range("A1:AU1").Value
>      End If
>    Next
>    Application.Goto shTo.Range("A1")
>  End With
>  
>  Application.ScreenUpdating = True
>  MsgBox "転記完了"
>End Sub

【73737】Re:検索してマッチしたら転記
発言  UO3  - 13/2/7(木) 12:14 -

引用なし
パスワード
   ▼nonoka さん:

では、二つ目の改訂版を。

Sub ふたつ目()
  Const fLine As Long = 10     '       データ開始行
  Const tLine As Long = 10     '       データ開始行

  Dim shTo As Worksheet
  Dim Wb As Workbook
  Dim c As Range
  Dim z As Long
  Dim r As Range
  
  Application.ScreenUpdating = False
  
  Set Wb = Workbooks.Open(ThisWorkbook.Path & "\Shipped.xls")
  Set shTo = Wb.Worksheets("Shipped")
  
  With ThisWorkbook.Sheets("Schedule")
    For Each c In .Range("A" & fLine, .Range("A" & .Rows.Count).End(xlUp))
      If c.Value = 1 Then
        z = shTo.Range("A" & shTo.Rows.Count).End(xlUp).Row + 1
        shTo.Range("A" & z & ":AU" & z).Value = c.EntireRow.Range("A1:AU1").Value
        If r Is Nothing Then
          Set r = c
        Else
          Set r = Union(r, c)
        End If
      End If
    Next
    If Not r Is Nothing Then r.EntireRow.Delete
    Application.Goto shTo.Range("A1")
  End With
  
  Application.ScreenUpdating = True
  MsgBox "転記完了"
End Sub

【73739】Re:検索してマッチしたら転記
質問  nonoka  - 13/2/7(木) 14:18 -

引用なし
パスワード
   ▼UO3 さん:

ありがとうございます。
行移動させると、移動した分だけ表が小さくなる(関数の入っているセルもある為)ので最終行2000行目をコピーしてそれを2000行目にコピーしたいです。
素人ながら、下記を入れてみました。

  Rows("2000:2000").Select
  Selection.Copy
  Selection.Insert Shift:=xlDown
  Application.CutCopyMode = False
  ActiveWindow.ScrollRow = 10

1行移動だとこれでOKですが、複数移動した場合も1行追加になってしまいます。
移動した行数分追加したいです。下記のどこに追加すればいいかもご教授ください。


>
>Sub ふたつ目()
>  Const fLine As Long = 10     '       データ開始行
>  Const tLine As Long = 10     '       データ開始行
>
>  Dim shTo As Worksheet
>  Dim Wb As Workbook
>  Dim c As Range
>  Dim z As Long
>  Dim r As Range
>  
>  Application.ScreenUpdating = False
>  
>  Set Wb = Workbooks.Open(ThisWorkbook.Path & "\Shipped.xls")
>  Set shTo = Wb.Worksheets("Shipped")
>  
>  With ThisWorkbook.Sheets("Schedule")
>    For Each c In .Range("A" & fLine, .Range("A" & .Rows.Count).End(xlUp))
>      If c.Value = 1 Then
>        z = shTo.Range("A" & shTo.Rows.Count).End(xlUp).Row + 1
>        shTo.Range("A" & z & ":AU" & z).Value = c.EntireRow.Range("A1:AU1").Value
>        If r Is Nothing Then
>          Set r = c
>        Else
>          Set r = Union(r, c)
>        End If
>      End If
>    Next
>    If Not r Is Nothing Then r.EntireRow.Delete
>    Application.Goto shTo.Range("A1")
>  End With
>  
>  Application.ScreenUpdating = True
>  MsgBox "転記完了"
>End Sub

【73740】Re:検索してマッチしたら転記
発言  UO3  - 13/2/7(木) 18:32 -

引用なし
パスワード
   ▼nonoka さん:

式が入っていて復元したのは2000行目だけということではなく、
10行目から2000行目までに入っており、行削除で繰り上がった行数だけ
下にその式を(新しい2000行目まで)埋めたいということですね?

で、2001行目以降は完全な空白と考えていいですか?

【73741】Re:検索してマッチしたら転記
回答  nonoka  - 13/2/7(木) 18:45 -

引用なし
パスワード
   ▼UO3 さん:

>
>式が入っていて復元したのは2000行目だけということではなく、
>10行目から2000行目までに入っており、行削除で繰り上がった行数だけ
>下にその式を(新しい2000行目まで)埋めたいということですね?

その通りです。


>
>で、2001行目以降は完全な空白と考えていいですか?

空白です。

【73742】Re:検索してマッチしたら転記
発言  UO3  - 13/2/7(木) 22:50 -

引用なし
パスワード
   ▼nonoka さん:

それでは以下で。

Sub ふたつ目()
  Const fLine As Long = 10     '       データ開始行
  Const tLine As Long = 10     '       データ開始行

  Dim shTo As Worksheet
  Dim Wb As Workbook
  Dim c As Range
  Dim z As Long
  Dim r As Range
  
  Application.ScreenUpdating = False
 
  Set Wb = Workbooks.Open(ThisWorkbook.Path & "\Shipped.xls")
  Set shTo = Wb.Worksheets("Shipped")
 
  With ThisWorkbook.Sheets("Schedule")
    
    For Each c In .Range("A" & fLine, .Range("A" & .Rows.Count).End(xlUp))
      If c.Value = 1 Then
        z = shTo.Range("A" & shTo.Rows.Count).End(xlUp).Row + 1
        shTo.Range("A" & z & ":AU" & z).Value = c.EntireRow.Range("A1:AU1").Value
        If r Is Nothing Then
          Set r = c
        Else
          Set r = Union(r, c)
        End If
      End If
    Next
    If Not r Is Nothing Then
      .Rows(2000).Copy .Range("A2001").Resize(r.Count)
      r.EntireRow.Delete
    End If
    Application.Goto shTo.Range("A1")
  End With
 
  Application.ScreenUpdating = True
  MsgBox "転記完了"
End Sub

【73744】Re:検索してマッチしたら転記
回答  nonoka  - 13/2/8(金) 9:13 -

引用なし
パスワード
   ▼UO3 さん:

二つ目も完了しました。
ありがとうございました。ほんとに助かりました。
今後とも宜しくお願い申し上げます。

1539 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free