• ベストアンサー

Excel VBAについて教えて下さい。

VBAについて2点ほど質問があります。 (1)複数セル(例:A2:A40)に入力されている文字列を一括で数値に変換するVBAはありますか? (2)複数セル(例:A2:A40)に日付と時間が入力されていて(例:2019/09/12 16:00)、それを一括で日付と時間それぞれ別々のセルへ表示させるVBAはありますか? 現状、1つのセルしか変換できず複数一度には難しいのでしょうか? お分かりの方いましたら、是非ご教示お願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • SI299792
  • ベストアンサー率47% (772/1616)
回答No.4

一括でということは、ループを使わすということでしょうか。 (1) 数字が文字列形式で入っているのを数字形式に直すと解釈します。 例 '1 → 1 表示形式は文字列以外になっているとします。 ' Sub Macro1() '   [A2:A40] = [A2:A40].Value End Sub a→1 b→2 のような変換は、一度には無理です。 (2) 直接値を入れたい場合、ループを使うしかありません。 以下は、数式を入力した後、値に変換しています。 ' Sub Macro2() '   [B2:B40] = "=INT(A2)"   [B2:B40].NumberFormatLocal = "YYYY/MM/DD"   [C2:C40] = "=A2-B2"   [C2:C40].NumberFormatLocal = "h:mm"   [B2:C40] = [B2:C40].Value End Sub

その他の回答 (3)

  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.3

VBAは決まったツールでネットや本から持ってくるものではないと考えるべきです。 手作業で行うのが大変な時にVBAを使って作業を効率化したり、正確性を高めます。自分で作るものです。 質問のケースは、1つのセルの処理ができれば、後は、 <1>繰り返しの使い方  For~Next、For Each~Next、While~Wend、Do~Loop など色々あるのでどのような時使うべきかを勉強すべきでしょう。 <2>セルの操作  Excelではセルの操作が大事です。  Range、Cells、Offset、文字列として表現、RC表現 などたくさんあります。ループ処理に関係して、セルをどのように表現すべきか勉強すべきでしよう。 <3>VBAを勉強するのに一番いいのは、オブジェクトブラウザを見ることでしょうか。オブジェクトブラウザの操作法とかはネットで調べてください。 <4>  質問(1)については、「男→1、女→3」に変更する処理をFor~Nextで書いています。文字列を使ってセルを表現しています。  質問(2)については、For Each ~Next を使い、結果をとなりの2つのセルに書いています。Offsetを使っています。 '// (1)文字列を数値にする Sub 文字列を数値に()  Dim r As Integer '// 行カウンタ  Dim dt As String '// データ    For r = 2 To 40   dt = Range("A" & r).Value   Select Case dt    Case "男"     Range("B" & r).Value = 1    Case "女"     Range("B" & r).Value = 3    Case Else       End Select  Next End Sub '// (2)日付と時刻を分解する Sub 日付と時刻を分解()  Dim rng As Range    For Each rng In Range("A2:A40")   rng.Offset(0, 1) = Format(rng.Value, "yyyy/mm/dd") '// B列   rng.Offset(0, 2) = Format(rng.Value, "hh/mm") '// C列  Next End Sub

  • 3620313
  • ベストアンサー率33% (4/12)
回答No.2

(1)置換で対応 何の文字を何の数字に変換するのかが不明なので、 a→1 b→2 c→3 d→4 e→5 と置換する場合で想定 Range("A2:A40").Select Selection.Replace What:="a", Replacement:="1", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False Selection.Replace What:="b", Replacement:="2", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False Selection.Replace What:="c", Replacement:="3", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False Selection.Replace What:="d", Replacement:="4", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False Selection.Replace What:="e", Replacement:="5", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False (2) Range("B2:B" & Range("A" & Rows.Count).End(xlUp).Row) = "=TEXT(RC[-1],""yyyy/mm/dd"")" Range("C2:C" & Range("A" & Rows.Count).End(xlUp).Row) = "=TEXT(RC[-2],""hh:mm"")" って感じかと。

  • kkkkkm
  • ベストアンサー率66% (1719/2589)
回答No.1

両方ともありません。 A2からA40までループして処理してください。