Excel VBA質問箱 IV

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

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


1380 / 13646 ツリー ←次へ | 前へ→

【74804】表示形式の改修 mariko 13/9/19(木) 14:28 質問[未読]
【74805】Re:表示形式の改修 AceNumber 13/9/19(木) 15:03 発言[未読]
【74806】Re:表示形式の改修 mariko 13/9/19(木) 15:34 質問[未読]
【74807】Re:表示形式の改修 AceNumber 13/9/19(木) 15:44 回答[未読]
【74808】Re:表示形式の改修 mariko 13/9/19(木) 15:51 発言[未読]
【74809】Re:表示形式の改修 mariko 13/9/19(木) 15:53 質問[未読]
【74810】Re:表示形式の改修 AceNumber 13/9/19(木) 16:11 回答[未読]
【74811】Re:表示形式の改修 AceNumber 13/9/19(木) 16:25 発言[未読]
【74812】Re:表示形式の改修 AceNumber 13/9/19(木) 16:26 発言[未読]
【74813】Re:表示形式の改修 mariko 13/9/19(木) 17:26 発言[未読]
【74814】Re:表示形式の改修 AceNumber 13/9/19(木) 17:37 発言[未読]
【74815】Re:表示形式の改修 mariko 13/9/19(木) 17:46 発言[未読]
【74816】Re:表示形式の改修 AceNumber 13/9/19(木) 17:52 回答[未読]
【74817】Re:表示形式の改修 AceNumber 13/9/19(木) 18:48 発言[未読]
【74818】Re:表示形式の改修 13/9/19(木) 21:19 発言[未読]
【74819】Re:表示形式の改修 AceNumber 13/9/20(金) 1:13 発言[未読]
【74820】Re:表示形式の改修 13/9/20(金) 7:31 発言[未読]
【74821】Re:表示形式の改修 AceNumber 13/9/20(金) 10:17 発言[未読]

【74804】表示形式の改修
質問  mariko  - 13/9/19(木) 14:28 -

引用なし
パスワード
   コピーをして貼付けをする際の表示形式に関する質問です。

Excelが2つ(AとB)あり、セルに日付が入力してあります。
共に見た目は「2013/09/24」(例)と同じなのですが、IF関数でマッチングを行うとエラーになってしまいました。
原因は表示形式に問題があり、excelAは「値」として張付けると「41541」となり、excelBは「2013/09/24」と表示されます。
なんとか一致出来るようにしたいのですが、この問題を解決する関数がありますでしょうか?または関数以外での解決法があればご教授ください。よろしくお願いします。

【74805】Re:表示形式の改修
発言  AceNumber  - 13/9/19(木) 15:03 -

引用なし
パスワード
   ▼mariko さん:
>コピーをして貼付けをする際の表示形式に関する質問です。
>
>Excelが2つ(AとB)あり、セルに日付が入力してあります。
>共に見た目は「2013/09/24」(例)と同じなのですが、IF関数でマッチングを行うとエラーになってしまいました。
>原因は表示形式に問題があり、excelAは「値」として張付けると「41541」となり、excelBは「2013/09/24」と表示されます。

「2013/09/24」の方は文字列形式ですか?

A1セルに「2013/09/24」(文字形式)
B1セルに「2013/09/24」(日付形式)として
C1セル =IF(DATEVALUE(A1)=A2,TRUE,FALSE)

でどうでしょう?

【74806】Re:表示形式の改修
質問  mariko  - 13/9/19(木) 15:34 -

引用なし
パスワード
   ▼AceNumber さん:
>▼mariko さん:
>>コピーをして貼付けをする際の表示形式に関する質問です。
>>
>>Excelが2つ(AとB)あり、セルに日付が入力してあります。
>>共に見た目は「2013/09/24」(例)と同じなのですが、IF関数でマッチングを行うとエラーになってしまいました。
>>原因は表示形式に問題があり、excelAは「値」として張付けると「41541」となり、excelBは「2013/09/24」と表示されます。
>
>「2013/09/24」の方は文字列形式ですか?
>
>A1セルに「2013/09/24」(文字形式)
>B1セルに「2013/09/24」(日付形式)として
>C1セル =IF(DATEVALUE(A1)=A2,TRUE,FALSE)
>
>でどうでしょう?


回答ありがとうございます。
DATEVALUEという関数があるのですね。初めて知りました。

任意のセルに「=DATEVALUE(F2)」と「=DATEVALUE(H2)」
※excelAはF2にexcelBはH2に入力データがあります。
で入力してみると、それぞれダイアログボックスでは共に「41541」と
表示されるのですが、OKボタンを押すと「#VALUE!」と
エラーになってしまいました。

これは何か原因があるのでしょうか?

【74807】Re:表示形式の改修
回答  AceNumber  - 13/9/19(木) 15:44 -

引用なし
パスワード
   ▼mariko さん:
>回答ありがとうございます。
>DATEVALUEという関数があるのですね。初めて知りました。
>
>任意のセルに「=DATEVALUE(F2)」と「=DATEVALUE(H2)」
>※excelAはF2にexcelBはH2に入力データがあります。
>で入力してみると、それぞれダイアログボックスでは共に「41541」と
>表示されるのですが、OKボタンを押すと「#VALUE!」と
>エラーになってしまいました。
>
>これは何か原因があるのでしょうか?

どちらも「#VALUE!」ですか?
DATEVALUE関数は文字列に対しての関数なので、標準か日付形式なのでしょう。
双方の書式を確認してみてください。

【74808】Re:表示形式の改修
発言  mariko  - 13/9/19(木) 15:51 -

引用なし
パスワード
   ▼AceNumber さん:

>▼mariko さん:
>どちらも「#VALUE!」ですか?
>DATEVALUE関数は文字列に対しての関数なので、標準か日付形式なのでしょう。
>双方の書式を確認してみてください。

どちらのセルの書式もユーザー定義で「yyyy/mm/dd」でした。

【74809】Re:表示形式の改修
質問  mariko  - 13/9/19(木) 15:53 -

引用なし
パスワード
   どちらのセルも表示形式を「文字列」に変換してマッチングさせると合致するということでしょうか?

【74810】Re:表示形式の改修
回答  AceNumber  - 13/9/19(木) 16:11 -

引用なし
パスワード
   ▼mariko さん:
>どちらのセルも表示形式を「文字列」に変換してマッチングさせると合致するということでしょうか?

いえ、表示形式を文字列にしてもシリアル値になるだけです。

では、シリアル値にしたときに小数点が付いていたりしませんか?
表示形式がyyyy/mm/ddなので、見た目は同じでも、実は時刻が入っている場合は一致しないですね。

【74811】Re:表示形式の改修
発言  AceNumber  - 13/9/19(木) 16:25 -

引用なし
パスワード
   ▼mariko さん:

VBAでシリアル値を調べる方法です。
新しいブックを開いて、標準モジュールを追加、下記をコピペしてください。

A1セル、A2セルに問題の2つの日付を貼り付けて実行してみてください。
VBEの画面でCtrl+GするとDebug.Printの結果がみられます。

Sub Test()

Dim ws As Worksheet

  Set ws = ActiveSheet

  Debug.Print ws.Cells(1, 1).Value2
  Debug.Print ws.Cells(1, 2).Value2

  Set ws = Nothing

End Sub

【74812】Re:表示形式の改修
発言  AceNumber  - 13/9/19(木) 16:26 -

引用なし
パスワード
   ▼mariko さん:

間違えました。

A1セル、A2セルではなく
A1セル、B1セルでした。

【74813】Re:表示形式の改修
発言  mariko  - 13/9/19(木) 17:26 -

引用なし
パスワード
   ▼AceNumber さん:

>▼mariko さん:
>
>間違えました。
>
>A1セル、A2セルではなく
>A1セル、B1セルでした。

私なりに考えてみて下記の入力をしてみました。

excelAに
Columns("F:F").Select
  Selection.NumberFormatLocal = "@"

excelBに
Columns("H:H").Select
  Selection.NumberFormatLocal = "@"

この対応で文字列変換をしました。
excelAは数値へ変換されましたが、
Bは変換されずにyyyy/mm/ddのままでした。
Bに貼付けるデータはもともとexcelではなくあるシステムの画面をコピーして
貼付けていますのでその影響なのでしょうか?

【74814】Re:表示形式の改修
発言  AceNumber  - 13/9/19(木) 17:37 -

引用なし
パスワード
   ▼mariko さん:
>Bは変換されずにyyyy/mm/ddのままでした。
>Bに貼付けるデータはもともとexcelではなくあるシステムの画面をコピーして
>貼付けていますのでその影響なのでしょうか?

なるほど、可能性としてはありますねぇ。

では、下記のコードを実行するとどうでしょう?

Sub Test2()

Dim ws   As Worksheet
Dim varD  As Variant

  Set ws = ActiveSheet

  varD = Split(ws.Cells(1, 1).Text, "/")
  ws.Cells(1, 1).Value = Format(Join(varD), "yyyy/mm/dd")
  varD = Split(ws.Cells(1, 2).Text, "/")
  ws.Cells(1, 2).Value = Format(Join(varD), "yyyy/mm/dd")
  If ws.Cells(1, 1).Value = ws.Cells(1, 2).Value Then
    MsgBox "同じ"
  Else
    MsgBox "違う"
  End If

  Set ws = Nothing

End Sub

【74815】Re:表示形式の改修
発言  mariko  - 13/9/19(木) 17:46 -

引用なし
パスワード
   ▼AceNumber さん:

>▼mariko さん:
>なるほど、可能性としてはありますねぇ。
>
>では、下記のコードを実行するとどうでしょう?
>
>Sub Test2()
>
>Dim ws   As Worksheet
>Dim varD  As Variant
>
>  Set ws = ActiveSheet
>
>  varD = Split(ws.Cells(1, 1).Text, "/")
>  ws.Cells(1, 1).Value = Format(Join(varD), "yyyy/mm/dd")
>  varD = Split(ws.Cells(1, 2).Text, "/")
>  ws.Cells(1, 2).Value = Format(Join(varD), "yyyy/mm/dd")
>  If ws.Cells(1, 1).Value = ws.Cells(1, 2).Value Then
>    MsgBox "同じ"
>  Else
>    MsgBox "違う"
>  End If
>
>  Set ws = Nothing
>
>End Sub

これはAとBのシートどちらに対して入力したらいいのでしょうか?
基本的なことでしょうが申し訳ありません。

【74816】Re:表示形式の改修
回答  AceNumber  - 13/9/19(木) 17:52 -

引用なし
パスワード
   ▼mariko さん:
>これはAとBのシートどちらに対して入力したらいいのでしょうか?
>基本的なことでしょうが申し訳ありません。

先程と同様に新しいブックを開いて、A1、B1セルに対象を貼り付けて実行してください。

【74817】Re:表示形式の改修
発言  AceNumber  - 13/9/19(木) 18:48 -

引用なし
パスワード
   ▼mariko さん:
>これはAとBのシートどちらに対して入力したらいいのでしょうか?
>基本的なことでしょうが申し訳ありません。

なんか不親切だった気がするので、書き換えてみました。

1.新しいブックを開き、標準モジュールを追加し、下記コードを貼り付け
2.Set wsA = Workbooks("ブックA").Sheets("シートA")
  ブックA、シートAの部分を実際のブック名、シート名に変更
3.Set wsB = Workbooks("ブックB").Sheets("シートB")
  同上
4.varD = Split(wsA.Range("A1").Text, "/")
  "A1"の部分をシートAの検査したいアドレスに変更
5.varD = Split(wsB.Range("A1").Text, "/")
  同上(シートBの)

検査対象のブックは開いた状態で実行してください。

Sub Test()

Dim ws   As Worksheet
Dim wsA   As Worksheet
Dim wsB   As Worksheet
Dim varD  As Variant

  Set ws = ThisWorkbook.Sheets(1)
  Set wsA = Workbooks("ブックA").Sheets("シートA")  '2
  Set wsB = Workbooks("ブックB").Sheets("シートB")  '3

  varD = Split(wsA.Range("A1").Text, "/")       '4
  ws.Cells(1, 1).Value = Format(Join(varD), "yyyy/mm/dd")
  varD = Split(wsB.Range("A1").Text, "/")       '5
  ws.Cells(1, 2).Value = Format(Join(varD), "yyyy/mm/dd")
  If wsA.Cells(1, 1).Value = ws.Cells(1, 2).Value Then
    MsgBox "同じ"
  Else
    MsgBox "違う"
  End If

  Set ws = Nothing
  Set wsA = Nothing
  Set wsB = Nothing

End Sub

【74818】Re:表示形式の改修
発言    - 13/9/19(木) 21:19 -

引用なし
パスワード
   こんにちは。

どの位置につけるか迷いましたが、現時点での質問者さんの最新の
コメントに。


いくつか気になることがあります。

まずここは、VBAの掲示板です。いきおい回答もVBA的な視点から
のものになります。そのてん大丈夫なんでしょうか?
いや、なんとなく mariko さんの発想が一般機能っぽいなと。

表示形式に関する質問と仰っていますが、セルの中身を比較する
ときは、表示形式は直接関係ありません。あたい同士の比較になります。

excelBのほうですが、日付けに見える文字列を本物の日付けに
書き換えてしまったら具合が悪いですか?
比較は簡単になりますが。

【74819】Re:表示形式の改修
発言  AceNumber  - 13/9/20(金) 1:13 -

引用なし
パスワード
   ▼佳 さん:
>excelBのほうですが、日付けに見える文字列を本物の日付けに
>書き換えてしまったら具合が悪いですか?
>比較は簡単になりますが。

↑の辺りを探っているつもりでしたが、回りくどかったでしょうか...
段階を追って行く方が理解し易いかと思いましたが、上級者の方がいらっしゃいましたので、出る幕はなくなったかもです(^_^;)

【74820】Re:表示形式の改修
発言    - 13/9/20(金) 7:31 -

引用なし
パスワード
   AceNumber さん、こんにちは。

ご存知とは思いますが、一般機能でデータ→区切り位置 とやると
文字列データを 問答無用で 数値や日付けに置き換えできます。
もとのデータがどんなものであろうとお構いなしに、
変換可能とみればことごとく置き換えるという、強力かつ乱暴なものです。

これを意識しての、置き換えてしまってはマズイだろうか? の質問でした。


>段階を追って行く方が理解し易いかと思いましたが、

そう。これなんですよね。
データ・区切り位置だと、もとのデータがどういうものかという理解を
素通りしてしまうんです。何も分からなくても結果は出てしまうという。

一方で強力なツールですから、知っておいて悪いことはなかろうとも思い。
迷うところです。


出る幕云々ですが、わたしとしては「いい人が出てきてくれたな」と
頼もしく見上げる思いでおります。本スレでもご活躍、期待しています。

【74821】Re:表示形式の改修
発言  AceNumber  - 13/9/20(金) 10:17 -

引用なし
パスワード
   ▼佳 さん:
>AceNumber さん、こんにちは。

佳 さん、おはようございます。

>
>ご存知とは思いますが、一般機能でデータ→区切り位置 とやると
>文字列データを 問答無用で 数値や日付けに置き換えできます。
>もとのデータがどんなものであろうとお構いなしに、
>変換可能とみればことごとく置き換えるという、強力かつ乱暴なものです。
>
>これを意識しての、置き換えてしまってはマズイだろうか? の質問でした。

なるほど、そういう手もありますね。思いつかなかったです(汗

>
>
>>段階を追って行く方が理解し易いかと思いましたが、
>
>そう。これなんですよね。
>データ・区切り位置だと、もとのデータがどういうものかという理解を
>素通りしてしまうんです。何も分からなくても結果は出てしまうという。
>
>一方で強力なツールですから、知っておいて悪いことはなかろうとも思い。
>迷うところです。

その通りですね。勉強になります。

>
>
>出る幕云々ですが、わたしとしては「いい人が出てきてくれたな」と
>頼もしく見上げる思いでおります。本スレでもご活躍、期待しています。

とんでもないです。
やり取りすることで質問者さん共々スキルアップが出来ればと、その程度の者ですので...

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