2017-12-25 5 views
-3

私はvbaについて少し知っていますが、これをvbaを使用して実現したいと思います。 特殊なケースで、シートから別のシートにデータを転送しています。Excel VBA別のシートの特定の部分または範囲にセルデータを転送します

このような状況を考える:B10

  • D2:E10
  • G2:私はこれらの範囲

    • A4を持っている別のシートで をH10

    私のデータは、この

    のようなものです
    AXX | Contact no. 
    AXX | Address 
    AXX | Name 
    AXX | Summary 
    BXX | Address 
    BXX | Name 
    BXX | Contact no. 
    BXX | Details 
    CXX | Address 
    CXX | Name 
    CXX | Summary 
    DXX | Address 
    DXX | Name 
    DXX | Contact no. 
    DXX | Address 
    DXX | Name 
    

    私の識別子は最初の列(AXX、BXX ...)にあります。

    予想される出力は次のようになります。

    Row no| Column A |  Column B  | Column D | Column E | 
    1  |    |     |    |    | 
    2  |    |     | BXX   | Address  | 
    3  |    |     | BXX   | Name   | 
    4  | AXX   | Contact no. | BXX   | Contact no. | 
    5  | AXX   | Address  | BXX   | Details  | 
    6  | AXX   | Name   |    |    | 
    7  | AXX   | Summary  | CXX   | Address  | 
    8  |    |     | CXX   | Name   | 
    9  |    |     | CXX   | Summary  | 
    10 |    |     |    |    | 
    

    あなたが見ることができるとおり、私の識別子は、彼らが類似している場合、私はノーカウントだろう... AXX、BXXです。行の数と比較してください。私の範囲の行の行の。 BXXはAXXの横には配置されませんでした。これは、残りの行が3でBXXが4であるため、次の範囲に渡されるためです。また、BXXおよびCXXに見られるように、他の値を分離する空白のセルがあります。

    今のところ私が知っているのは、Forループを使用して行を数えることだけです。この感謝のためにあなたの助けを求めたいですか? 行を取得するための私の最初のコードは、私は私のコードが間違っている知っていると私は、このアプローチは正しい軌道に乗っているかどうかわからないのです

    Dim aa, aaLastrow As Long 
    
    aaLastrow = ShtData.Range("A" & Rows.Count).End(xlUp).Row 
    
    For aa = 2 To aaLastrow 
    
         If ShtData.Cells(aa, 2).Value = ShtData.Cells(bb, 4).Value Then 
    
          Sheets("Sheet1").Cells(aa, 1).Value = ShtData.Cells(aa, 2).Value 
    
         End If 
    
    Next aa 
    

    を数えます。

  • 答えて

    1

    この

    Sub test() 
        Dim Data As Worksheet, ToWs As Worksheet 
        Dim vData, vDB, vArray 
        Dim i As Integer, j As Long, n As Long 
        Dim rngDB(1 To 4) As Range 
    
        Set Data = Sheets(1) 
        Set ToWs = Sheets(2) 
    
        vData = Data.Range("a1").CurrentRegion 
        vArray = Array("A", "B", "C", "D") 
        With ToWs 
         Set rngDB(1) = .Range("a4:b10") 
         Set rngDB(2) = .Range("d2:e5") 
         Set rngDB(3) = .Range("d7:e10") 
         Set rngDB(4) = .Range("g2:h10") 
        End With 
    
        For i = 1 To 4 
         n = 0 
         rngDB(i).Clear 
         vDB = rngDB(i) 
         For j = 1 To UBound(vData) 
          If vData(j, 1) Like vArray(i - 1) & "*" Then 
           n = n + 1 
           vDB(n, 1) = vData(j, 1) 
           vDB(n, 2) = vData(j, 2) 
          End If 
         Next j 
         rngDB(i) = vDB 
        Next i 
    End Sub 
    
    +0

    ご回答ありがとうございます。この部分に問題があります。n = n + 1 vDB(n、1)= vData(j、1) – CJanon

    1
    =COUNTIF($A:$A, "AXX") 
    

    あなたが望むように見えるカウントを与えます。範囲を絞り込むことができ、硬い "AXX"の代わりにセルへの参照を挿入することができます。 VBAを使用する場合は、関数をApplication.Countif(Range, CountWhat)と呼びます。ここで、「範囲」はVBAで定義する範囲で、「CountWhat」はバリアントです。

    +0

    好きですが、それだけでBXXと同じように、残りの行に収まらない場合はどのように私は別の列にデータを移動することができますか? – CJanon

    +0

    あなたの質問はデータが移動されるべきルールを示すものではなく、それ自体の努力を示すものでもないので、あなたの質問はダウン投票されたと思います。しかし、行を数える方法についてのあなたの質問は明白であり、自分の努力を含んでいました。だから私はそれに答えました。 – Variatus

    関連する問題