初めての店舗開業を成功させよう>>

はじめて質問させて頂きます。
VBA初心者ですが、宜しくお願いします。

CSVデータをエクセルにコピペしてから処理することを考えています。
CSVのデータはエクセルで開くと以下の様に入力されています。

    |      A列      |  B列 |  C列 |
1行目|   日付 時刻    |データ1|データ2|
2行目|2014/5/14 13:00:01|  ○  |  △  |
3行目|2014/5/14 13:00:14|  ○  |  △  |

時刻は24h制で入力されています。
A列の日付と時刻の間にはスペースがあり、これをVBAでスペース区切りをしたいのです。
B列に列を追加し、スペース区切りの処理をしようと思い、自動記録すると以下のようになりました。

Sub Macro1()
    Columns("B:B").Select
    Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
    Columns("A:A").Select
    Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
     TextQualifier:=xlNone, ConsecutiveDelimiter:=True, Tab:=True, Semicolon _
     :=False, Comma:=False, Space:=True, Other:=False, FieldInfo:=Array( _
     Array(1, 5), Array(2, 1)), TrailingMinusNumbers:=True
End Sub

ところが、このマクロを実行すると「コピーまたは移動先のセルの内容を置き換えますか?」のメッセージが表示されます。(記録する際には表示されませんでした。)
原因を探ったところ、自動記録のマクロを実行すると時刻が12時間制に変更されB列に、
C列にAM/PMが書き込まれます。(A列の日付は問題なく処理されます。)

B列に24時間制の時刻が書き込まれるようにしたいのですが、
何か不足してるとことがあるのでしょうか?

方法を教えて下さい。
お手数ですが、宜しくお願いします。

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

A 回答 (1件)

こんばんは!


データ → 「区切り位置」の方法でなく、
A列のシリアル値そのものを利用する方法です。
B列に日付・C列に時刻データを表示させるとします。

Sub Sample1()
Dim lastRow As Long
lastRow = Cells(Rows.Count, "A").End(xlUp).Row
With Range(Cells(2, "B"), Cells(lastRow, "B"))
.Formula = "=INT(A2)"
.Value = .Value
.NumberFormatLocal = "yyyy/m/d"
End With
With Range(Cells(2, "C"), Cells(lastRow, "C"))
.Formula = "=MOD(A2,1)"
.Value = .Value
.NumberFormatLocal = "h:mm:ss"
End With
End Sub

こんな感じではどうでしょうか?m(_ _)m
    • good
    • 0
この回答へのお礼

なるほど!
やりたいことができました。

ありがとうございましたm(_ _)m

お礼日時:2014/05/15 12:02

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

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

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

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

Qエクセルのマクロで『区切り位置』設定できない

マクロの素人です。
Win XPでエクセルでセルの中味を区切る設定をしたところ、うまくいきません。

例えば、A列の 経営管理:情報部 をコロンで区切るというマクロを組みます。マクロを実行すると
|経営管理|情報部| という結果になります。

しかし、他の値でマクロを実行しても、4文字目で強制的に区切られてしまいます。
セルに何文字入っていようが、「:」でセルを分けたいのですが、マクロの組み方での解決方法を教えてください。

Aベストアンサー

手元のExcel2003では特に問題ありません。

記録したままだと、こうなってました。

Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar _
:=":", FieldInfo:=Array(Array(1, 1), Array(2, 1)), TrailingMinusNumbers:=True

--
> 他の値でマクロを実行しても、4文字目で強制的に区切られてしまいます。

Excelのバージョンが違うとか、やり方がマズイのでは?としか…。

QExcel 文字列を区切る VBA 質問

A列にスペース区切りのデータがあります
これをC列 D列 に分けて表示したいのですが
A列のデータが不規則(個数がバラバラ 空白もある)
と、なった場合 なかなか上手くいきません
C列以降は使用可能です(空いてます)
その道の方 お助けたください
元のVBAは

Sub Sample3()
Dim i As Long, tmp As Variant
For i = 2 To 22
tmp = Split(Cells(i, 1), " ")
Cells(i, 2) = tmp(0)
Cells(i, 3) = tmp(1)
Next i
End Sub

です
お手数ですが宜しく
お願いします

Aベストアンサー

Sub Sample4()
  Dim i As Long, tmp As Variant

  For i = 2 To 22
    If Cells(i, "A").Value <> "" Then
      tmp = Split(Cells(i, "A").Value)
      Cells(i, "B").Resize(, UBound(tmp) + 1).Value = tmp
    End If
  Next
End Sub

Qエクセル:マクロ「Application.CutCopyMode = False」って?

エクセルのマクロを記録していると

「Application.CutCopyMode = False」

というものがよく出てきますが、これは何でしょう?
どういう意味のものかわかりません。
削除しても差し支えないのもでしょうか?

Aベストアンサー

「Application.CutCopyMode = False」の前で
セルのコピー、または切り取りを行っていると思います。
これは、その操作(セルのコピー、または切り取り)を無効にしているだけです。
------------
Range("A1").Select
Selection.Copy ← これを無効にしている
Range("A2").Select
ActiveSheet.Paste
Application.CutCopyMode = False
------------
上記の場合であれば、「Application.CutCopyMode = False」を削除しても問題ありませんが、
以下の場合、貼り付け処理でエラーになります。
------------
Range("A1").Select
Selection.Copy
Range("A2").Select
Application.CutCopyMode = False
ActiveSheet.Paste ← ココでエラー
------------
ご自分で、セルをコピーしてみると分かると思いますが、コピーした範囲が点線で点滅されます。
「Application.CutCopyMode = False」をすると、
その点滅がなくなります。

「Application.CutCopyMode = False」の前で
セルのコピー、または切り取りを行っていると思います。
これは、その操作(セルのコピー、または切り取り)を無効にしているだけです。
------------
Range("A1").Select
Selection.Copy ← これを無効にしている
Range("A2").Select
ActiveSheet.Paste
Application.CutCopyMode = False
------------
上記の場合であれば、「Application.CutCopyMode = False」を削除しても問題ありませんが、
以下の場合、貼り付け処理でエラーになります。
------------
...続きを読む

Q【Excel VBA】カンマ毎にデータを区切る

はじめて質問をさせて頂きます。
Excel VBAは初心者です。

仕事で必要なため、本を読みながら考えておりましたが、
手も足も出ない状態です。


【質問内容】
Excel VBAにて、ExcelファイルのA列のみに格納されているデータを
カンマ「,」の位置毎に区切ります。
※格納されているデータ例:A,B,C,D,E

Excelの区切り位置にて、カンマで区切る処理と同じです。
A1から処理を開始し、A列のデータがなくなるまで
上記の処理を行います。

下記のプログラムを実行すると、1行目は正常にカンマ毎に
区切られますが、2行目以降はカンマ毎に区切られず、
そのままの状態です。

どこに問題があり、どのように修正すれば良いのでしょうか、
ご教示頂けると助かります。宜しくお願いします。


【プログラム】
Sub カンマ毎に区切る()
Dim mydata As String
Dim myArray() As String
Dim i, j As Integer
j = 0

Do While Cells(j + 1, "A").Value <> ""
mydata = Cells(j + 1, 1)
myArray() = Split(mydata, ",")
For i = 0 To UBound(myArray)
Cells(1, i + 1).Value = myArray(i)
Next
j = j + 1
Loop
End Sub

はじめて質問をさせて頂きます。
Excel VBAは初心者です。

仕事で必要なため、本を読みながら考えておりましたが、
手も足も出ない状態です。


【質問内容】
Excel VBAにて、ExcelファイルのA列のみに格納されているデータを
カンマ「,」の位置毎に区切ります。
※格納されているデータ例:A,B,C,D,E

Excelの区切り位置にて、カンマで区切る処理と同じです。
A1から処理を開始し、A列のデータがなくなるまで
上記の処理を行います。

下記のプログラムを実行すると、1行目は正常にカンマ毎に
...続きを読む

Aベストアンサー

>どこに問題があり、どのように修正すれば良いのでしょうか、
>Cells(1, i + 1).Value = myArray(i)
ここです。Cells(1, i + 1)で常に1行目を指定していますから。

変数jを使えば良いです。
>j = 0
ここを 1 から始めて
>Do While Cells(j + 1, "A").Value <> ""
>  mydata = Cells(j + 1, 1)
ここも j + 1 ではなく j に修正。



ついでに。
j = 1
Do While Cells(j, "A").Value <> ""
  mydata = Cells(j, 1).Value
  myArray() = Split(mydata, ",")
  Cells(j, 1).Resize(, UBound(myArray) + 1).Value = myArray
  j = j + 1
Loop
配列myArrayのサイズに合わせて書き込み先をResizeすればLoop不要です。

それよりも
『Excelの区切り位置にて、カンマで区切る処理と同じです。』
なのでTextToColumnsメソッドを使えば良いと思いますが。
[データ]-[区切り位置]をマクロ記録してみてください。

>どこに問題があり、どのように修正すれば良いのでしょうか、
>Cells(1, i + 1).Value = myArray(i)
ここです。Cells(1, i + 1)で常に1行目を指定していますから。

変数jを使えば良いです。
>j = 0
ここを 1 から始めて
>Do While Cells(j + 1, "A").Value <> ""
>  mydata = Cells(j + 1, 1)
ここも j + 1 ではなく j に修正。



ついでに。
j = 1
Do While Cells(j, "A").Value <> ""
  mydata = Cells(j, 1).Value
  myArray() = Split(mydata, ",")
  Cells(j, 1).Resize(, UBoun...続きを読む

QExcelVBAを使って、値がある場合は作業を繰り返し実行するプログラムを作成したい。

以下のようなプログラムをVBAで作成したいと考えています。

A1のセルに値があれば、その値をB1に返す。
次にA2のセルに値があれば、その値をB2に返す。
A行に値がある一番下のセルまで同じようなことをさせたいと考えています。

VBAは初心者です。
どなかた宜しくお願い致します。

Aベストアンサー

#2さんと似たものですが・・・・参考にしてください。

Sub test001()
Dim i As Long
i = 1
Do While Cells(i, 1) <> ""
Cells(i, 2) = Cells(i, 1)
i = i + 1
Loop
End Sub

QEXCEL VBA で現在開いているブックのファイル名を取得する方法

EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。
作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。
このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。
常にファイル名を取得出来るVBAをどなたか、教えて下さい。

Aベストアンサー

>現在開いているブックのファイル名
 ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は
ThisWorkbook.Name
で、現在 "アクティブにして" 操作対象になっているブックの名前は
ActiveWorkbook.Name
ですね。

 しかし、
>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり
というような文脈からすると、
ThisWorkbook.Name
の方ですかね。

QエクセルVBAのIf,Then 構文でOr条件とAnd条件の結合方法?

ワークシート関数で書けば
=IF(OR(F18=0,AND(F15>0,F16>0)),TRUE)です。
これをVBAで書こうとして

If Sheet1.Range("F18") = 0 Or Sheet1.Range("F15") > 0 And Sheet1.Range("F16") > 0 Then
MsgBox True
Else
MsgBox False
End If

とやってみたのですが、正しくないようです。
どのように書けばいいのでしょうか?

Aベストアンサー

>とやってみたのですが、正しくないようです。

式は正しいと思いますよ

ANDとORは、ANDが先に演算されます。/*と+-では、/*が先に演算されるようなものです。

でも、わかり易くするために、#1のかたのように括弧をつけるほうが良いですね。

QExcel VBAでテキストを開く際の表示形式

恐れ入りますが、ご存知の方、ご教授願います。

Excel VBAにてテキストファイルを開く際に、表示形式を"標準"ではなく"文字列"で取り込もうと思います。
"文字列"にするにはVBAで下記のように記述します。

------------------------------------------------------------------
Workbooks.OpenText Filename:= _
sFileName _
, Origin:=932, StartRow:=1, DataType:=xlDelimited, TextQualifier:= _
xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=False, _
Comma:=False, Space:=False, Other:=False, FieldInfo:=Array( Array(1, 2), Array(2, 2), Array(3, 2)) , TrailingMinusNumbers:=True
------------------------------------------------------------------

FieldInfo:=部分に列数だけArray(x, 2)を指定しますが、一括で"文字列"指定することは可能でしょうか。

恐れ入ります。ご教授願います。

恐れ入りますが、ご存知の方、ご教授願います。

Excel VBAにてテキストファイルを開く際に、表示形式を"標準"ではなく"文字列"で取り込もうと思います。
"文字列"にするにはVBAで下記のように記述します。

------------------------------------------------------------------
Workbooks.OpenText Filename:= _
sFileName _
, Origin:=932, StartRow:=1, DataType:=xlDelimited, TextQualifier:= _
xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=F...続きを読む

Aベストアンサー

>一括で"文字列"指定
Loop回すので『一括』とはちょっと違うかもしれませんが

Dim arg(1 To 256)
Dim i As Long

For i = 1 To 256
  arg(i) = Array(i, 2)
Next

Workbooks.OpenText Filename:=sFileName, _
          StartRow:=1, _
          DataType:=xlDelimited, _
          TextQualifier:=xlDoubleQuote, _
          Tab:=True, _
          FieldInfo:=arg

こんな感じで可能です。

後は参考ですが、OpenTextメソッドでtextファイルを開くのではなく、
xlsシートにtextデータを取り込む場合は

Sub try()
  Dim arg(1 To 256)
  Dim i As Long

  For i = 1 To 256
    arg(i) = 2
  Next
  With Workbooks.Add(xlWBATWorksheet)
    With .ActiveSheet.QueryTables.Add(Connection:="TEXT;" & sFileName, _
                     Destination:=Range("A1"))
      .AdjustColumnWidth = False
      .TextFilePlatform = xlWindows
      .TextFileTabDelimiter = True
      .TextFileColumnDataTypes = arg
      .Refresh BackgroundQuery:=False
      .Parent.Names(.Name).Delete
      .Delete
    End With
  End With
End Sub
こんな感じで。

>一括で"文字列"指定
Loop回すので『一括』とはちょっと違うかもしれませんが

Dim arg(1 To 256)
Dim i As Long

For i = 1 To 256
  arg(i) = Array(i, 2)
Next

Workbooks.OpenText Filename:=sFileName, _
          StartRow:=1, _
          DataType:=xlDelimited, _
          TextQualifier:=xlDoubleQuote, _
          Tab:=True, _
          FieldInfo:=arg

こんな感じで可能です。

後は参考ですが、OpenTextメソッドでtex...続きを読む

Qエクセルで、条件に一致した行を別のセルに抜き出す方法

エクセルで、指定した条件に一致するセルを含む行をすべて抜き出す方法が知りたいです。

たとえば、

<A列> <B列> <C列>
7/1 りんご 100円
7/2 ぶどう 200円
7/2 すいか 300円
7/3 みかん 100円

このような表があって、100円を含む行をそのままの形で、
別のセル(同じシート内)に抜き出したいのですが。

7/1 りんご 100円
7/3 みかん 100円

抽出するだけならオートフィルターでもできますが、
抽出結果を自動的に、別の場所に、常に表示させておきたいのです。

初歩的な質問だと思いますが、検索しても分からなかったので、よろしくお願いします。

Aベストアンサー

同じ質問が結構よく出てますが、そんなに初歩的でもありません
別シートのA1セルに「100円」と入力し、そのシートの任意のセルに以下の式を貼り付けて下さい。後は、下方向、右方向にコピー。
日付のセル書式は「日付」形式に再設定してください

=IF(COUNTIF(Sheet1!$C:$C,$A$1)>=ROW(A1),INDEX(Sheet1!A:A,LARGE(INDEX((Sheet1!$C$1:$C$500=$A$1)*ROW(Sheet1!$C$1:$C$500),),COUNTIF(Sheet1!$C:$C,$A$1)-ROW(A1)+1)),"")

データ範囲は500行までとしていますが、必要に応じて変更して下さい

Q別のシートから値を取得するとき

Worksheets("シート名").Activate
上記のを行ってから別シートの値を取得するのですが、
この処理を行うと指定したシートへ強制的にとんでしまいます。。。

※イメージ
For ~ To ~
  Worksheets("シートA").Activate
  シートAの値取得
       :
  Worksheets("シートB").Activate
  シートBの値取得
Next

このイメージ処理を行うとものすごい勢いで画面がチカチカします。。。
シートを変えずに他のシートから値を取得する方法はないのでしょうか。
教えてください!

Aベストアンサー

Worksheets("シートA").Range("A1")

みたいな感じでできませんか?


人気Q&Aランキング

おすすめ情報