-1

cell にセルを貼り付けてB2連結したセルから最初の文字を抽出し、次の行に移動して最後のデータ行まで繰り返す必要があります。C2A2

私は次のものを持っていますが、これは部分的に機能しますが、最初の行 A2 でのみ機能し、この 1 つの文字列を最後のデータ行までのすべての行に入力します。

Sub UserName()

Dim rng As range
Dim lastRow As Long

With Sheets("sheet1")
    lastRow = .range("E" & .Rows.Count).End(xlUp).Row
End With

For Each rng In Sheets("Sheet1").range("A2:A" & lastRow)
    rng.Value = fUserName(rng.Value)
Next
End Sub

関数

Function fUserName(ByVal strUserName As String) As String

Dim r As String

r = range("B2").Select
strUserName = Left(Trim(r), 1) & " " & range("C2")

fUserName = strUserName
End Function
4

6 に答える 6

3

そのためにVBAは必要ありません。数式を使用するだけですA2

=CONCATENATE(LEFT(B2, 1),C2)

そして、データを含むすべてのセルに対してそれを複製します。

于 2013-05-20T03:55:29.593 に答える
2

以下のコードを試してください。両方の手順を組み合わせました。 関数を使用する必要はありません , For eachループの必要はありません

Sub UserName()

    Dim lastRow As Long

    With Sheets("sheet1")
        lastRow = .Range("C" & .Rows.Count).End(xlUp).Row
    End With

    Range("A1:A" & lastRow).FormulaR1C1 = "= left(RC[1],1) & RC[2]"

End Sub
于 2013-05-20T05:05:03.513 に答える
1

範囲を関数に渡す必要があります。

Sub UserName()

Dim rng As range
Dim lastRow As Long

With Sheets("sheet1")
    lastRow = .range("E" & .Rows.Count).End(xlUp).Row
End With

For Each rng In Sheets("Sheet1").range("A2:A" & lastRow)
    rng.Value = fUserName(rng)
Next

End Sub

Function fUserName(rn as Range) As String  
    fUserName = Left(Trim(rn(1,2).value), 1) & " " & rn(1,3).value
End Function
于 2013-05-20T10:01:37.757 に答える
1

関数が間違っています。関数に strUserName を渡していますが、関数内で同じ変数を設定していますが、問題の本当の原因は、関数で静的参照を使用しているため、サブルーチンがどのセルであるかは問題ではありません関数を扱うと、セル B2 と C2 が見えます。

関数をまとめて削除し、行を置き換えるだけです

rng.Value = fUserName(rng.Value)

rng.Value = Left(Trim(rng.offset(0,1)), 1) & " " & rng.offset(0,2)

本当に関数を使用したい場合は、アクティブセルの値ではなく、範囲を関数に渡す必要があります。これは、その周りの他のセルの値に影響を与えないためです。

于 2013-05-20T03:57:24.717 に答える
0

明らかに、B2 と C2 はハードコードされた値であるため、変更されません。たとえば、範囲オブジェクトを使用してこれらの変更を行う必要があります。これが私がすることの擬似コードです。それを機能させるために必要な調整を行うことはあなたに任せます(あなたの質問にはあまり努力が見られないため)。

Function fUserName(rng as Range) as String
    fUserName = Left(Trim(rng.Offset(0, 1).value), 1) & " " & rng.Offset(0, 2).value
End Function

で呼び出す代わりにfUserName()rng.valueを入れるだけrngです。これは範囲オブジェクトを使用して、B と C の適切な行を取得します。

于 2013-05-20T03:55:16.887 に答える
-1

次のコードは最初の空白行を選択します

Sub SelFrstBlankRow()
Dim r1 As Range, r2 As Range, r3 As Range
Set r1 = Sheets("Sheet1").Range("a20")
Set r2 = Sheets("Sheet1").Range("u20")
Set r3 = Range(r1.End(xlUp), r2.End(xlUp)) 'r3 is the 1st blank row
r3.Select

End Sub
于 2014-07-31T16:02:15.630 に答える