2016-09-19 10 views
1

名前付きベイを持つ倉庫を表すデータベースを作成しようとしています。これには、Log Inのマテリアルと、必要なときにそれらをチェックする機能があります。Excel VBA - セルが空の場合は何か、それ以外の場合はエラーを返します

私のExcelワークブックには、Log InシートとRow AからRow Gのラベルが付いた7枚のシートがあり、倉庫内の通路を表しています。各通路には5つの棚といくつかのベイがあります。この情報は連結されて固有のロケーションを与えます。私は現在、VBAに材料が配置される場所が空かどうかを確認するよう頼んでいます。そうであれば、Log Inシートからコピーされた情報を貼り付ける必要があります。残念ながら、私のシートに何があっても、コードはActiveCellに「TRUE」を塗りつぶして、それが真でない場合に求めたエラーメッセージを表示します。私はIfEmptyも同様の結果で試しました。

私のコードは次のようになります:あなたは間違っSelectionを使用している

Sub LogIn() 

Dim Row As String 
Dim Location As String 

' assign values to variables 
    Worksheets("Log In").Activate 
     Location = Cells(6, 3).Value 
     Row = Cells(3, 3).Value 

' copy new inputs to clipboard 
    Sheets("Log In").Range("C8:C11").Copy 

' find the correct location within the separate racking sheets 
    Sheets("Row " & Row).Activate 
    Selection = Cells.Find(What:=Location, After:=Cells(1, 1), LookIn:=xlFormulas, _ 
     lookat:=xlWhole, searchorder:=xlByRows, searchdirection:=xlNext, _ 
     MatchCase:=False, searchformat:=False).Activate 
    Selection = Sheets("Log In").Cells(6, 3).Value 
    Selection = ActiveCell.Offset(0, 2).Activate 

' check whether location is empty 
    If ActiveCell.Value = "" Then 

' paste new inputs onto racking sheet 
     ActiveCell.PasteSpecial 

' or return an error 
     Else: MsgBox "The location you have selected is currently occupied" 
     End If 

End Sub 

答えて

3

。最初に、何が起こっているのかを説明し、それをうまく修正する方法を説明します。

あなたは

Selection = "Hello" 

のようなものを書くときには、「こんにちは」と選択したセルを埋めます。 Excelは、それはあなたがSelection = something.Activateを使用している

Selection.Value = "Hello" 

と同じだ。すなわち、Selectionは、「こんにちは」、代わりにそれは選択されたすべてのセルに「こんにちは」の値を設定するように設定することはできませんし、私はそれはあなたが選択することを前提とsomething。それはあなたが望む方法ではありません。

something.Activateは、セルまたは範囲somethingをアクティブ化(したがって選択)します。また、ブール値Trueを返します(私はそれがFalseを返すかどうかわかりません、他の人が助けてくれるかもしれません)。したがって、Selection = something.Activate行が実行されると、VBAは=の右側にあるものを評価して、Trueを返します(評価中はsomethingも選択されます)。今度はSelection.ValueTrueに設定し、somethingが選択されたばかりなので、something.ValueTrueに設定されます。


今あなたができる最善のことはSelectionActivateの使用を停止することです。何らかの種類のユーザー入力としてActiveCellを使用する必要がある場合は、範囲の先頭にActiveCellを設定し、必要に応じて使用します。

いつもActiveCellを変更する代わりに、変数を使用してください。このようなもの:

Dim myCell as Range 
'... 
Set myCell = Sheets("Row " & Row).Cells.Find(.... 'You should rename Row because it's already a property of Range. 
myCell.Value = Sheets("Log In").Cells(6, 3).Value 
Set myCell = myCell.Offset(0, 2) 

If myCell.Value = "" Then 
'... 
+0

これは本当に知りたいことです。時間と書き換えを節約するために、私は 'ActiveCell.Offset'の前から' Selection = 'を削除するだけで動作させました。 –

関連する問題