Excel (VBA) |
![]() ![]() |
(指定なし : 指定なし)
セルに入力された文字列を取得する方法
投稿日時: 21/01/10 10:27:12
投稿者: takodo
|
---|---|
セルに
|
![]() |
投稿日時: 21/01/10 13:20:23
投稿者: WinArrow
|
---|---|
横着しない方が、操作上も、以後のメンテナンスでも
|
![]() |
投稿日時: 21/01/10 13:23:56
投稿者: WinArrow
|
---|---|
> Target.NumberFormatLocal = "@" '"文字列"
|
![]() |
投稿日時: 21/01/10 13:47:22
投稿者: WinArrow
|
---|---|
表示形式をセル単位に設定していますが、
|
![]() |
投稿日時: 21/01/10 13:49:49
投稿者: takodo
|
---|---|
WinArrow さんの引用: そうですか。 早速の解答をありがとうございます。 |
![]() |
投稿日時: 21/01/10 14:04:08
投稿者: WinArrow
|
---|---|
今更・・・・
|
![]() |
投稿日時: 21/01/10 14:46:25
投稿者: simple
|
---|---|
既に指摘されていますが、
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Dim s As String Dim d As Date Cancel = True If Target.Column <> 2 Then Exit Sub s = Application.InputBox("4桁の数値を入力", Type:=2) If Len(s) <> 4 Or Not IsNumeric(s) Then MsgBox "4桁の数字を入れてください" Exit Sub End If d = DateSerial(Year(Date), Val(Left(s, 2)), Val(Right(s, 2))) Application.EnableEvents = False Target.NumberFormatLocal = "yy/mm/dd(aaa)" '"ユーザー定義書式" Target.Value = d Application.EnableEvents = True End Sub |
![]() |
投稿日時: 21/01/10 14:52:13
投稿者: simple
|
---|---|
どうしてもChangeイベントプロシージャだというなら、こうですか。
Private Sub Worksheet_Change(ByVal Target As Range) Dim colNo As Long Dim re As RegExp Dim s As String colNo = Target.Column If colNo <> 2 Then Exit Sub Set re = New RegExp re.Pattern = "\d{4}" re.Global = True s = Target.Text If re.test(s) Then Target.NumberFormatLocal = "G/標準" Application.EnableEvents = False Target.Value = DateSerial(Year(Date), Val(Left(s, 2)), Val(Right(s, 2))) Application.EnableEvents = True Target.NumberFormatLocal = "yy/mm/dd(aaa)" Else MsgBox "数字4文字ではない" Application.EnableEvents = False Target.ClearContents Application.EnableEvents = True End If End Sub |
![]() |
投稿日時: 21/01/10 14:54:18
投稿者: takodo
|
---|---|
WinArrow さんの引用: B列のセルに入力された値−Target と、いうことでコーディングしたつもりですが・・・ B列全体に yy/mm/dd(aaa) を設定しています。 そして、B列に値が入力されたときの処理としてコーディングしています。 そのとき、Targetの値が yy/mm/dd(aaa) で取得されてしまうので 一端 Target.NumberFormatLocal = "@" '"文字列" として、 最後に、書式を戻す処理を行ったのですが。 セルにキーボードから打鍵されたキーの値そのものを取得することはできないようですね。 |
![]() |
投稿日時: 21/01/10 14:54:30
投稿者: takodo
|
---|---|
WinArrow さんの引用: B列のセルに入力された値−Target と、いうことでコーディングしたつもりですが・・・ B列全体に yy/mm/dd(aaa) を設定しています。 そして、B列に値が入力されたときの処理としてコーディングしています。 そのとき、Targetの値が yy/mm/dd(aaa) で取得されてしまうので 一端 Target.NumberFormatLocal = "@" '"文字列" として、 最後に、書式を戻す処理を行ったのですが。 セルにキーボードから打鍵されたキーの値そのものを取得することはできないようですね。 |
![]() |
投稿日時: 21/01/10 15:08:47
投稿者: チオチモリン
|
---|---|
>1001 21/10/01(金)
|
![]() |
投稿日時: 21/01/10 15:17:16
投稿者: takodo
|
---|---|
simple さんの引用: ありがとうございます。 想定した動きとなりました。 ただ、 訂正すると、 書式が文字列になっていないので動作しなくなります。 難しいです。 |
![]() |
投稿日時: 21/01/10 15:21:44
投稿者: takodo
|
---|---|
チオチモリン さんの引用: ただ、少しでもキータッチを減らそうと考えたもので・・・ そもそも、キータッチを減らすことを考えなければ 20/01/31 と、入力すれば良いことになりますので。 更に、この正規表現の扱いをマスターすると多くのことに応用できそうですごく魅力を感じています。 そのためには、キーボードからの入力値をそのまま取得できればよいと思うのですが・・・ |
![]() |
投稿日時: 21/01/10 16:16:03
投稿者: チオチモリン
|
---|---|
↓のような意味なんですけど。 意味違いました?
|
![]() |
投稿日時: 21/01/10 17:21:12
投稿者: simple
|
---|---|
6桁の話を読み飛ばしていました。失礼。
|
![]() |
投稿日時: 21/01/10 17:21:57
投稿者: WinArrow
|
---|---|
すみません
Private Sub Worksheet_Change(ByVal Target As Range) Dim DAtA As String If IsDate(Target.Value) Then Exit Sub DAtA = Target.Value Select Case Len(DAtA) Case 4 Target.NumberFormatLocal = "yy/mm/dd(aaa)" Target.Value = DateValue("2021/" & Left(DAtA, 2) & "/" & Right(DAtA, 2)) Case 6 Target.NumberFormatLocal = "yy/mm/dd(aaa)" Target.Value = DateValue("20" & Left(DAtA, 2) & "/" & Mid(DAtA, 3, 2) & "/" & Right(DAtA, 2)) Case Else MsgBox "桁数が不正です" End Select End Sub |
![]() |
投稿日時: 21/01/10 17:27:31
投稿者: WinArrow
|
---|---|
>B列のセルに入力された値−Target
|
![]() |
投稿日時: 21/01/10 17:37:11
投稿者: WinArrow
|
---|---|
追伸
|
![]() |
投稿日時: 21/01/10 17:53:06
投稿者: チオチモリン
|
---|---|
>yy/mm/dd(aaa)の書式設定されたセルに入力
|
![]() |
投稿日時: 21/01/10 18:20:06
投稿者: takodo
|
---|---|
多くの方から、多くのことを教えていただき感謝です。
|
![]() |
投稿日時: 21/01/10 19:59:50
投稿者: K.Hiwasa
|
---|---|
横から失礼します。
Private Sub Worksheet_Change(ByVal Target As Range) Dim re As Object Dim strDate As String Set re = CreateObject("VBScript.RegExp") re.Pattern = "^\d+$" re.Global = True If re.Test(Target.Value2) = True Then Target.NumberFormatLocal = "yy/mm/dd(aaa)" '"ユーザー定義書式" If CLng(Target.Value2) >= 10000 Then 'yymmdd形式と見做す strDate = CStr(Target.Value2 + 20000000) Else 'mmdd形式と見做す strDate = CStr(Target.Value2 + 20210000) End If Application.EnableEvents = False Target.Value = DateValue(Left$(strDate, 4) & "/" & Mid$(strDate, 5, 2) & "/" & Right$(strDate, 2)) Application.EnableEvents = True End If End Sub |
![]() |
投稿日時: 21/01/10 21:09:40
投稿者: WinArrow
|
---|---|
話は違うが
|
![]() |
投稿日時: 21/01/10 22:01:32
投稿者: WinArrow
|
---|---|
>B列の書式設定は"yy/mm/dd(aaa)"としています。
|
![]() |
投稿日時: 21/01/11 06:30:24
投稿者: takodo
|
---|---|
ありがとうございました。
K.Hiwasa さんの引用: Value2というプロパティーがあったんですね。 皆さんのおかげで、 入力値、と表示値の処理の歯科など いろいろなことがよくわかりました。? −−−よくわかったつもりです。 ありがとうございました。 |
![]() |
投稿日時: 21/01/11 06:36:57
投稿者: takodo
|
---|---|
WinArrow さんの引用: 当初、これで解決したと思ったのですが、 おっしゃられるように、計算できません。 そこで、VBでの処理でできないものかと挑戦したのですが 自分だけでは行き詰まり VBの方で、相談させてもらいました。 ご指摘ありがとうございました。 |
![]() |
投稿日時: 21/01/11 09:54:40
投稿者: WinArrow
|
---|---|
|
![]() |
投稿日時: 21/01/11 09:58:52
投稿者: takodo
|
---|---|
WinArrow さんの引用: すごく丁寧なコードをありがとうございます。 これから、しっかりと動作を確認させていただきます。 |
![]() |
投稿日時: 21/01/11 11:16:35
投稿者: WinArrow
|
---|---|
面白テスト
Sub test() Dim DT With Range("A1") .NumberFormatLocal = "0!/00!/00" .Value = "0100" Select Case Len(.Value) Case 3, 4 DT = Split(.Text, "/") .NumberFormatLocal = "yy/mm/dd(aaa)" .Value = DateSerial(2021, DT(1), DT(2)) Case 6 DT = Split(.Text, "/") .NumberFormatLocal = "yy/mm/dd(aaa)" .Value = DateSerial(DT(0) + 2000, DT(1), DT(2)) Case Else MsgBox "桁数エラー" End Select End With End Sub |
![]() |
投稿日時: 21/01/11 12:44:10
投稿者: takodo
|
---|---|
更に、貴重なコードの提示、ありがとうございます。
|