出産前後の痔にはご注意!

閲覧ありがとうございます。
Excelのマクロに関しての質問です。
今、テキストデータから「東京都・晴れ」を含む行をExcelファイルに抽出後、そのデータを日付別にふり分けるマクロを作っています。
そこで、テキストデータの日付の表示「11/8/2009」(2009年8月11日)や「8/9/2009」(2009年9月8日)を「2009/8/11」「2009/9/8」のように、年・月・日という表示に変えたいのですが、検索しても色々試しても良いマクロが浮かびません。
よろしければ素敵なマクロ、ご教授願います。

※ちなみに、入力規則などを指定してもテキストからデータを引っ張ってきているため(?)か上手くいきません。

このQ&Aに関連する最新のQ&A

A 回答 (6件)

ごめんなさい。



d/m/yyyy 形式なんだね。英国式?なら、#3 は没で(´A `;)

米国式だと m/d/yyyy だから、11/8/2009 は 2009/11/8
だけど。。この点ははっきりさせた方が良いかもです。

VBA というか Excel のシステム自体 USA 産ですから、
日付書式は基本 m/d/yyyy です。
したがって、#3 のソースで変換をかけると 11/8/2009 は、
2009/11/8 になりますので、ご注意を。
    • good
    • 0

こんにちは。



#4の方が言われる「色んな解釈」の内のひとつになってしまいますが。。。
意味を取り違えていたらすみません。

変換する日付の文字列というのは、
  変換前:  "11/8/2009" ← 日/月/年 の順
            ↓
  変換後:  "2009/8/11" ← 年/月/日 の順
ということでしょうか?

上記の場合だという前提ですが、
以下は、日付文字列の変換部分のみのマクロの一例です。

■サンプルマクロ
注)インデントのため全角スペースを入れています。
/////↓ここから//////////
'==日付のフォーマット変換テスト==
Sub DateConv()

  Dim strDate As String
  Dim vaDate As Variant

  'テスト1:セルに直接データをセットする場合
  strDate = "11/8/2009"
  vaDate = Split(strDate, "/")
  Range("A1").Value = DateSerial(vaDate(2), vaDate(1), vaDate(0))

  'テスト2:一旦、文字列に格納してからセルにセットする場合
  strDate = "8/9/2009"
  vaDate = Split(strDate, "/")
  strDate = vaDate(2) & "/" & vaDate(1) & "/" & vaDate(0)
  Range("A2").Value = strDate

  'テスト3:日付シリアル値のセルデータを文字列として別セルにセット
  Range("B1").Value = "'" & Range("A1").Text
  Range("B2").Value = "'" & Range("A2").Text

End Sub
/////↑ここまで//////////

■補足
予め、日付データの貼り付け先のセルの表示形式が、
  「標準」 または、「日付」
になっていることが前提です。
また、対象セルの表示形式が「標準」になっていた場合で、上記のマクロを
実行した後は、セルの表示形式が自動的に「日付」に変更されます。

いずれの場合も、データ貼り付け後のセルの値は「日付シリアル値」になって
いますので、別の作業で文字列として扱いたい場合は、「日付シリアル値」を
文字列に変換する処理が必要になります。
※上記サンプルの「テスト3」がその一例です。

以上です。参考になれば幸いです。
    • good
    • 0

>2009年9月8日)を「2009/8/11」「2009/9/8」のように、年・月・日という表示に変えたいのですが


特に
>年・月・日という表示に変えたいのですが
質問が易しすぎて、色んな解釈が出来てしまうことは、今まで出ている回答を見ればわかる。何がしたいの?
年月日に分割
文字列化
表示形式の設定 など
元のデータが、「エクセルで日付入力の基本」の、日付シリアル値に現状なっているのか。
なっているなら表示形式の問題でNumberFormat(Local)の問題で、極く基礎的なことで、こんなところに質問するまでも無いレベルの問題だ。
Googleででも「NumberFormat」でWEB照会のこと。
>今、テキストデータから「東京都・晴れ」を含む行をExcelファイルに抽出後、そのデータを日付別にふり分けるマクロを作っています。
前置きみたいなこの箇所は質問に書く必要あるのかな。
    • good
    • 0

こんな感じとか。

IsDate でチェック済みなら、Cdate 関数を
使っても良いでしょう。

' // セル選択範囲において日付として評価できる文字列を
' // シリアル値に変換する
'
Sub Sample()
  
  If Not TypeOf Selection Is Range Then Exit Sub
  
  Dim r As Range
  Selection.NumberFormat = "yyyy/m/d" 'シリアル値表示形式
  For Each r In Selection.Cells
    If IsDate(r.Value) Then
      r.Value = DateValue(r.Value)
    End If
  Next

End Sub
    • good
    • 0

vを一旦、シリアル値に直した方が良いですね


MsgBox Format(DateValue(v), "yyyy/m/d")
    • good
    • 0

参考に


Dim v As Variant
v = "「11/8/2009」(2009年8月11日)"
v = Split(v, "(")
v = Replace(v(1), ")", "")
MsgBox Format(v, "yyyy/m/d")
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QエクセルVBAでOptionButtonのオンオフ取得

ワークシート上に貼り付けてあるオプションボタンの状態の取得ですが、フォームのオプションボタンなら
例えば、
MsgBox ActiveSheet.OptionButtons("Option Button 44").Value で、オンなら1、オフなら-4146が返ります。
またActiveSheet.OptionButtons("Option Button 44").Value=xlOnで オンに出来ます。

ところがフォームじゃないコントロールツールボックスのオプションボタンは
MsgBox ActiveSheet.Shapes("OptionButton30").Valueでも
MsgBox ActiveSheet.Controls("OptionButton30").Valueでもエラーになります。
どうやって取得すればいいのでしょうか?
どうやてOn Off を指示すればいいのでしょうか?

Aベストアンサー

同一ワークシート内にオプションボタン1つ、コマンドボタン一つを配置して、コマンドボタンに、現在のオプションボタンの値をMSGBOXで表示させ、その後OFF(False)にするようなサンプルを作って、Excel2000で試してみました。

Private Sub CommandButton1_Click()
MsgBox OptionButton1.Value
OptionButton1.Value= False
End Sub

というコードです。
とりわけ問題なく動作しました。
LinkCellを指定するかどうか、複数配置かどうかで微妙に動作が異なるようです。

参考までに。

Q日付型のフィールドに空白を入れる方法を教えてください

ASP(VBScript)でSQLサーバにINSET INTO文を使ってデータを格納しているのですが、日付の部分がNULLの時、「1900/1/1」が入ってしまいます。
そのまま、空白を入れる方法はどうやったらよろしいのでしょうか?

TABLE1の内容は
番号|内容|日付です。

INSERT INTO TABLE1 VALUES ( 1, 'あいう', '')

結果
1|あいう|1900/1/1

Aベストアンサー

あとは、プログラムの書き方次第ですね、、、


If hensu=Null Or hensu="" Then
dt = "NULL"
Else
dt = "'" & hensu & "'"
End IF

E_SQL = "INSERT INTO TABLE1 VALUES & _
"( 1,'あいう', " & dt& ")"
の様に書きます。

QエクセルVBA ユーザーフォームのTextBoxを日付にしたい

いつもいつも 皆様からのお返事を心待ちにしておりますNannyです。

VBAのユーザーフォームでTextBoxを日付専用入力にしたいのです。

で、入力方法が 20050219 というような形で入力して、2005/02/19という形か、平成17年2月19日というような形に持って行って、セルに貼り付けしたいのです。

出来なさそうな予感満載なのですが、皆様お返事の程宜しくお願い致します。
(出来ないのであればあきらめられるので、出来るかどうかのお返事も期待しております。

宜しくお願い致します。

Aベストアンサー

下記はTextBox1に20050219としCommandButton1をクリックするとシート1のA1に2005/2/19と出力します。
Private Sub CommandButton1_Click()
Worksheets(1).Range("A1").Value = Format(TextBox1.Text, "0000""/""00""/""00")

End Sub

QExel VBA 別ブックから該当データを検索し、必要なデータを取得する方法について

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数ではなく、マクロで処理を希望します。

自分では、部品表の商品番号をコピーして、コード一覧表で検索し、検索結果の右隣のセル(B列のコード)の値を部品表のC列に貼り付ければよいかと思い、書いてみたんですが…

Sub 別ブックから貼り付ける()
  Dim 検索する As Long
Windows("部品表.xls").Activate
検索する = cells(i,2).Value
Windows("コード一覧表.xls").Activate
ActiveWindow.SmallScroll Down:=-3
Selection.AutoFilter Field:=3, Criteria1:="=検索する", Operator:= xlAnd

と、してみたものの、検索しても、その検索結果の隣のセルのコードをどうやって取得すればいいのかが、わかりませんでした。

基本事項は本で学びましたが、呪文のようなコードはよく理解できません。懸命にネットで検索して、訳して理解する努力をしてはいますが。

どうぞよろしくお願いします。

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数...続きを読む

Aベストアンサー

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks.Open("C:\★★\コード一覧表.xls") '★要変更★
 I = 2
 Do While Range("A" & I).Value <> ""
  ThisWorkbook.Worksheets("Sheet1").Range("C" & I).Value = Application.VLookup(ThisWorkbook.Worksheets("Sheet1").Range("B" & I).Value, xlBook.Worksheets("Sheet1").Range("A2:B65535"), 2, 0)
  I = I + 1
 Loop
 xlBook.Close
 Application.ScreenUpdating = True
 MsgBox ("完了")
End Sub

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks....続きを読む

QVBA EXCEL 開かずにデータ操作

現在下記のようなコードでテストしています。

Sub Sample()

Dim TargetBook As Workbook

   Set TargetBook = Workbooks.Open("Book2.xls")
   TargetBook.Sheets("Sheet1").Cells(1, 5) = Cells(1, 1)
   TargetBook.Close

End Sub

Book2を開いてセルの読み書きはテストできました。
これをBook2をopenせず閉じた状態で操作したいと思っています。
Workbooksの表示されるメソッドを色々試してみますが出来ません。
OpenDatabaseが使用できるのかと思いますが、出来ません。
ご指導よろしくお願いします。

Aベストアンサー

Sub Sample2()
Dim myPath As String
Dim fn As String
  myPath = Application.DefaultFilePath 'パス
  fn = "Book2.xls" 'ファイル名
  'R1C1型で書く
  ret = Application.ExecuteExcel4Macro("'" & myPath & "[" & fn & "]Sheet1'!R1C1")
  ThisWorkbook.Sheets("Sheet1").Cells(1, 5) = ret
End Sub

他にも、
>OpenDatabaseが使用できる
ODBC(Open Database Connectivity)という意味でしたら、[外部データの取り込み]から操作します。ただし、その使用する列全体を使用してしまいますので、取り込みには、その以下にデータを置くことは出来ない欠点があります。

Office をインストールしていれば、Jet はインストールしていますから、当然、ADODBなどは利用できますが、意外に面倒かもしれません。フィールドがなくても取得できます。

Sub Sample2()
Dim myPath As String
Dim fn As String
  myPath = Application.DefaultFilePath 'パス
  fn = "Book2.xls" 'ファイル名
  'R1C1型で書く
  ret = Application.ExecuteExcel4Macro("'" & myPath & "[" & fn & "]Sheet1'!R1C1")
  ThisWorkbook.Sheets("Sheet1").Cells(1, 5) = ret
End Sub

他にも、
>OpenDatabaseが使用できる
ODBC(Open Database Connectivity)という意味でしたら、[外部データの取り込み]から操作します。ただし、その使用する列全体を使用してしまいますので、取り込み...続きを読む


人気Q&Aランキング