2017-11-30 14 views
1

特定の列のセル値を定義済みの名前に置き換えるコードを実行しようとしています。また、値の最初の9文字がxxxxxxxxxの場合にのみ置き換えが行われるという条件があります。特定のシートのセル値を定義済みの名前に置き換えます。

もっと正確には、2つの特定のワークシートでC:Cの値を変更する必要があります(ブック全体をループしたくありません)。

コードで何も起こらない理由はわかりません(エラーメッセージなし、何もありません)。

しかし、これらの2つの特定のワークシートでコードを動作させる場合は、Withを使用しないでください。私はまた、Rangeの私の使用は、おそらく全く正しいとは知りません。

Sub ChangeMe() 

    Dim cl As Range 

    For Each cl In Worksheets("Sheet1").Range("C:C").End(xlUp) 
    With Worksheets("Sheet2").Range("C:C").End(xlUp) 
     If Left(cl.Value, 9) = "XXXXXXXXX" Then 
     cl.Value = ThisWorkbook.Names("MyDefinedName").RefersToRange 
     End If 
    End With 
    Next cl 

End Sub 
+1

あなたの投稿を何度も読んでも、あなたが遂行しようとしていることがまだ分かりません。あなたは「XXXXXXX」がどこにあるのか説明できますか?どの欄でどのシート?それが見つかると、あなたはそれをどのような価値に置き換えたいのですか? –

+0

'If'文の' cl.Value'に '1'や' test'のような別の値を代入しようとしましたか?同じ結果ですか? – freginold

+0

'Ref'ToRange'が単一のセルである限り、あなたのコードは' cl'の内容を 'MyDefinedName'で参照されるセルの内容に置き換えます**' MyDefinedName'が複数のセルを参照する場合はおそらく'... RefersToRange(1,1)'がより適切かもしれません。しかし、より多くの情報がなければ、言うのは難しい。 –

答えて

0

のは、これはあなたの入力であることを想像してみましょう:

enter image description here

この場合、あなたは、C1(名前付き範囲のxxxx123)の値の範囲A1:A2内の値を変更することのでxxxx123で始まります。これは、それを達成するためのコードです:

Public Sub TestMe() 

    Dim myCell   As Range 
    Dim myNamedRange As String 

    myNamedRange = "xxxx123" 

    For Each myCell In Range("A1:A2") 
     If Left(myCell, Len(myNamedRange)) = myNamedRange Then 
      myCell.Value = Range(myNamedRange) 
     End If 
    Next myCell 

End Sub 
0

私は(私はそれを疑うもの)が正しくあなたのポストを理解している場合、私はあなたが「シート1」と「Sheet2の」両方の列「C」をループにしたいと思います。 9 "XXXXXXXXX"で始まるすべてのセルは、"MyDefinedName"名前付き範囲の値で置き換える必要があります。

コード

Option Explicit 

Sub ChangeMe() 

Dim cl As Range 
Dim sht As Worksheet 

For Each sht In ThisWorkbook.Sheets 
    With sht 
     If .Name = "Sheet1" Or .Name = "Sheet2" Then 
      For Each cl In .Range("C1:C" & .Cells(.rows.Count, "C").End(xlUp).Row) 
       If Left(cl.Value, 9) = "XXXXXXXXX" Then 
        cl.Value = ThisWorkbook.Names("MyDefinedName").RefersToRange 
       End If 
      Next cl 
     End If 
    End With 
Next sht 

End Sub 
1

であなたの元の質問に答える:

何もコード(エラーメッセージなし、何も)には起こらない、なぜ私はわかりません。

ワークシートの値が大文字XXXXXXXXXのためのあなたのコードをチェックしながら、xxxxxxxxx小文字であるため、何も起こりません。

しかし、これらの2つの特定のワークシートでコードを動作させる場合は、Withを使用しないでください。私は、以下のデモンストレーションを行いますよう

実は、あなたは、複数のシートでWithを使用することができます。

私はRangeの使用が多分正しいとは限りません。

これは本当です。大文字の問題を修正する場合は、C1だけが変更されます。これは、.End()が単一のセルで動作するためです。マルチセル範囲を指定すると、最も左上のセルが使用されます。したがって、.Range("C:C").End(xlUp).Range("C1").End(xlUp)と等価であり、ちょうどC1と評価されます。


以下は、あなたの更新の質問にお答えします:

Option Explicit 

Public Sub ChangeMe() 

    Const l_xxxxxxxxx  As String = "xxxxxxxxx" 
    Const l_MyDefinedName As String = "MyDefinedName" 
    Const s_Delimiter  As String = "," 
    Const s_WorkSheetNames As String = "Sheet1,Sheet2" 
    Const s_ColumnToChange As String = "C:C" 

    Dim varWorkSheetName As Variant 
    For Each varWorkSheetName In Split(s_WorkSheetNames, s_Delimiter) 
    With Worksheets(varWorkSheetName).Range(s_ColumnToChange) 
     Dim rngCell As Range 
     For Each rngCell In .Resize(.Cells(Rows.Count).End(xlUp).Row) 
     With rngCell 
      Dim strCellValue As String: strCellValue = .Value2 
      If Left(strCellValue, Len(l_xxxxxxxxx)) = l_xxxxxxxxx Then 
      .Value2 _ 
      = Names(l_MyDefinedName).RefersToRange.Value2 _ 
      & Right$(strCellValue, Len(strCellValue) - Len(l_xxxxxxxxx)) 
      End If 
     End With 
     Next rngCell 
    End With 
    Next varWorkSheetName 

End Sub 


注:すべてのリテラル値を一度のみ入力された定数を使用するのは良いアイデアです

  • をし、一緒にグループ化された。

  • .Valueの代わりに.Value2を使用すると、暗黙的なキャストを避けるため、セルの値にアクセスするための推奨方法です。 (.Valueを使用しても問題が発生することがあります)

  • 驚いたことに、VBAでは変数の最初の使用にできるだけ近い変数宣言を置くことをお勧めします。このような理由の2つは、1)読みやすさを向上させ、2)将来のリファクタリングを簡素化することです。 Dimに遭遇するたびに変数が再初期化されないことを覚えておいてください。初期化は初めて発生します。

+0

ありがとうRobinCTS。このコードは頭の上の爪を握る - 優れた動作します。ヒントもありがとう。彼らは非常に有益であり、将来的には間違いなくそれらを利用するでしょう。 – Dozens

+0

@Dozensベストアンサーを受け入れることを忘れないでください(答えの左上にある灰色のチェックマークをクリックしてください)。 「上」の三角形をクリックすることによって)。 – robinCTS

関連する問題