Excel VBA質問箱 IV

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

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


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

【52523】空白を含むコピー&ペーストについて tantan 07/11/16(金) 20:53 質問[未読]
【52526】Re:空白を含むコピー&ペーストについて じゅんじゅん 07/11/17(土) 7:20 発言[未読]
【52550】Re:空白を含むコピー&ペーストについて tantan 07/11/19(月) 11:22 質問[未読]
【52552】Re:空白を含むコピー&ペーストについて じゅんじゅん 07/11/19(月) 15:40 発言[未読]
【52553】Re:空白を含むコピー&ペーストについて tantan 07/11/19(月) 16:53 質問[未読]
【52554】Re:空白を含むコピー&ペーストについて ぴこ 07/11/19(月) 17:19 発言[未読]
【52556】Re:空白を含むコピー&ペーストについて じゅんじゅん 07/11/19(月) 20:26 発言[未読]
【52558】Re:空白を含むコピー&ペーストについて tantan 07/11/19(月) 21:07 質問[未読]
【52559】Re:空白を含むコピー&ペーストについて じゅんじゅん 07/11/19(月) 22:18 発言[未読]
【52557】Re:空白を含むコピー&ペーストについて tantan 07/11/19(月) 20:51 質問[未読]
【52572】Re:空白を含むコピー&ペーストについて ぴこ 07/11/20(火) 11:00 回答[未読]
【52599】Re:空白を含むコピー&ペーストについて tantan 07/11/21(水) 0:23 お礼[未読]

【52523】空白を含むコピー&ペーストについて
質問  tantan  - 07/11/16(金) 20:53 -

引用なし
パスワード
   はじめまして。

初心者で、とりとめもない質問になってしまうかもしれませんが
ご教授願います。

1.やりたいこと
・A列には日付が行によって入力されていたり、しなかったりランダムにが入力さ れています。
・C列には文字列で20070221と入力されているか#N/Aとなっています。
・これをA列にもし入力されていなかったら日付に変換して貼り付ける。
と、いうことをやりたいと思っています。

2.現在の状況
 =IF(ISERROR(A1),"",IF(A1=0,"",DATE(LEFTB(A1,4),MIDB(A1,5,2),RIGHTB(A1,2))))
という関数を作ってD列に日付か空白を入力しています。
・これをFor〜Next文で空白""でなければA列に貼り付けるということを実施
 している。

3.問題点
 ・For〜Next文だと1500行もあるので非常に時間がかかる。
 ・A列に入力してあるところはそのままにしておきたいので、
  ただ、列をコピーして張り付けると上書きされてしまう。
 ・「空白を無視して張り付ける」を使用しても""には0文字となってしまって
  おり空白とは認識されない。
 ・A列の書式は保ちたい。


以上のような問題を解決する方法がありましたら、是非ご教授願います。

素人で伝わりづらかったら申し訳ありません。長文ですみません。

【52526】Re:空白を含むコピー&ペーストについて
発言  じゅんじゅん  - 07/11/17(土) 7:20 -

引用なし
パスワード
   >3.問題点
> ・For〜Next文だと1500行もあるので非常に時間がかかる。
> ・A列に入力してあるところはそのままにしておきたいので、
>  ただ、列をコピーして張り付けると上書きされてしまう。
> ・「空白を無視して張り付ける」を使用しても""には0文字となってしまって
>  おり空白とは認識されない。
> ・A列の書式は保ちたい。

まず、上記コードを提示されては如何でしょう。

【52550】Re:空白を含むコピー&ペーストについて
質問  tantan  - 07/11/19(月) 11:22 -

引用なし
パスワード
   ▼じゅんじゅん さん:
>まず、上記コードを提示されては如何でしょう。

すみません。。
こんな感じです。。

Sub てすと()
 Dim i As Integer

 For i = 1 to 1500
  If Cells(i,4) = "" Then
    Cells(i,4).select
   Selection.copy _
   Destination:=ThisWorkbook.Worksheets("sheet1").Cells(i,4)
   Else: Cells(i,4).select
   Selection.copy
   Cells(i,1).select
   Selection.PasteSpecialPaste:=xlValues,Operation:=xlNone,SkipBlanks;=_
   False, Transpose:=False
  End If

 Next

End Sub


前回も記入させていただきましたが、列をコピーして、空白を無視して張り付ける
ことができれば簡単なのでしょうが、「""」で変換させた空白が邪魔をして
うまくいきません。
何かよい方法がありましたら、ご教授願います。

【52552】Re:空白を含むコピー&ペーストについて
発言  じゅんじゅん  - 07/11/19(月) 15:40 -

引用なし
パスワード
   ▼tantan さん:
>▼じゅんじゅん さん:
>>まず、上記コードを提示されては如何でしょう。
>
>すみません。。
>こんな感じです。。
>
>Sub てすと()
> Dim i As Integer
>
> For i = 1 to 1500
>  If Cells(i,4) = "" Then
>    Cells(i,4).select
>   Selection.copy _
>   Destination:=ThisWorkbook.Worksheets("sheet1").Cells(i,4)
>   Else: Cells(i,4).select
>   Selection.copy
>   Cells(i,1).select
>   Selection.PasteSpecialPaste:=xlValues,Operation:=xlNone,SkipBlanks;=_
>   False, Transpose:=False
>  End If
>
> Next
>
>End Sub
>
>1.やりたいこと
>・A列には日付が行によって入力されていたり、しなかったりランダムにが入力さ れています。
>・C列には文字列で20070221と入力されているか#N/Aとなっています。
>・これをA列にもし入力されていなかったら日付に変換して貼り付ける。
>と、いうことをやりたいと思っています。
>
>2.現在の状況
> =IF(ISERROR(A1),"",IF(A1=0,"",DATE(LEFTB(A1,4),MIDB(A1,5,2),RIGHTB(A1,2))))
>という関数を作ってD列に日付か空白を入力しています。
>・これをFor〜Next文で空白""でなければA列に貼り付けるということを実施
> している。

A列の値によりD列に値が入り、その値のみをA列に貼り付ける
と言う事ですか?
(上の数式はD列に入っているわけですよね?)

ちょっと私は混乱してます。

【52553】Re:空白を含むコピー&ペーストについて
質問  tantan  - 07/11/19(月) 16:53 -

引用なし
パスワード
   じゅんじゅん さん
お付き合いありがとうございます。
もう少し詳しく言うと、

A列に元データがあります。
そこに違うデータベースから持ってきたデータをC列に貼り付けてあります。
これを付け合せて、「更新されていたらA列に書き込む」ということを
したいと思っています。
ただ、C列のデータは文字列で20070221と入力されているか、古いデータで
もう無くなってしまい#N/Aとなっているので、以前書きました関数でD列に日付か""を入れています。
このD列とA列と比較させて、D列が""ならそのままD列に貼り付けておいて
そうでなければA列に貼り付け、としました。

何分素人なもので、そもそも関数でD列に日付変換する必要があったのかどうか、
またFor〜Next文で一行ずつ行なわなければならないかもわかりません。
何かよい方法があったらお教え願います。

【52554】Re:空白を含むコピー&ペーストについて
発言  ぴこ  - 07/11/19(月) 17:19 -

引用なし
パスワード
   ▼じゅんじゅん さん:
はじめまして。いつも勉強させていただいています。
>ちょっと私は混乱してます。
同感でレスの付くの待っているのですが、どうにも気になって…。

アクセスか何かでデーターを取り込んだ後処理をしていて、と考えました。
Sub tesi()
 For i = 1 To 1500
  If Range("A" & i) <> "" Then
    y = Left(Cells(i, 3), 4)
    m = Mid(Cells(i, 3), 5, 2)
    d = Right(Cells(i, 3), 2)
    Range("A" & i) = y & "/" & m & "/" & d
  End If
 Next i
End Sub
ただ単純にこれだけの様な?違っていたらすみません。

【52556】Re:空白を含むコピー&ペーストについて
発言  じゅんじゅん  - 07/11/19(月) 20:26 -

引用なし
パスワード
   C列に#NAがあったら何もしない。
A列に値があったら変更しない。
A列が空白だったら、C列の文字列を使用し日付データにしてA列に入れる。

Sub test()
Dim v, vv
Dim i As Long

vv = Range("C1", Cells(Rows.Count, 3).End(xlUp))
v = Range("A1", Cells(UBound(vv, 1), 1))
For i = 1 To UBound(vv, 1)
   If Not IsError(vv(i, 1)) Then
      v(i, 1) = IIf(v(i, 1) <> Empty, v(i, 1), _
           DateSerial(CInt(Mid(vv(i, 1), 1, 4)), _
                 CInt(Mid(vv(i, 1), 5, 2)), _
                 CInt(Mid(vv(i, 1), 7, 2))))
   End If
Next
Range("A:A").ClearContents
Range("A1").Resize(UBound(v, 1)).Value = v
End Sub
と言う事なのでしょうか?

【52557】Re:空白を含むコピー&ペーストについて
質問  tantan  - 07/11/19(月) 20:51 -

引用なし
パスワード
   ▼ぴこ さん:
ありがとうございます。
知識が無さ過ぎてゴメンナサイ。。
ぴこさんの言うとおり、自分で難しくしてしまっていた様です。

ぴこさんのコードでできました。
ただ、C列のデータは文字列で20070221と入力されているか、古いデータで
もう無くなっている箇所は#N/Aとなっているので、その箇所でエラーとなって
しまいます。

どのように回避したらよいのでしょうか?
もう少しお付き合い願います。

>Sub tesi()
> For i = 1 To 1500
>  If Range("A" & i) <> "" Then
>    y = Left(Cells(i, 3), 4)
>    m = Mid(Cells(i, 3), 5, 2)
>    d = Right(Cells(i, 3), 2)
>    Range("A" & i) = y & "/" & m & "/" & d
>  End If
> Next i
>End Sub

【52558】Re:空白を含むコピー&ペーストについて
質問  tantan  - 07/11/19(月) 21:07 -

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

ありがとうございます。ぴこさんのコードをためしていたら
じゅんじゅんさんからも回答を頂いていたことに気づきませんでした。

>C列に#NAがあったら何もしない。
>A列に値があったら変更しない。
>A列が空白だったら、C列の文字列を使用し日付データにしてA列に入れる。

まさにそのとおりです!!

コードを試させていただきました。

>Sub test()
> Dim v, vv
> Dim i As Long
>
> vv = Range("C1", Cells(Rows.Count, 3).End(xlUp))
> v = Range("A1", Cells(UBound(vv, 1), 1))
> For i = 1 To UBound(vv, 1)
>   If Not IsError(vv(i, 1)) Then
>      v(i, 1) = IIf(v(i, 1) <> Empty, v(i, 1), _
>           DateSerial(CInt(Mid(vv(i, 1), 1, 4)), _
>                 CInt(Mid(vv(i, 1), 5, 2)), _
>                 CInt(Mid(vv(i, 1), 7, 2))))
>   End If
> Next
> Range("A:A").ClearContents
> Range("A1").Resize(UBound(v, 1)).Value = v
>End Sub


v(i, 1) = IIf(v(i, 1) <> Empty, ・・・・・・・・・
のとこでエラーとなってしまいました。
このコードは自分には少しレベルが高いので、原因解読&TESTに時間が
かかりそうです。
行いたいことは、じゅんじゅんさんのおっしゃる通りなのでこのコードをもう少し
勉強したいと思います。ありがとうございます。
とりあえず、報告まで。。

【52559】Re:空白を含むコピー&ペーストについて
発言  じゅんじゅん  - 07/11/19(月) 22:18 -

引用なし
パスワード
   ▼tantan さん:
>▼じゅんじゅん さん:

>v(i, 1) = IIf(v(i, 1) <> Empty, ・・・・・・・・・
>のとこでエラーとなってしまいました。
>このコードは自分には少しレベルが高いので、原因解読&TESTに時間が
>かかりそうです。
>行いたいことは、じゅんじゅんさんのおっしゃる通りなのでこのコードをもう少し
>勉強したいと思います。ありがとうございます。
>とりあえず、報告まで。。

Emptyではなく
v(i, 1) = IIf(v(i, 1) <> ""
の方がいいかな?

【52572】Re:空白を含むコピー&ペーストについて
回答  ぴこ  - 07/11/20(火) 11:00 -

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

返事が遅くなりすみませんでした。
>もう無くなっている箇所は#N/Aとなっているので、その箇所でエラーとなって
>しまいます
すっとこどっこいでした。すみません。(≧ω≦)b
じゅんじゅんさんのコードのほうが高度で正確だと思いますが、

Sub test()
Dim y As String
Dim m As String
Dim d As String

For i = 1 To 1500
 If Not IsError(Range("C" & i)) Then
  If Range("A" & i) = "" And Range("C" & i) <> "" Then
    y = Left(Cells(i, 3), 4)
    m = Mid(Cells(i, 3), 5, 2)
    d = Right(Cells(i, 3), 2)
    Range("A" & i) = y & "/" & m & "/" & d
  End If
 End If
Next i

End Sub
今度は作動テストしました。

じゅんじゅんさんのコードから IsError を参考にしましたが UBound は私には高度すぎてヘルプを理解する為のヘルプが必要です。初心者でも解り易いヘルプがあればトホホ。(~_~;)

【52599】Re:空白を含むコピー&ペーストについて
お礼  tantan  - 07/11/21(水) 0:23 -

引用なし
パスワード
   ▼ぴこ さん:
ありがとうございます。
おかげさまでできました(^o^)丿
コピー&ペーストなんてやっていたら、そりゃ時間かかりますよね。
マクロの作り方に目からうろこです。
ありがとうございました。


▼じゅんじゅん さん:
コードのどこが引っかかっているかも、分からない素人ですみません。。。
解読するくらいの知識は早く見に着けたいと思いました。
今後も何かありましたら、よろしくお願いします。
ありがとうございました。

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