• 締切済み

指定したセルが変更された時でも自由に文字を入力

ご教授下さい。ワークシートに下のようなVBAコードを書きました。A列の入力されている日付の曜日が”月”,"水","金"に該当するならC列に”定期業務”、”土”,"日"に該当するなら”休み”、それ以外は空白になるようなコードです。ご存じのように計算式をセットされたセルは指定されたセルの内容に拘束され自由に変更できませんが、例えば”火”,”木”にあるC列の空白にコードの計算式に拘束されずに自由に文字を直接入力したいのですが、どうすればよろしいでしょうか? Private Sub Worksheet_Change(ByVal Target As Range) Dim GYO As String ' 現在行 GYO = Target.Row If GYO <= 1 Then Exit Sub Application.EnableEvents = False ' 計算式をセット(R1C1形式なら式は固定で良い) Cells(GYO, 3).FormulaR1C1 = "=IF(OR(WEEKDAY(RC1)=2,WEEKDAY(RC1)=4,WEEKDAY(RC1)=6),""定期業務"",IF(OR(WEEKDAY(RC1)=7,WEEKDAY(RC1)=1),""休み"",""""))" Application.EnableEvents = True End Sub

みんなの回答

  • hue2011
  • ベストアンサー率38% (2800/7250)
回答No.3

発想の転換です。 なぜC列に入力したいと思うのでしょうか。 D列に自由入力したらいいじゃないですか。 そこは何もしていない場所だから何でも入力可の領域ですね。 罫線を、いまはC列は各カラム全部外側を囲っていますが、C列の右側の線はぬきましょう。 そして、D列は、上、下、右、だけの罫線にします。 これだけで、Cで何をやっていようとも、自由に何でもCの右側余白実はD列に書けるのです。 印刷したら、Cの表示とDの表示は同じ枠にあるものと見えます。 おかしなロジックをマクロで書き込んだりするとバグのもとになります。 シンプルに行きましょう。

teuteu
質問者

お礼

hue2011さんへ 回答ありがとうございました。日報の入力は例題として提起したので一番知りたかったのはワークシートモジュールで書いたプログラムコードでセットされたセルの数式を固定されたものではなく自由に編集できないかというものでした。教えてgooにも同じ内容を投稿していますが、ママチャリさんからの回答通りにしたらうまくいきました。

  • ambriel
  • ベストアンサー率51% (65/127)
回答No.2

数式を仕込んで表示を変えるだけならマクロを使わずともできるので、せっかくマクロを使うなら 「月水金なら『定期業務』の文字列を直接入力する」といった処理のほうがよいのでは? これなら「火木なら『なにもしない』」ことでユーザーが自由に入力できます。 If Cells(GYO, 2).Value = "月" Or Cells(GYO, 2).Value = "水" Then   Cells(GYO, 3).Value = "定期業務" ElseIf ...(以降略) ※Excelマクロの質問をするなら、カテゴリーは [技術者向] コンピューター > プログラミング > Visual Basic がよいです。

teuteu
質問者

お礼

ambreiさんへ 回答ありがとうございました。教えてgooにも同じ内容を投稿していますが、ママチャリさんからの回答通りにしたらうまくいきました。

  • f272
  • ベストアンサー率46% (7998/17099)
回答No.1

If GYO <= 1 Then Exit Sub の次の行に IF OR(WEEKDAY(RC1)=3,WEEKDAY(RC1)=5) THEN EXIT SUB と書いておけばいいんじゃないのかなあ。

teuteu
質問者

お礼

f272さんへ 回答ありがとうございました。教えてgooにも同じ内容を投稿していますが、ママチャリさんからの回答通りにしたらうまくいきました。

関連するQ&A

  • 空白状態でEnterを押したら指定のセルに飛びたい

    例えばF5セルで何も入力せずEnterを押したらC9に入力セルを飛ばしたくて 自分の力で調べた限りでは下のコードで可能なのですが Private Sub Worksheet_SelectionChange(ByVal Target As Range) With Range("F5,C9") If Not Intersect(Target(1), .Cells) Is Nothing Then Application.EnableEvents = False .Select Target(1).Activate Application.EnableEvents = True End If End With End Sub 上記コードはF5セルを選ぶと、次に飛ぼうとするC9セルが見えてしまいます。 これが見えずにできる他の方法があるか色々調べても見つかりませんでした; 何か可能な策はありますでしょうか・・?

  • 指定範囲のセルが変更されたら

     下記のコードで1つのセル(A1)が変更されたら入力前の元データを別シート(A1)に保存できるようにしたのですが、指定範囲(I10:CW42,2行3列を一升)のセルが変更されたら別シートの指定範囲(I10:CW42)に保存できるようにしたいのですが方法がありましたらお教え下さい。お願いします。 Windows7・SP1 Office2010 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$A$1" Then Exit Sub Application.EnableEvents = False Application.Undo Sheets("Sheet2").Range("A1").Value = Range("A1").Value Application.Undo Application.EnableEvents = True End Sub

  • Worksheet_SelectionChangeについて

    Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim GYO As Long ' 8列目のみを対象とする If Target.Column <> 8 Then Exit Sub Else GYO = Target.Row End If ' 8列目が空欄でなければ計算処理を呼び出す(引数は選択行) If Cells(GYO, 8).Value = "" Then Exit Sub Else: Call KEISAN(GYO) End If End Sub という方法で8列目のセルをクリックするとフォームが立ち上がるようにしているのですが、ドラッグによる範囲選択でも8列目が含まれているとフォームが立ち上がってしまいます。 単一セルの選択時のみにするにはどうしたらいいでしょうか。 それとすべてのシートにこのマクロを書いているのですがworkbook全体でやることはできないのでしょうか? Workbookのところにこのコードを入れてもうまくいきませんでした。

  • 再質問:エクセルであるセルに数字を入力すると他のセルのデーターから文字が入力 

    すいません、nish6さんの回答で解決し締め切った後で、また分からなくなりもう一度質問しました。分からないところは最初と少し例が増えています。 例 sheet1   A B C  1 1   A1→A1を入力するとsheet2に入力されている        データーC列から、該当する番号を判断  ↑     して、ああとセル内に表示する   1を入力するとsheet2に入力されているデーターA列   から、該当する番号を判断して、東京とセル内に   表示する sheet2   A B  C D 1 1 東京 A1 ああ 2 2 千葉 A2 いい 3 3 埼玉 A3 うう 行はまだ下に続く 最初のnish6さんの回答をこの下に貼り付けましたが 分からないのは、sheet1にC列が増えたときマクロをどう変えればいいか分からないことです ご教授をお願いします ここから ↓ Private Sub Worksheet_Change(ByVal Target As Excel.Range)   Dim rg As Range 'セル   Dim rgfnd As Range '見つけたセル   On Error GoTo ErrorHandler   Application.EnableEvents = False   For Each rg In Target     'Sheet1のA列なら     If rg.Column = 1 Then       'Sheet2を検索       Set rgfnd = Worksheets("Sheet2").Range("A:A").Find(rg.Text)       If Not rgfnd Is Nothing Then         '見つかったら書き換える         rg = rgfnd.Offset(0, 1).Text         Set rgfnd = Nothing       Else         rg = rg.Text & ":nothing"       End If     End If   Next   Application.EnableEvents = True   Exit Sub ErrorHandler:   'エラー対応   Application.EnableEvents = True End Sub

  • 文字を入力したセル以降のセルも同じ文字になるVBA

    Private Sub Worksheet_Change(ByVal Target As Range) Dim R As Range ActiveSheet.Protect UserInterfaceOnly:=True Set R = Union(Range("D5:D38"), Range("E5:E38"), Range("T5:T38")) With Target If Intersect(.Cells, R) Is Nothing Then Exit Sub Application.EnableEvents = False Range(Cells(.Row, .Column), Cells(38, .Column)).Value = .Value Application.EnableEvents = True End With End Sub この様なコードがあるのですが範囲を変更したいと思います。 D5:D38は上記コードのままで良いのですが、E5;E38はE5:E36に、T5:T38はT5:T36に変更するにはどうすれば良いのでしょうか?

  • VBAで入力ミスの時、空白に戻すには

    いつもお世話になります WINDOWS7 EXCELL2010 です。 何れかのセルで入力ミスを、 例えば I13 に 1 を入力した時 「日」が 当然表示されますがこれがミスで空白に戻したい時に 「0」 で空白できると考えていましたが実際は空白でないみたいです。 見た目では空白ですが空白のセルのカウント COUNTBLANLK では1つ少なくなっています。 このようなミスの時に空白に戻す方法はどのようにすればいいかご教授いただけませんか。 よろしくお願いします。 参考 空白のセルのカウント AO13 =IF($B13="","",COUNTBLANK($I13:$AM13)) 入力のVBA Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("I13:AM27")) Is Nothing Then Exit Sub 'ココで範囲指定 Application.EnableEvents = False If Target.Value = 0 Then Target.Value = " " If Target.Value = 1 Then Target.Value = "日" If Target.Value = 2 Then Target.Value = "△" If Target.Value = 3 Then Target.Value = "▼" If Target.Value = 4 Then Target.Value = "前" If Target.Value = 5 Then Target.Value = "夜" If Target.Value = 6 Then Target.Value = "明" If Target.Value = 7 Then Target.Value = "有" Application.EnableEvents = True End Sub

  • エクセルマクロ 特定の文字入力の際の処理(2)

    お世話になります。 以前、下記質問をし、締め切ったのですが、もう一点、教えていただきたい点がありました。 質問 エクセルマクロで、sheet1のE列の6~30行に指定する文字が入力された際、 B列のその同じ行にある文字を取得し、その取得した文字をsheet3のC6から K6まで書き出していきたいのですが、どのようにしたらよいでしょうか? ご回答 Private Sub Worksheet_Change(ByVal Target As Range)   Dim i As Long   Dim r As Range   Const 指定文字 As String = "X"   Set r = Range("E6:E30")   If Target.Count > 1 Then Exit Sub   If Intersect(r, Target) Is Nothing Then     Exit Sub   End If   If Target.Value <> 指定文字 Then     Exit Sub   Else     '大文字小文字を区別する場合     i = ActiveSheet.Evaluate( _       "SumProduct(EXACT(" & r.Address & ",""" & 指定文字 & """)*1)")     '大文字小文字を区別しない場合     i = WorksheetFunction.CountIf(r, 指定文字)          Application.EnableEvents = False     Worksheets("Sheet3").Cells(6, i + 2) = _       Target.Offset(, -3)     Application.EnableEvents = True   End If End Sub このご回答を、 取得した文字をsheet3のC6からK6までに4列毎に書き出して いく場合にはコードをどのようにしていけば良いのでしょうか。 C6→H6→M6→・・・ すみません、再度お願い致します。

  • 変化するセルが変更されたら実行、というVBAを組みたい

    たとえば、このセルが変更されたら実行、というのは Private Sub WorkSheet_change (Byval Target As Range) If(Target.Address = "$D$3") Then call *** End If End Sub のようにしますよね? この場合、指定したセルは「D3」ですが、たとえば、 A列、B列、C列、D列のアクティブの行のセルが変更されたらコード実行、 というようにするにはどうしたらいいのでしょうか?

  • Excel VBA セルの値を変更後にVBA作動

    Excel VBAを活用して、特定のセルの値が変更されたときに、VBA処理を発動させることになりました。 処理といたしましては、C列(3列目)の4行目以下の空白セルに数値を入力するか、セルに入力されている数値を変更した場合にVBAを発動させたいです。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Column = 3 And Target.Row >= 4 Then MsgBox "セルの値が更新されました" End If End Sub 上記のコードを実行してみたところ、3列目(C列)の4行目を選択した段階でVBAが作動してしまいます。 セルの値変更後に作動するようにするには、どう修正すればよろしいでしょうか?

  • セル空白時に月を変更した時の累計使用日数VBA

    お世話になります、エクセルVBA初心者の者です。 '******************************************************************************* ' セル変更した時のイベント '******************************************************************************* Private Sub Worksheet_Change(ByVal Target As Range) Dim i As Long, k As Long, myNum As Long If Intersect(Target, Range("C1,B9:B39")) Is Nothing Or Target.Count > 1 Then Exit Sub Application.EnableEvents = False With Target If .Column = 3 Then myNum = WorksheetFunction.Max(Range("B9:B39")) myDate = Range("C1").Value Range("A9:A39").ClearContents If IsDate(.Value) Then ' ----------A列に日にちを入力---------- For i = 1 To 31 If Month(myDate + i - 1) = Month(.Value) Then Cells(i + 8, "A").Value = Day(myDate + i - 1) Else Cells(i + 8, "A").Value = "" End If Next i ' ----------B列の空白条件---------- If Range("B39").Value = "" Or Range("B38").Value = "" Or Range("B37").Value = "" Or Range("B36").Value = "" Then Range("B9:B39").ClearContents Application.EnableEvents = True End End If ' ----------B列に連続値の入力---------- For i = 9 To 39 If Cells(i, "A").Value = "" Then Cells(i, "B").Value = "" Else Cells(i, "B") = myNum + i - 8 End If Next i End If Else End With Application.EnableEvents = True End Sub 内容はC1には年月(2013年12月)を表示させています。 そして、B9~B39には累計使用日数を表示するVBAを組んでいます。 B9~B39間に適当な数字を入力すると、連続データの数字が入力されるようになります。 そして、C1セルの日付を変更しても連続データが継続して表示されるVBAです。 B39が空白表示の場合(小月ならB38で2月ならB36かB37)でC1セルの年月を変更した場合、連続データを表示させず空白セルを表示させるVBAを組んだつもりです。 しかし、上手く作動しません。もうお手上げです。どこがおかしいのでしょうか?ご教授宜しくお願いします。

専門家に質問してみよう