アプリ版:「スタンプのみでお礼する」機能のリリースについて

excel2010のxlsmファイルをexcel2016で実行しましたところタイトルのexcelVBAの実行時エラー'1004'が出ました。
「宛名ラベルを自動作成する」といゆう内容です。(雑誌に掲載されていたVBAのsampleファイルを使用)

マクロのdata
Sub MakeLabel()
Dim i As Integer

Sheets("ラベル").Cells.ClearContents
For i = 3 To 27 Step 3
Range(Cells(i, "B"), Cells(i + 2, "D")).Copy
Worksheets("ラベル").Cells(i - 1, "B").PasteSpecial _
Paste:=xlPasteValues, Transpose:=True
Next
Worksheets("ラベル").PrintPreview
End Sub

エラー内容は添付の画像をご参照ください。

Excelに住所のdataとラベルのシートがあります。
PC Windows 10 を使用しています。

よろしくご回答お願いします。

「excelVBAの実行時エラー'1004」の質問画像

質問者からの補足コメント

  • うーん・・・

    GooUserラックさま
    早速、ご回答頂き有難うございました。
    しかし、2つともトライしましたが、同じ実行エラーがでます。
    確認ですが「・ 先頭に1行追加する。」は、意味を取り違えていたのでは、申し訳ございませんので
    具体的にお教えください。
    Excelのsheet住所録に1行追加するのでしょうか?

    VBAはまだ、やり始めたばかりで、このラベル印刷の仕組みを皮切りに学習したいと思います。
    よろしくお願いいたします。            (今回始めての投稿です。70代の老人より)

    No.1の回答に寄せられた補足コメントです。 補足日時:2017/09/06 14:44
  • WindFaiier様
    アドバイス有難うございました。私の添付画像が情報不足でございました。
    よってもう一度、Dataの説明と新しいスクリーンショット画像を添付致します。
    説明:Excelシートが2枚シート名は 71-1とラベル シートです。71-1シートに「ラベル作成」ボタンがあります。ラベル・シートには、1件3行で1つの住所を表記できる3列のラベルシートとなっています。最初に添付しました画像は71-1シートの「ラベル作成」ボタンを押したらラベル・シートが表示され且つ実行時エラーが出たところをスクリーンショットしました。
    >貼り付け領域は、3行・3列とされているのに、画像では、3行・1列になっていますから、
    マクロを実行した結果がラベル6人分は正常にペーストされているのに9行目の「大塚章夫」から
    不具合になっています。(Excelはマクロの記録は出来ますが変数とか難しい事はわかりません)

    「excelVBAの実行時エラー'1004」の補足画像2
    No.4の回答に寄せられた補足コメントです。 補足日時:2017/09/07 22:16

A 回答 (5件)

こんばんは。



マクロの内容と、データとはうまく合ってなかった、というように思いましたが、逆に、私が想像したものとは、まるで違うものでした。

話はそれますが、ご質問者さんは、私のPCの師匠と同じぐらいの年代のようです。師匠は、定年退職してから、コンピュータのインストラクターの道に入った変わり種で、Excelが何よりも好きだそうです。ただ、掲示板は、老いも若きも性別も、偉い人もそうでない人も、ありませんね。

直してみましたが、やはり奇妙なマクロだという印象は変わりませんでしたし、こういう方法(1列3行ずつを出していくこと)は、入門レベルや初級レベルだと行き詰まってしまいます。数列を頭の中ですぐに計算できる人もいる人は苦はないのですが、私などは、意外に手間が掛かってしまいます。

'//標準モジュール
Sub MakeLabel2()
 Dim i As Long
 Dim j As Long
 Dim DataSh As Worksheet
 Dim LabelSh As Worksheet
 Dim k As Long
 Set DataSh = Worksheets("71-1") 'データ
 Set LabelSh = Worksheets("ラベル") '印刷ラベル用

 LabelSh.Activate
 If MsgBox("データを消してよろしいですか?", vbQuestion + vbOKCancel) = vbCancel Then Exit Sub
 With LabelSh.Cells(2, 1)
  .CurrentRegion.NumberFormat = "General"
  .CurrentRegion.Font.Size = 11
  .CurrentRegion.VerticalAlignment = xlVAlignCenter
  .CurrentRegion.ClearContents
 End With
 
 k = 2 '出力行の始まり
 
 With DataSh
  For i = 3 To 27 Step 3
   For j = 0 To 2
    .Cells(i, 2 + j).Resize(3).Copy
    LabelSh.Cells(k, 1).PasteSpecial _
      Paste:=xlPasteValues, Transpose:=True
    If j = 2 Then
     LabelSh.Cells(k, 1).Resize(, 3).NumberFormatLocal = "@ " & "様"
     LabelSh.Cells(k, 1).Resize(, 3).Font.Size = 12 '氏名のフォントサイズを大きくする
    End If
    If j = 0 Then
     LabelSh.Cells(k, 1).Resize(, 3).VerticalAlignment = xlVAlignBottom
    Else
     LabelSh.Cells(k, 1).Resize(, 3).VerticalAlignment = xlVAlignTop
    End If
    k = k + 1
   Next j
   DoEvents 'ESCでブレイクすることを可能にします。
  Next i
 End With
 LabelSh.PrintPreview
End Sub

添付画像のデータの3つ目以降は、富士通の情報リテラシーというテキストからです。
「excelVBAの実行時エラー'1004」の回答画像5
    • good
    • 0
この回答へのお礼

WindFaiier様
こんにちは。お礼が遅くなりました。詳しいsample 有難うございました。
今はすぐに理解できませんが教えて頂きましたマクロを理解出来るようにトライ致します。
アップルCEO直々に招待-82歳日本人アプリ開発者マーちゃんこと若宮正子さんの例もありますように、好きな事に打ち込んでいきたいと思います。
                            beaverPC

お礼日時:2017/09/08 16:17

割り込みさせていただきます。


正直なところ、VBA入門の方ではないでしょうけれども、むつかしいことをされているようですね。結論的なことを言えば、動いたマクロを、そのまま使えばよいはずです。

今は、元のベースになるデータと貼り付け領域が違っていますから、添付画像とマクロとは整合性がありません。マクロか、ベースのデータかどちらかを直すしかありません。
貼り付け領域は、3行・3列とされているのに、画像では、3行・1列になっていますから、これでは、領域に不整合がおきてしまいます。もしかしたら、結合セルがあるのかもしれません。

結論的には、貼り付け場所は、3行・3列ですべきなのです。
(レイアウト的に、若干、質が落ちるから、結合セルにするということもありますが、それは、ツーランク上のマクロになってしまいます)

>(雑誌に掲載されていたVBAのsampleファイルを使用)
また、雑誌に、このままのコードが掲載されていたとは思えません。書き慣れていているとはいえ、雑誌に載っているようなコードではありません。

マクロで、今回の内容を動かすように直すのは、特別のワザを使う必要があります。
掲示板では、実験的なマクロを出すと、本来の目的の私の主張とは違う解釈がなされる可能性がありますので、修正マクロの掲示するのは一応やめておきます。決められたフォーマットでマクロを動かすようにしてください。

なお、#3さんのご指摘も正しいです。
>Range(Cells(i, "B"), Cells(i + 2, "D")).Copy
ここには、どこのシートを示すと書かれていませんから、ActiveSheet がデータの場所であるとするしかありません。エラーとしては、違いますが、エラーの可能性が高くなります。

添付画像は、元のデータの想定したフォーマット(3行・3列)
「excelVBAの実行時エラー'1004」の回答画像4
この回答への補足あり
    • good
    • 0

「ラベル」シートが出ている状態でプログラムを実行しているのでエラーになっているのだと思われます。



もしそうなら、「データ」シートを前面にだしてプログラムを実行すれば正常に実行されるはずです。

データをコピーする処理の記述が現在アクティブなシートのセル範囲をコピーするようになっています。(Range(Cells(i, "B"), Cells(i + 2, "D")).Copy の部分)

コピーした内容を同じシートに回転して貼り付けようとしているためにエラーとなります。

必ず、データシートからコピーするようにするには、

Worksheets("データ").Activate

をコピー処理の前に記述すればよいと思います。
    • good
    • 0

こちらが同じ環境でないのと画面が良く見えないのでハッキリとしませんが、


今表示されているシートが貼り付け先ならば、元のシートを表示した状態でないとエラーが出るのかもしれません。
    • good
    • 0

セル結合されているエラーです。

以下のどちらかで解消しそうです。
・ 先頭に1行追加する。
・「For i = 3 To 27 Step 3」を「For i = 2 To 26 Step 3」にする。
この回答への補足あり
    • good
    • 0

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