2017-04-13 9 views
0

コードを実行するたびに、B15内の関数から2つの列を右に移動したいと考えています。Offset FormulaR1C1 eachボタンClick

'This is the initial reference position: 
Range("B15").FormulaR1C1 = "=(R[-11]C[1]+R[-11]C[3])/(R[-14]C[3]+R[-14]C[1])" 

'Next reference position would be this: 
Range("B15").FormulaR1C1 = "=(R[-11]C[3]+R[-11]C[5])/(R[-14]C[5]+R[-14]C[3])" 

私はCの値の変数を入れてみましたが、複数回前にループするのに問題がありました。

コードを構造化する方法に関するアイデアはありますか?

答えて

2

各文字をループしてC [次の桁を知るまで]を数値で表す文字列であるため(グローバル変数を使用したくない場合)、文字列です。それらを抽出して2を追加します。これを行う方法の例がここにあります

Sub button1_click() 
Dim sFormula As String 
Dim sParts As String 
Dim cChar As String 
Dim cFound As Boolean 
Dim bracketFound As Boolean 
Dim i As Long 
cFound = False 
bracketFound = False 


sParts = Range("B15").FormulaR1C1 
'loop through the string 
For i = 1 To Len(sParts) 
    If cFound = True Then 'did we already find the C in the string 
     If bracketFound = True Then 'did we already find the first bracket 
      Dim iCount As Long 
      iCount = 0 'how many numeric digits we will have 
      While IsNumeric(Mid(sParts, i + iCount + 1, 1)) = True 'check each digit after to see if it is numeric 
       iCount = iCount + 1 
      Wend 

      cChar = CStr(CInt(Mid(sParts, i, 1 + iCount)) + 2) 'get our number and add 2 
      'update i 
      i = i + iCount 
      'reset flags 
      bracketFound = False 
      cFound = False 
     Else 
      If Mid(sParts, i, 1) = "[" Then 'check for inner bracket 
       bracketFound = True 
       cChar = Mid(sParts, i, 1) 
      End If 
     End If 
    Else 
     If Mid(sParts, i, 1) = "C" Then 'check for the C char 
      cFound = True 
      cChar = Mid(sParts, i, 1) 
     Else 
      cChar = Mid(sParts, i, 1) 
     End If 
    End If 
    sFormula = sFormula & cChar 'update formula 

Next i 
'set the new formula 
Range("B15").FormulaR1C1 = sFormula 

End Sub 
+0

私は非常に感銘を受けた!あなたは完全に実行しているコードを書く時間を取っただけでなく、いつかあなたと同じくらい素晴らしいことを学ぶのを助けるためにコメントに役立ちました!ありがとうございました。 – BarryMahnly