こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

VBAについて2点ほど質問があります。

(1)複数セル(例:A2:A40)に入力されている文字列を一括で数値に変換するVBAはありますか?

(2)複数セル(例:A2:A40)に日付と時間が入力されていて(例:2019/09/12 16:00)、それを一括で日付と時間それぞれ別々のセルへ表示させるVBAはありますか?

現状、1つのセルしか変換できず複数一度には難しいのでしょうか?

お分かりの方いましたら、是非ご教示お願い致します。

投稿日時 - 2019-09-12 16:04:54

QNo.9656077

困ってます

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

一括でということは、ループを使わすということでしょうか。

(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

投稿日時 - 2019-09-13 06:45:23

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.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

投稿日時 - 2019-09-12 17:47:26

ANo.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"")"

って感じかと。

投稿日時 - 2019-09-12 17:12:49

ANo.1

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

投稿日時 - 2019-09-12 16:40:18

あなたにオススメの質問