2016-08-19 17 views
0

Excel VBAの新機能で、試行錯誤とスタックオーバーフローで学習しています。私は解決策を探して数時間を費やしましたが(まだGoogle VBAの質問に最善を尽くしています...)、理解できるものは見つかりませんでした。Excel VBA - コピーされた数式を使用して名前付き範囲に挿入された新しい行のユーザーフォームデータを入力します。

私はもともと、特定の名前の範囲内の次の空の行にユーザーフォームのデータを入力するようにしましたが、今はもっと柔軟にする必要があることがわかりました。

Sheets("Budget Input").Range("ContractInputField") 

は、この時点でA50:E50である。 F50:V50には、自分の範囲と同数の行を通す必要のある数式が含まれています。

ユーザーがユーザーフォームの「OK」をクリックすると、私が必要:

  • (「ContractInputField」内の、範囲の最後のエントリの下および他の上記の既存の範囲内に挿入される新しい行既に行50にあるが、最初の "ok"で51に成長し、次に2番目の "ok"で51に成長する新しい行は、 OK "など)
  • この新しい行に入力するユーザーフォームデータ

ここで私は私の元のアプローチのために持っていたコードは次のとおりです。

Private Sub cmdOK_Click() 
Dim J As Long 

Sheets("Budget Input").Activate 
ActiveSheet.Range("ContractInputLine1").Activate 

Do While IsEmpty(ActiveCell.Offset(J, 0)) = False 
    J = J + 1 
Loop 

ActiveCell.Offset(J, 0).Value = Me.txtContractorName.Value 
ActiveCell.Offset(J, 1).Value = Me.txtContractPurpose.Value 
ActiveCell.Offset(J, 2).Value = Me.txtFlatRate.Value 
ActiveCell.Offset(J, 3).Value = Me.txtContractHourlyRate.Value 
ActiveCell.Offset(J, 4).Value = Me.txtContractHours.Value 
ActiveCell.Offset(J, 16).Value = Me.ContractYear2.Value 
ActiveCell.Offset(J, 17).Value = Me.ContractYear3.Value 
ActiveCell.Offset(J, 18).Value = Me.ContractYear4.Value 


'Clear boxes before next round of entry 
Dim ctl As Control 

For Each ctl In Me.Controls 
    If TypeName(ctl) = "TextBox" Or TypeName(ctl) = "ComboBox" Then 
     ctl.Value = " " 
    ElseIf TypeName(ctl) = "CheckBox" Then 
     ctl.Value = False 
    End If 

Next ctl 

End Sub 

私はどんな指導をしてみたいです!ありがとう!

答えて

0

あなたは試みることができる:

Private Sub cmdOK_Click() 
    Dim J As Long 
    Dim c As Long 

    With Sheets("Budget Input") 
     J = .Range("ContractInputLine1").Row 
     c = .Range("ContractInputLine1").Column 

     Do While Not IsEmpty(.Cells(J, c)) 
      J = J + 1 
     Loop 

     'Insert a new row for the new data, to ensure we don't start writing 
     ' beyond the end of the ContractInputField range. (Assumption is 
     ' that there is already at least 1 blank row included at the end of 
     ' ContractInputField or else even this won't stop the range being 
     ' exceeded.) 
     .Rows(J).EntireRow.Insert 

     'Copy values, formulae, and formats from the previous row 
     .Rows(J).EntireRow.FillDown 

     'Replace values with values from the form  
     .Cells(J, c + 0).Value = Me.txtContractorName.Value 
     .Cells(J, c + 1).Value = Me.txtContractPurpose.Value 
     .Cells(J, c + 2).Value = Me.txtFlatRate.Value 
     .Cells(J, c + 3).Value = Me.txtContractHourlyRate.Value 
     .Cells(J, c + 4).Value = Me.txtContractHours.Value 
     .Cells(J, c + 16).Value = Me.ContractYear2.Value 
     .Cells(J, c + 17).Value = Me.ContractYear3.Value 
     .Cells(J, c + 18).Value = Me.ContractYear4.Value 
    End With 

    'Clear boxes before next round of entry 
    Dim ctl As Control 

    For Each ctl In Me.Controls 
     If TypeName(ctl) = "TextBox" Or TypeName(ctl) = "ComboBox" Then 
      ctl.Value = " " 
     ElseIf TypeName(ctl) = "CheckBox" Then 
      ctl.Value = False 
     End If 

    Next ctl 

End Sub 

注:

1)あなたは、私がコードでのActiveCellを処分した気づくでしょう。それは私の個人的な好みです - 私は絶対にしなければ、活性化するか選択するのが好きではありません - あなたが必要があると感じたらそれを元に戻してください。それはcだけでc + 2で、どこでも1に置き換えることができ、列Aで開始しない場合のActiveCellを取り払うことで、私は念ContractInputLine1変数cを含める必要がありました

2)は、列Aにはなかったです、例えば、3に置き換えられます。

+0

これは私の目的にはうまく機能しました。本当にありがとうございました!今興味をそそられているのは、範囲の最後に空白の行を置かずに範囲に行を挿入する簡単な方法でしょうか? – Hummuston

+0

@Hummuston - 私はプログラム的に範囲を設定することで多少の作業(つまりnone)を行っていませんが、おそらく** ActiveWorkbook.Names( "ContractInputField")と言って現在の範囲を**拡張することができます** RefersTo = "=" Budget '!$ A50:$ E "&(J + 1)'を入力してください。あなたの質問は、現在の範囲が1行だけであることを示しているので、**範囲を 'ActiveWorkbook.Names(" ContractInputField ")に置き換えることができます** RefersTo =" = '予算入力'!$ A "&( J + 1)& ":$ E"&(J + 1) 'となります。 – YowE3K

関連する問題