Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


13150 / 13644 ツリー ←次へ | 前へ→

【6688】日付けの処理 ヤマトダマシイ 03/7/23(水) 22:36 質問
【6689】Re:日付けの処理 ぴかる 03/7/24(木) 8:55 回答
【6709】Re:日付けの処理 ヤマトダマシイ 03/7/27(日) 12:18 質問
【6710】Re:日付けの処理 Hirofumi 03/7/27(日) 17:41 発言
【6723】Re:日付けの処理 ヤマトダマシイ 03/7/28(月) 19:00 質問
【6724】Re:日付けの処理 Hirofumi 03/7/28(月) 20:59 発言
【6725】Re:日付けの処理 Hirofumi 03/7/28(月) 21:07 発言
【6780】Re:日付けの処理 ヤマトダマシイ 03/8/3(日) 18:35 質問
【6781】Re:日付けの処理 ヤマトダマシイ 03/8/3(日) 18:37 質問
【6782】Re:日付けの処理 Hirofumi 03/8/3(日) 19:54 回答
【6784】Re:日付けの処理 Hirofumi 03/8/3(日) 20:15 回答
【6786】Re:日付けの処理 ヤマトダマシイ 03/8/3(日) 22:41 お礼

【6688】日付けの処理
質問  ヤマトダマシイ  - 03/7/23(水) 22:36 -

引用なし
パスワード
   はじめましてヤマトダマシイと申します。よろしくお願いします
データベースの検索をしてまして日付のデータの処理に困ってます。
「平成15年11月12日」というデータを比較に使いたいのです。
たとえば「平成15年11月12日」というデータと「平成15年11月20日」と
いうデータを「平成15年11月12日」のほうが早いのでそのデータを処理するみたいな感じで作りたいんですがこの平成15年11月12日が日付として認識してくれるのかわかりません。。どうしたらいいんでしょうか?すいませんが誰か教えてください・・・

【6689】Re:日付けの処理
回答  ぴかる  - 03/7/24(木) 8:55 -

引用なし
パスワード
   ヤマトダマシイさん、こんにちは。

>「平成15年11月12日」というデータを比較に使いたいのです。
セルに11/12と入力すると、通常11月12日と表示されます。
そしてセルの書式設定→表示形式→日付にて設定変更でお好み表示になります。
11月12日という表示ですが、実際には数値(11月12日=37937)となってるんで、
比較は容易に出来ると思います。ご確認下さい。

【6709】Re:日付けの処理
質問  ヤマトダマシイ  - 03/7/27(日) 12:18 -

引用なし
パスワード
   ▼ひかる さん:
レスありがとうございます。
お教えいただいたとおり処理しましたが出来ませんでした。
というのも「12月5日」というデータを日付といて認識していないようです。
というのもこのデータはほかのデータベースのデータをエクセルに変換する
ソフトを使ったもので「12月5日」はたぶん文字データとして認識しているようです。

そこで質問なんですが「1日目」「2日目」といった文字の混じったデータを
比較させることは出来ないでしょうか?これができたらかいけつするとおもうのですが・・・

すいませんがわかる方お教えください・・・お願いします・・・

【6710】Re:日付けの処理
発言  Hirofumi E-MAIL  - 03/7/27(日) 17:41 -

引用なし
パスワード
   横から失礼します
現実にはどうなっているのですか
データベースて、Excelのシートに作られているの?
日付の形は
「11月12日」?
「11月12日」?
「平成15年11月12日」?
「平成15年11月12日」?
場合によっては、マクロか関数作って、シリアル値に変換する事は出来ないのですか?
例えば、「11月12日」や「11月12日」だとすると平成15年で善いのですか?

例として、以下の様なユーザー定義関数を作ります
現在の日付の隣りに列を挿入します
其処に作成した関数でシリアル値に変換します
其れを、形式を選択して張り付けで、値に直し、セルの書式を日付にします
現在の日付と比較してOKなら現在の日付列を削除します
なんて事で出来ないの?

Public Function DateConversion(vntValue As Variant) As Variant

  Dim strTmp As String
  
  DateConversion = vntValue
  If IsDate(StrConv(vntValue, vbNarrow)) Then
    strTmp = StrConv(vntValue, vbNarrow)
  Else
    strTmp = "平成15年" & StrConv(vntValue, vbNarrow)
  End If
  If IsDate(strTmp) Then
    DateConversion = DateValue(strTmp)
  End If
  
End Function

【6723】Re:日付けの処理
質問  ヤマトダマシイ  - 03/7/28(月) 19:00 -

引用なし
パスワード
   ▼Hirofumi さん:
返信ありがとうございます。

>横から失礼します
>現実にはどうなっているのですか
>データベースて、Excelのシートに作られているの?

EXCELのシートに作られてます

>日付の形は

>「平成15年11月12日」←これです。


>場合によっては、マクロか関数作って、シリアル値に変換する事は出来ないのですか?

すいません。シリアル値がわかりません・・・後で調べときます・・・

>例えば、「11月12日」や「11月12日」だとすると平成15年で善いのですか?

「平成15年11月23日」と「平成15年11月30日」のデータを比較したいです。

具体的に言うこれら2つデータは値が違うのである処理をしたい・・・です
>
>例として、以下の様なユーザー定義関数を作ります
>現在の日付の隣りに列を挿入します
>其処に作成した関数でシリアル値に変換します

シリアル値の意味がなんとなくわかりました。
こう思ってください日付のデータであって日付のデータでない・・・
ほかのデータベースから機械的にエクセルに変換したので日付を日付として認識していないようです。
つまり「1日目」とか「1回」とか数字に文字が入ってるもの同士で比較できたら解決すると思うのですが・・・

「1回目」と「2回目」というデータは比較でいないですかね?

これにもシリアル値があれば解決しそうですが・・・

すいません初歩的な質問で・・・本に載ってないもので・・・いい本ないですかね・・・

>其れを、形式を選択して張り付けで、値に直し、セルの書式を日付にします
>現在の日付と比較してOKなら現在の日付列を削除します
>なんて事で出来ないの?
>
>Public Function DateConversion(vntValue As Variant) As Variant
>
>  Dim strTmp As String
>  
>  DateConversion = vntValue
>  If IsDate(StrConv(vntValue, vbNarrow)) Then
>    strTmp = StrConv(vntValue, vbNarrow)
>  Else
>    strTmp = "平成15年" & StrConv(vntValue, vbNarrow)
>  End If
>  If IsDate(strTmp) Then
>    DateConversion = DateValue(strTmp)
>  End If
>  
>End Function

【6724】Re:日付けの処理
発言  Hirofumi E-MAIL  - 03/7/28(月) 20:59 -

引用なし
パスワード
   こんなのは、どうでしょう?
上手いコードではないけど、データベースをいじって善いなら
現在の日付をシリアル値(日付連番)に変換するマクロを作って見ました
ただし、間違っているとまずいので、元のデータのコピーで
以下のマクロを試して見て下さい
使い方は、現在の日付の列のセルにセルポインタを置きます
(用は、日付列のセルをクリックする)
以下のマクロ、Testを実行します
現在の日付の列の隣りに列が挿入され、そこにシリアル値(日付連番)が記入されます

Public Sub Test()

  Dim lngDataTop As Long
  Dim lngDataEnd As Long
  Dim lngDataCol As Long
  Dim rngResult As Range
  
  lngDataCol = ActiveCell.Column
  lngDataTop = 2
  lngDataEnd = Cells(65536, lngDataCol).End(xlUp).Row

  Cells(lngDataTop, lngDataCol + 1).EntireColumn.Insert
  Set rngResult = Range(Cells(lngDataTop, lngDataCol + 1), _
              Cells(lngDataEnd, lngDataCol + 1))
  With rngResult
    .Formula = "=DATEVALUE(" & Cells(lngDataTop, _
                lngDataCol).Address(False, False) & ")"
    .NumberFormatLocal = "ggge""年""m""月""d""日"""
    .Value = .Value
  End With
  Set rngResult = Nothing
  
End Sub

【6725】Re:日付けの処理
発言  Hirofumi E-MAIL  - 03/7/28(月) 21:07 -

引用なし
パスワード
   書き忘れましたが、これは列見出しが有り、
データは2行目から有るのを前提にしています
もし此れ以外の場合、
  lngDataTop = 2
の値を変更してください
この、2はデータの先頭が2行目からと言う意味で、もし列見出しが無いなら
  lngDataTop = 1
とします

【6780】Re:日付けの処理
質問  ヤマトダマシイ  - 03/8/3(日) 18:35 -

引用なし
パスワード
   ▼Hirofumi さん:
>こんなのは、どうでしょう?
>上手いコードではないけど、データベースをいじって善いなら
>現在の日付をシリアル値(日付連番)に変換するマクロを作って見ました
>ただし、間違っているとまずいので、元のデータのコピーで
>以下のマクロを試して見て下さい
>使い方は、現在の日付の列のセルにセルポインタを置きます
>(用は、日付列のセルをクリックする)
>以下のマクロ、Testを実行します
>現在の日付の列の隣りに列が挿入され、そこにシリアル値(日付連番)が記入されます
>
>Public Sub Test()
>
>  Dim lngDataTop As Long
>  Dim lngDataEnd As Long
>  Dim lngDataCol As Long
>  Dim rngResult As Range
>  
>  lngDataCol = ActiveCell.Column
>  lngDataTop = 2
>  lngDataEnd = Cells(65536, lngDataCol).End(xlUp).Row
>
>  Cells(lngDataTop, lngDataCol + 1).EntireColumn.Insert
>  Set rngResult = Range(Cells(lngDataTop, lngDataCol + 1), _
>              Cells(lngDataEnd, lngDataCol + 1))
>  With rngResult
>    .Formula = "=DATEVALUE(" & Cells(lngDataTop, _
>                lngDataCol).Address(False, False) & ")"
>    .NumberFormatLocal = "ggge""年""m""月""d""日"""
>    .Value = .Value
>  End With
>  Set rngResult = Nothing
>  
>End Sub

これは大変有効なものを教えていただきました・・・ありがとうございます。ただこのVBAの分が高度すぎてわたくしにはさっぱり・・・Dim lngDataTop As Long はなにを宣言してるのでしょうか?

【6781】Re:日付けの処理
質問  ヤマトダマシイ  - 03/8/3(日) 18:37 -

引用なし
パスワード
   ▼ヤマトダマシイ さん:
>▼Hirofumi さん:
>>こんなのは、どうでしょう?
>>上手いコードではないけど、データベースをいじって善いなら
>>現在の日付をシリアル値(日付連番)に変換するマクロを作って見ました
>>ただし、間違っているとまずいので、元のデータのコピーで
>>以下のマクロを試して見て下さい
>>使い方は、現在の日付の列のセルにセルポインタを置きます
>>(用は、日付列のセルをクリックする)
>>以下のマクロ、Testを実行します
>>現在の日付の列の隣りに列が挿入され、そこにシリアル値(日付連番)が記入されます
>>
>>Public Sub Test()
>>
>>  Dim lngDataTop As Long
>>  Dim lngDataEnd As Long
>>  Dim lngDataCol As Long
>>  Dim rngResult As Range
>>  
>>  lngDataCol = ActiveCell.Column
>>  lngDataTop = 2
>>  lngDataEnd = Cells(65536, lngDataCol).End(xlUp).Row
>>
>>  Cells(lngDataTop, lngDataCol + 1).EntireColumn.Insert
>>  Set rngResult = Range(Cells(lngDataTop, lngDataCol + 1), _
>>              Cells(lngDataEnd, lngDataCol + 1))
>>  With rngResult
>>    .Formula = "=DATEVALUE(" & Cells(lngDataTop, _
>>                lngDataCol).Address(False, False) & ")"
>>    .NumberFormatLocal = "ggge""年""m""月""d""日"""
>>    .Value = .Value
>>  End With
>>  Set rngResult = Nothing
>>  
>>End Sub
>
>これは大変有効なものを教えていただきました・・・ありがとうございます。ただこのVBAの分が高度すぎてわたくしにはさっぱり・・・Dim lngDataTop As Long はなにを宣言してるのでしょうか?

そうあとこれさえ出来ればぜったいに完成します。どなたか上のVBA文に解説を・・・お願いします・・

【6782】Re:日付けの処理
回答  Hirofumi E-MAIL  - 03/8/3(日) 19:54 -

引用なし
パスワード
   >そうあとこれさえ出来ればぜったいに完成します。どなたか上のVBA文に解説を・・・お願いします・・

こんな物で宜しいですか?
使い方は、変換したい列(現在の日付列)のセルを選択する
マクロを実行する
尚、マクロは標準モジュールに記述して下さい

Public Sub Test()

  '変数宣言
  Dim lngDataTop As Long 'データの先頭行
  Dim lngDataEnd As Long 'データの最終行
  Dim lngDataCol As Long 'アクティブセルの列番号
  Dim rngResult As Range '結果を書き込む範囲
  
  'アクティブセルの列番号を取得
  lngDataCol = ActiveCell.Column
  'データの先頭行(列見出しが有るならその下の行位置)を設定
  lngDataTop = 2
  'データの最終行を取得
  lngDataEnd = Cells(65536, lngDataCol).End(xlUp).Row

  'アクティブセルの右隣に1列追加
  Cells(lngDataTop, lngDataCol + 1).EntireColumn.Insert
  '結果を書き込む範囲を設定
  Set rngResult = Range(Cells(lngDataTop, lngDataCol + 1), _
              Cells(lngDataEnd, lngDataCol + 1))
  '結果範囲について
  With rngResult
    '結果範囲にDATEVALUEワークシト関数を書き込む
    .Formula = "=DATEVALUE(" & Cells(lngDataTop, _
                lngDataCol).Address(False, False) & ")"
    '結果範囲に日付の書式を設定(元号)
    .NumberFormatLocal = "ggge""年""m""月""d""日"""
    '結果範囲のワークシト関数を値に変換
    .Value = .Value
  End With
  '結果範囲の参照を消去
  Set rngResult = Nothing
  
End Sub

【6784】Re:日付けの処理
回答  Hirofumi E-MAIL  - 03/8/3(日) 20:15 -

引用なし
パスワード
   やっている概要も書いておいた方が善いかな?
コードの都合上、少し違いますが手作業でも出来る事です
手作業でやるなら、
1、変換したい列の右隣のセルをアクティブにする
2、「挿入」→「列」を実行
3、挿入した列の先頭セルにDATEVALUEワークシト関数を設定し、
 引数の参照先を左隣りのセルにする
4、そのセルをコピーしてセルの最終行まで張り付ける
5、先頭行から最終行まで選択して、「編集」→「コピー」
6、そのまま、「編集」→「形式を選択して張りつけ」(値のみ)
以上

【6786】Re:日付けの処理
お礼  ヤマトダマシイ  - 03/8/3(日) 22:41 -

引用なし
パスワード
   ▼Hirofumi さん:
>やっている概要も書いておいた方が善いかな?
>コードの都合上、少し違いますが手作業でも出来る事です
>手作業でやるなら、
>1、変換したい列の右隣のセルをアクティブにする
>2、「挿入」→「列」を実行
>3、挿入した列の先頭セルにDATEVALUEワークシト関数を設定し、
> 引数の参照先を左隣りのセルにする
>4、そのセルをコピーしてセルの最終行まで張り付ける
>5、先頭行から最終行まで選択して、「編集」→「コピー」
>6、そのまま、「編集」→「形式を選択して張りつけ」(値のみ)
>以上

とりあえず手作業でやりましたら出来ました!ありがとうございました!!

後々VBAの文に組み込みたいと思います

13150 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free