2016-09-11 5 views
0

Excel VBAで値を連結するためのコードを、行内の7列までの間に^を使用して記述しました。私が最初の6列に同じ値を入力すると、^を除いた出力が得られることに気付きました。連結コードが意図したとおりに動作しない

Private Sub CommandButton21_Click() 
    Cells(2, 1).Select 
    Dim stri As String, eaid_1 As String, eaid_2 As String, eaid_3 As String, _ 
     eaid_4 As String, eaid_5 As String, eaid_6 As String, eaid_7 As String 
    Do Until Selection.Value = ""  
     eaid_1 = Selection.Value  
     eaid_2 = Selection.Offset(0, 1).Value  
     eaid_3 = Selection.Offset(0, 2).Value  
     eaid_4 = Selection.Offset(0, 3).Value  
     eaid_5 = Selection.Offset(0, 4).Value  
     eaid_6 = Selection.Offset(0, 5).Value  
     eaid_7 = Selection.Offset(0, 6).Value   
     stri = eaid_1 & "^" & eaid_2 & "^" & eaid_3 & "^" & eaid_4 & "^" & eaid_5 _ 
         & "^" & eaid_6 & "^" & eaid_7   
     Selection.Offset(0, 8).Value = stri  
     Selection.Offset(1, 0).Select 
    Loop 

    Cells(2, 9).Select 
    Dim x As String, y As String, z As String 
    Do Until Selection.Value = "" 
     x = Selection.Value 
     y = Right(x, 6) 
     z = Replace(y, "^", "") 
     x = Replace(x, y, z)   
     Selection.Offset(0, 0).Value = x 
     Selection.Offset(1, 0).Select 
    Loop 
End Sub 
+1

これは、2番目のループのコードで得られる効果です。そのループを削除すると、これは起こりません。だから問題は次のようになります:その第2のループでのあなたの意図は? FYI:最後の6文字から '^'を削除します。これは、2つの '^'の間の値が異なる長さを持つことがあるので、予期しない結果をもたらす可能性があります。したがって、時には1つの '^'が削除されることもあれば、2つの場合もあります... – trincot

+0

また 'Cells(2、1).Select'を避け、' eaid_2 = Selection.Offset(0、1) .Value'の代わりに、 'eaid_2 = Cells(2,1).Offset(0、1).Value'を使用してください。よりダイナミックにすることができます。 'Dim Rng as Range'、' Set Rng = Range( "B1") '、' eaid_2 = Rng.Offset(0、1).Value'の順に選択すると、 –

+0

でも可能です。コード全体をArrayに入れ、 'Dim eaid()をVariant'にしてコードコードをもっと綺麗に見せて、デバッグしやすくしてください –

答えて

2
Private Sub CommandButton21_Click() 
    Const NUM_COLS As Long = 7 
    Dim c As Range, rng As Range 

    Set c = Cells(2, 1) 
    Do While c.Value <> "" 
     Set rng = c.Resize(1, Application.CountA(c.Resize(1, NUM_COLS))) 
     c.Offset(0, NUM_COLS).Value = _ 
       Join(Application.Transpose(Application.Transpose(rng.Value)), "^") 
     Set c = c.Offset(1, 0) 
    Loop 
End Sub 

いくつかの説明:

  • あなたは範囲で動作するようにSelect/Activateの使用を避け、代わりに範囲変数を使用する必要があります(上記cなど)
  • DoWhile...Loop開始時A2になり、cが空白になるまで続きます。
  • rng変数repr cで始まり、値があるセル数(最大7セルまで)の右に伸びるRangeオブジェクトを示しています。​​ワークシート関数を使用して値の数をカウントし、Resizeは必要なサイズの範囲を作成します。
  • Application.Transposeを繰り返すと、rng.Valueの2次元配列から1次元配列が作成されます。
  • 最後に、Joinは、1次元配列をとり、入力配列の各要素が次の配列に連結され、2番目の引数で区切られた単一の文字列を返します( "^")
+0

あなたは私にそれを打つ! 'Join()'はやり方でなければなりません。サイズ変更された範囲を 'c.Resize(1、NUMCOLS).SpecialCells(xlCellTypeConstants)'に変更した場合、ぎざぎざの行(つまり、各行の最後の空のセル)の問題も丸くなります。 – Ambie

+0

@Ambie - ありがとう、私はその部分を逃した... –

+0

@Ambie私はあなたが意味するものを得ていない。 –

1

コードは以下意志「CONCATENATE」各列(カラムAがデータを有する場合)をチェック各行:iは、列7または5件まで満たす場合には、このコードは以下の通りである起こりません最後の列にデータがある場合は、それらを結合します(各配列要素の間に "^"を追加します)。現在、あなたの記事のように列Iに結果の文字列を入れます。

2番目のループの目的は何ですか?あなたの最終的な結果はどのように見えますか?

Private Sub CommandButton21_Click() 

Dim Rng    As Range 
Dim stri   As String 
Dim eaid()   As Variant 
Dim lRow   As Long 
Dim i    As Long 
Dim LastColumn  As Long 

' start from Cell A2 
lRow = 2 
Do Until Range("A" & lRow).Value = "" 
    ' get the last column with data in current row 
    LastColumn = Cells(lRow, Columns.Count).End(xlToLeft).Column 
    ReDim eaid(1 To LastColumn) 

    Set Rng = Range("A" & lRow) 

    ' read all Range values to one-dimension array using Transpose 
    eaid = Application.Transpose(Application.Transpose(Rng.Resize(1, LastColumn).Value)) 

    ' read all array elements to String 
    For i = LBound(eaid) To UBound(eaid) 
     If i = LBound(eaid) Then 
      stri = stri & eaid(i) 
     Else 
      stri = stri & "^" & eaid(i) 
     End If 
    Next i 

    Rng.Offset(0, 8).Value = stri 
    stri = "" 
    lRow = lRow + 1 
Loop 

End Sub 
関連する問題