web-dev-qa-db-ja.com

すべてのセルをループせずに、範囲全体を大文字に変換します

現在、次のコードを使用して、ティッカーシンボルのリストを小文字から大文字に変換しています。

Dim Tickers As String
Dim n As Integer
For n = 2 To Last
    Tickers = UCase(W.Cells(n, 1).Value)
    W.Cells(n, 1).Value = Tickers
Next n

範囲全体を1行に変換するために使用できる方法はありますか?何かのようなもの:

Range("A1:A20").convertouppercasesomehow
6
dwstein

範囲全体を1行に変換するために使用できる方法はありますか?

はい、ループせずに変換できます。これを試して

_Sub Sample()
    [A1:A20] = [INDEX(UPPER(A1:A20),)]
End Sub
_

または、可変範囲を使用して、次のことを試してください。

_Sub Sample()
    dim rng as Range
    dim sAddr as string

    set rng = Range("A1:A20")
    sAddr = rng.Address

    rng = Evaluate("index(upper(" & sAddr & "),)")

End Sub
_

あなたの例のように

_W.Range("A1:A20") = [index(upper(A1:A20),)]
_

説明

[A1:A20] = [INDEX(UPPER(A1:A20),)]には2つの部分があります

パート1

上に示したように、_[A1:A20]_はRange("A1:A20")を書くための短い方法にすぎません。

パート2

[INDEX(UPPER(A1:A20),)]

IndexUpperはワークシート関数です。したがって、Application.Worksheetfunction.Index()を使用できますが、Application.Worksheetfunction.UPPER()のようなUPPERに相当するものがないため、[cell] = [UPPER(cell)]としか記述できません。

その行で、配列を返すようにVBAに指示しています。ここで、INDEXが機能します。 (ご存知のとおり、INDEX関数には、配列形式と参照形式の2つの形式があります。)指定しないことにより配列の行または列の場合、配列全体が必要であることをExcelに通知するだけです。 (VBAヘルプでも言及されています)したがって、基本的には、_[A1:A20]_の各セルを大文字に変換します

31
Siddharth Rout

そのように一行でそれを行うことはできませんが 次のような特定の範囲でそれを行うことができます。

Sub Test()
    Dim Rng As Range
    Dim c As Range

    Set Rng = ActiveSheet.Range("A1:A20")
    For Each c In Rng
        c.Value = UCase(c.Value)
    Next c
End Sub

これはかなりシンプルで直感的です。

4
Netloh

私がさまざまな情報源から集めたものから:

Function UcaseRangeAsArray(TargetRng As Range) As Variant()
Dim Arr()    
Arr = Evaluate("INDEX(UPPER(" & TargetRng.Address(External:=True) & "),)")    
UcaseRangeAsArray = Arr
Erase Arr
End Function
2

別の「ワンライナーハック」は次のとおりです。

Sub UCaseRange(rng As Range)
    rng = WorksheetFunction.Transpose(Split(UCase(Join( _
        WorksheetFunction.Transpose(rng), vbBack)), vbBack))
End Sub

これは、どのセルにもvbBack文字(ASCIIコード8)が含まれていないことを前提としています。

1
Peter Albert

Peter Albert によって提示されたエレガントな答えに関して、 WorksheetFunctionTranspose 関数にはいくつかの昔ながらの制限があります。具体的には、反転可能な65,535(最大符号なし整数-1)要素の上限があります。バリアント配列を一括ロードし、「メモリ内」を処理してから、変更された値をワークシートに返すことで、その制限を克服できます。

Sub test()
    With Worksheets("Sheet1")
        makeUpper .Range("A2:A1000000")
    End With
End Sub

Sub makeUpper(rng As Range)
    Dim v As Long, vUPRs As Variant
    With rng
        vUPRs = .Value2
        For v = LBound(vUPRs, 1) To UBound(vUPRs, 1)
            vUPRs(v, 1) = UCase(vUPRs(v, 1))
        Next v
        .Cells = vUPRs
    End With
End Sub

これは非常に迅速に処理されます。通常、100Kセルのデータは0.5秒未満で完了し、1Mセルは4〜6秒で変換できます。


これは、 Application.Selection プロパティのセルで作業することで恩恵を受けることができるサブプロシージャのタイプです。セレクション内のセルを処理するための定型フレームワークについては、 この回答 を参照してください。

0
user4039065