2011-10-24 13 views
2

テーブルがたくさんあるワークシートがあり、テーブルを使い始めるのはかなり便利だからです。しかし、以前はExcelのテーブルでコンテンツを操作したことはありませんでした。これらのテーブルは基本的にFirstnameとLastnameの列のリストです。これらの列の値に基づいて、私はユーザー名を生成したい。しかし、私は、ワークシートやテーブル名などの引数を取る汎用Subを書くことを試みています。Excel VBA - テーブル内のデータを選択、取得、設定する

Cells(2, 2).Select 

Do 
    strFirstName = ActiveCell.Value 
    strLastName = ActiveCell.Offset(0, 2).Value 

    strFirstName = Left(strFirstName, 1) 

    strUserName = strFirstName & strLastName 
    strUserName = LCase(strUserName) 

    ActiveCell.Offset(0, 5).Value = strUserName 
    ActiveCell.Offset(1, 0).Select 
Loop Until IsEmpty(ActiveCell) 

そして今、私はテーブルからのデータで、まったく同じことをやろうとしている:データがテーブルにされていない場合

は、以前私はこれをやりました。何か案は?私はテーブルを見つけることができるかどうかを見るために "ActiveSheet"の時計を追加しましたが、それはActiveSheet.ListObjectsにあるようですが、そこには.Selectオプションが表示されませんでした。おそらく、私はそれのコンテンツを操作するためにテーブルを選択する必要はありません?

答えて

6

範囲を超えてループするとき(テーブル内であろうと範囲内であろうと)、データをバリアント配列にコピーし、その配列を操作してから、その結果をシートにコピーする方が速いのが普通です。何のVBAは

=LOWER(LEFT([@FirstName],1)&[@LastName]) 
を必要としないで、あなたもちょうど UserName列自体に式を使用することができます。このような状況のために

For i = 1 To oUsers.ListRows.Count 
     oUsers.ListColumns("UserName").DataBodyRange.Rows(i) = LCase(Left(_ 
     oUsers.ListColumns("FirstName").DataBodyRange.Rows(i), 1) & _ 
     oUsers.ListColumns("LastName").DataBodyRange.Rows(i)) 
    Next 

:あなたは本当に範囲自体をループにしたい場合は

Sub zz() 
    Dim oUsers As ListObject 
    Dim v As Variant 
    Dim vUserName() As Variant 
    Dim i As Long 
    Dim colFirst As Long 
    Dim colLast As Long 
    Dim colUser As Long 

    Set oUsers = ActiveSheet.ListObjects(1) 
    colFirst = oUsers.ListColumns("FirstName").Index 
    colLast = oUsers.ListColumns("LastName").Index 
    colUser = oUsers.ListColumns("UserName").Index 

    v = oUsers.DataBodyRange 
    ReDim vUserName(1 To UBound(v, 1), 1 To 1) 
    For i = 1 To UBound(v, 1) 
     vUserName(i, 1) = LCase(Left(v(i, colFirst), 1) & v(i, colLast)) 
    Next 
    oUsers.ListColumns("UserName").DataBodyRange = vUserName 


End Sub 

EDIT

申し訳ありませんが、文字列の文字のリストを削除するための数式方法がわかりません。このためにvbaに戻す必要があるかもしれません。これを行うためのユーザー定義関数があります。

=DeleteChars([@UserName],{"$","#"}) 

削除文字を削除したい文字の配列リストと{"$","#"}を置き換えるになりますあなたの式は、(あなたがいる限りあなたが必要として、リストを作ることができる)
文字を使用置き換えます{"$","#";"X","X"}ここまでのリストは、の後の古い文字です。新しい。 listsaが同じ長さであることを確認してください。

UDFコード:

Function DeleteChars(r1 As Range, ParamArray c() As Variant) As Variant 
    Dim i As Long 
    Dim s As String 

    s = r1 
    If UBound(c(0), 1) = 1 Then 
     For i = LBound(c(0), 2) To UBound(c(0), 2) 
      s = Replace(s, c(0)(1, i), "") 
     Next 
    Else 
     For i = LBound(c(0), 2) To UBound(c(0), 2) 
      s = Replace(s, c(0)(1, i), c(0)(2, i)) 
     Next 
    End If 
    DeleteChars = s 
End Function 
+0

最後の式は完璧であることを!ありがとうございました!その式を結合して文字を置き換える方法はありますか?一部の人には姓に奇妙な文字があり、ユーザー名の代わりに使用したいと思っています。あなたが知っている場合にのみ:) –

関連する問題