Excel VBA質問箱 IV

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

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


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

【18473】コピー&ペーストについて ponpon 04/9/27(月) 22:31 質問[未読]
【18474】Re:コピー&ペーストについて Asaki 04/9/27(月) 22:57 回答[未読]
【18475】Re:コピー&ペーストについて ponpon 04/9/27(月) 23:26 発言[未読]
【18476】Re:コピー&ペーストについて Asaki 04/9/28(火) 0:03 回答[未読]
【18477】Re:コピー&ペーストについて ponpon 04/9/28(火) 0:23 発言[未読]
【18478】Re:コピー&ペーストについて Asaki 04/9/28(火) 0:32 回答[未読]
【18479】Re:コピー&ペーストについて ponpon 04/9/28(火) 0:56 お礼[未読]
【18481】Re:コピー&ペーストについて ponpon 04/9/28(火) 10:34 質問[未読]
【18482】Re:コピー&ペーストについて Asaki 04/9/28(火) 11:05 回答[未読]
【18488】Re:コピー&ペーストについて ponpon 04/9/28(火) 12:55 お礼[未読]
【18593】Re:コピー&ペーストについて ponpon 04/9/30(木) 19:14 質問[未読]
【18603】Re:コピー&ペーストについて ichinose 04/10/1(金) 10:05 発言[未読]

【18473】コピー&ペーストについて
質問  ponpon  - 04/9/27(月) 22:31 -

引用なし
パスワード
    こんばんわ 
 運動会あけの代休なので、夕方からがんばっています。
 質問ですが、非常に初歩的で申し訳ないのですが、コピペについてです。
 漢字プリント自動作成に取り組んでいます。
 なんとか形はできて問題が作れるようになったのですが、漢字の読み仮名表示のところで漢字のところは太字にして「がっこう(太字)の(標準)ほん(太字)」のように表示させたいのですが、うまくいきません。新規ブックでのマクロの記録ではきちんと太字でコピペされるのに、どうしてでしょうか?教えてください。
 問題作成シートの問題は横書きなのに、漢字プリントシートの表示は縦書きだからいけないのでしょうか?もしそうだとしたら、無理なことなのでしょうか?

Sub 問題3()
Dim t As Single
Dim n As Single
Dim m As Single
Dim i As Single
Dim stri As String
Dim numtmp As String

  Worksheets("問題作成").Select
  t = Range("C1", Range("C1").End(xlDown)).Count 'C列の問題数の取得
 
 For n = 19 To 1 Step -2
  For m = 2 To 17 Step 15
   Randomize
   i = Int(Rnd * t) + 1
    stri = i

  numtmp = stri

 Do While InStr(1, numtmp, stri) > 0   'numtmpにstriが含まれてる間
                      'シャッフルを繰り返す
  i = Int(Rnd * t) + 1
    stri = i
 
 Loop
 

 Sheets("漢字プリント").Select
 Sheets("漢字プリント").Cells(m, n).Value = Sheets("問題作成")_
 .Cells(i, 3).Value
 Sheets("漢字プリント").Cells(m, n + 1).Value = Sheets("問題作成") _
 .Cells(i, 4).Value          ↑
                     Valueでは書式が反映されないので
  Next
 Next
End sub

.Valueでは書式が反映されないので 
コピペの部分を
    Sheets("問題作成").Cells(i, 1).Copy
   
    Sheets("漢字プリント").Select
   
    Sheets("漢字プリント").Cells(m, n).PasteSpecial
   
    Sheets("問題作成").Cells(i, 2).Copy
    Sheets("漢字プリント(高)").Cells(m, n + 1).PasteSpecial
 と変えたのですが、書式がコピペさせません。

そこでコピペの部分をマクロの記録通り、

    Sheets("問題作成").Select
    Cells(i, 1).Select
    Selection.Copy
    Sheets("漢字プリント").Select
    Cells(m, n).Select
    ActiveSheet.Paste
   
    Sheets("問題作成").Select
    Cells(i, 2).Select
    Selection.Copy
    Sheets("漢字プリント").Select
    Cells(m, n + 1).Select
    ActiveSheet.Paste
としたのですが、うまくいきません。

【18474】Re:コピー&ペーストについて
回答  Asaki  - 04/9/27(月) 22:57 -

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

↓こんな感じでもダメですか?
Sheets("問題作成").Cells(i, 3).Resize(, 2).Copy _
  Destination:=Sheets("漢字プリント").Cells(m, n).Resize(, 2)

他に、書式を設定しているマクロはありませんか?

【18475】Re:コピー&ペーストについて
発言  ponpon  - 04/9/27(月) 23:26 -

引用なし
パスワード
   ▼Asaki さん:
早速の回答ありがとうございます。
貼り付け先のセルが結合しているために、「結合されたセルの一部は変更できません」とのエラーがでます。
 印刷用の用紙をかねていますので、年、組、氏名等が途中にはいるので、セルを結合して問題を表示させています。
 書式を設定しているマクロは、あります。
 答えを表示させたり、消したりするために

Sub 答えあり()
  For n = 19 To 1 Step -2
   For m = 2 To 17 Step 15
    Sheets("漢字プリント").Cells(m, n + 1).Select
    Selection.NumberFormatLocal = "標準"
   Next
  Next
  For n = 19 To 1 Step -2
   For m = 2 To 17 Step 15
    Sheets("漢字プリント").Cells(m + 31, n).Select
    Selection.NumberFormatLocal = "標準"
   Next
  Next
  Range("A1").Select
End sub

Sub 答えなし()
   For n = 19 To 1 Step -2
   For m = 2 To 17 Step 15
    Sheets("漢字プリント").Cells(m, n + 1).Select
    Selection.NumberFormatLocal = ";;;"
   Next
  Next
   For n = 19 To 1 Step -2
   For m = 2 To 17 Step 15
    Sheets("漢字プリント").Cells(m + 31, n).Select
    Selection.NumberFormatLocal = ";;;"
   Next
  Next
  Range("A1").Select
End Sub

 これがいけないのでしょうか?
 読み仮名は、Selection.NumberFormatLocal = "標準"のときに表示させています。

 
>こんばんは。
>
>↓こんな感じでもダメですか?
>Sheets("問題作成").Cells(i, 3).Resize(, 2).Copy _
>  Destination:=Sheets("漢字プリント").Cells(m, n).Resize(, 2)
>
>他に、書式を設定しているマクロはありませんか?

【18476】Re:コピー&ペーストについて
回答  Asaki  - 04/9/28(火) 0:03 -

引用なし
パスワード
   ↓こうかな?
Sheets("問題作成").Cells(i, 3).Resize(, 2).Copy
Sheets("漢字プリント").Cells(m, n).Resize(2).PasteSpecial Transpose:=True
Application.CutCopyMode = False

書式ですが、何処かで
Bold=False
とかしているところはないのですよね?

【18477】Re:コピー&ペーストについて
発言  ponpon  - 04/9/28(火) 0:23 -

引用なし
パスワード
   ▼Asaki さん:
大変なことになってしまいました。14個のセルを結合して、縦書きに表示させているのが、すべてのセルがバラバラになり、横書きで7つずつすべての書式がペーストされました。確かに太字もそのままにペーストされていたのですが、これではちょっと困りますが、ヒントには成りそうです。
 背景色、フォントの色、フォントの大きさはペーストしなくてもよいのですが・・・今更いって申し訳ありません。

 PasteSpecialの引数や使い方をちょっと調べてみようと思います。   

>書式ですが、何処かで
>Bold=False
>とかしているところはないのですよね?

VBAで書式をいじっているところはありません。 

【18478】Re:コピー&ペーストについて
回答  Asaki  - 04/9/28(火) 0:32 -

引用なし
パスワード
   結合セルは、基本的には、マクロとあまり相性が良くありません。
できるなら使わないことですが、逆に、後から結合するのではダメでしょうか?

> 背景色、フォントの色、フォントの大きさはペーストしなくてもよいのですが・・・
↑こいつらは、書式で一括なので、バラでは出来ません。
先ず、値のみコピーしたあと、1文字ずつループして、
Boldにする必要がある文字のみ、Boldを設定する、
という方法も考えられますが、ちょっと微妙です。
太字をやめて、カッコで囲むなどして表現するのではダメでしょうか?
これなら、Valueでやり取りできます。

【18479】Re:コピー&ペーストについて
お礼  ponpon  - 04/9/28(火) 0:56 -

引用なし
パスワード
   ▼Asaki さん:
>結合セルは、基本的には、マクロとあまり相性が良くありません。
>できるなら使わないことですが、逆に、後から結合するのではダメでしょうか?
 ↑
思いつきませんでした。一番上のセルにコピペしてResizeでセルを選択して結合すればよいのですね。次の問題の時は、一番最初にセルをバラバラにして・・・・ 

>> 背景色、フォントの色、フォントの大きさはペーストしなくてもよいのですが・・・
>↑こいつらは、書式で一括なので、バラでは出来ません。
>先ず、値のみコピーしたあと、1文字ずつループして、
>Boldにする必要がある文字のみ、Boldを設定する、
>という方法も考えられますが、ちょっと微妙です。
          ↑
       これは、読み仮名の文字列の字数を取得して、一字ずつBoldかどうかを
      評価して、2番目がBoldなら貼り付け先の文字の2番目もBoldにする・・・      をループするのですか?(複雑になりそうですね。私には、ちょっと無理な      ようです。)
>太字をやめて、カッコで囲むなどして表現するのではダメでしょうか?
         ↑
        これも有効な手段だと思います。
  
>これなら、Valueでやり取りできます。

 いろいろとありがとうございました。
 今の段階では、とりあえず、かっこで囲む方法を採用し、残りの方法は、私にはちょっと無理なので、年 組 氏名の部分を画像で貼り付けるなどの方法をとり、セルをまず一つにして、もう一度”漢字プリント”シートを作り直してコピペを考え直してみたいと思います。

【18481】Re:コピー&ペーストについて
質問  ponpon  - 04/9/28(火) 10:34 -

引用なし
パスワード
   ▼Asaki さん:
>結合セルは、基本的には、マクロとあまり相性が良くありません。
>できるなら使わないことですが、逆に、後から結合するのではダメでしょうか?
 ↑
 この方法でやってみました。以下コードです。

   Sheets("漢字プリント(高)").Cells(m, n).Value = _
                 Sheets("問題作成").Cells(i, 1).Value
    ↑
  漢字の部分は、関係ないのでValueのままで

  Sheets("問題作成").Select
   Sheets("問題作成").Cells(i, 2).Copy
   Sheets("漢字プリント(高)").Select
   Sheets("漢字プリント(高)").Cells(m, n + 1).Select
   Selection.PasteSpecial Paste:=xlPasteAllExceptBorders, _
                          Operation:=xlNone
  Sheets("漢字プリント(高)").Cells(m, n + 1).Resize(14).Select
  Application.CutCopyMode = False
  With Selection
    .HorizontalAlignment = xlGeneral
    .VerticalAlignment = xlTop
    .Orientation = xlVertical
    .IndentLevel = 1
    .ReadingOrder = xlContext
    .MergeCells = True
  End With
 
 これでうまくいったのですが、セルを結合するたびに「選択範囲には複数のデータがあります。一つのセルとして結合すると………」という注意賀でます。20問作っているので20回出てきます。これがでなければバッチリなんですが。
これをでなくする方法はないのでしょうか?
よろしくお願いします。

【18482】Re:コピー&ペーストについて
回答  Asaki  - 04/9/28(火) 11:05 -

引用なし
パスワード
   Application.DisplayAlerts = False
'処理
Application.DisplayAlerts = True
のようにすればメッセージは表示されなくなりますが、
そもそも、メッセージが表示されるということは、結合する先頭のセル以外にも
何かデータが入っているということですよね?
結合すると、そこのデータはなくなってしまいますが、それは良いのですか?
良いのであれば、何故、そこに何かデータが入っているのでしょうか?

【18488】Re:コピー&ペーストについて
お礼  ponpon  - 04/9/28(火) 12:55 -

引用なし
パスワード
   ▼Asaki さん:
 ありがとうございました。
 希望道理のことができるようになりました。
 過去ログを調べずに投稿したので、前にもあったかもしれません。
 もし、そうだとしたら申し訳ありませんでした。

>Application.DisplayAlerts = False
>'処理
>Application.DisplayAlerts = True
>のようにすればメッセージは表示されなくなりますが、
  ↑
 望んでいたとおりになりました。
 
>そもそも、メッセージが表示されるということは、結合する先頭のセル以外にも
>何かデータが入っているということですよね?
  ↑ 
 セルの結合をばらしてみましたが、一番上のセルしかデータは入っていません。
 バラバラのままマクロを走らせても、一番上にしかデータは入りませんし、
 セルの結合は行われません。あれ………どうして?!。
 はじめから結合したままだと、予定通りの結果になります。

>結合すると、そこのデータはなくなってしまいますが、それは良いのですか?
>良いのであれば、何故、そこに何かデータが入っているのでしょうか?
  ↑
 一番上しかデータは入っていないので、関係ありませんが、
 どうしてこのようになるかは、理解できません。 

【18593】Re:コピー&ペーストについて
質問  ponpon  - 04/9/30(木) 19:14 -

引用なし
パスワード
    こんにちは。
 コピペについては、うまくいきました。ありがとうございました。
 漢字にする部分と送りがなのある部分ときちんと分けて表示することができました。
 疑問の残るところはありますが……
 
 ついでにといっては何ですが、乱数(重複なし)のことです。
ネット上で見つけた下記のコードですがどうも怪しいです。時々同じ数字がでるような気がするのです。
 
Sub rannsuu()
Dim i As Integer
Dim n As Integer
Dim stri(1 To 20) As String
Dim p As Integer
Dim t As Integer
Dim numtmp As String

For p = 1 To 20
t = 99
i = Int(Rnd * t) + 1
  If i < 10 Then
    stri(p) = "0" & i
  Else
    stri(p) = i
  End If
 numtmp = stri(p)

 Do While InStr(1, numtmp, stri(p)) > 0   'numtmpにstriが含まれてる間シャッフルを繰り返す
  i = Int(Rnd * t) + 1
  If i < 10 Then
    stri(p) = "0" & i 'この処理を行わないと完全にシャッフルにならないっぽい
  Else
    stri(p) = i
  End If
 Loop
Next
End Sub
 

 過去ログに(コレクションを使った方法)もあったのですが、

http://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=15434;id=excel

コレクションを理解していないためによくわかりませんでした。 

そこで、セルを使った方法を考えました。

Sub 乱数2()
  Dim rndNO As Integer
  Dim myRange As Range
  Dim hani AS Range
  Dim p As Integer
  Dim t As Integer

  For p = 1 To 20
   t = 30   
   Set myRange = Sheet4.Cells(p, 1)
   Set hani = myRange.CurrentRegion
      
   Randomize
   rndNO = Int(Rnd() * t) + 1  '1からtまでの乱数の発生
      
   Do Until WorksheetFunction.CountIf(hani, rndNO) < 2 '同じ数字が出たら、                                 違うまでループ
   rndNO(p) = Int(Rnd() * t) + 1
   myRange = rndNO

   Loop
  Next

End Sub

 バッチリだったのですが、ここまでできたら、シートを使わないで何とかならないものかと、配列を使って考えたのですが、

  Dim rndNO(1 To 20) As Integer
  Dim intNO As Integer
  Dim p As Integer
  Dim t As Integer

  For p = 1 To 20
   t = 30
   Randomize
   rndNO(p) = Int(Rnd() * t) + 1  '1からtまでの乱数の発生
   intNO = rndNO(p)

   Do Until rndNO(p) <> intNO '同じ数字がでたら、違うまでループ
               ↑
        ここの式が思いつかないしわからない。

   rndNO(p) = Int(Rnd() * t) + 1
   intNO = rndNO(p)
     
   Loop

   Next
 コレクションを勉強したらなんていわないで、この配列を使って何とかならないものでしょうか。
 rndNO(p)が、今まで作った配列の中にあるかないかを調べるような式や関数をどなたか教えていただけないでしょうか? このコードからは無理ならば、諦めてシートを使います。
 よろしくお願いします。

【18603】Re:コピー&ペーストについて
発言  ichinose  - 04/10/1(金) 10:05 -

引用なし
パスワード
   ▼ponpon さん、Asakiさん、おはようございます。

> バッチリだったのですが、ここまでできたら、シートを使わないで何とかならないものかと、配列を使って考えたのですが、
いくつか方法はあると思います。
1.配列の中身をループで調べる方法
 変数と変数の比較だから処理は速いですよ

2.Application.Match関数を使う方法
 配列にも使えます。但し、上限があります。

3.乱数を文字列として配列に格納する方法(Filter関数を使用する)


配列の数が5000ぐらいまでとして、2の方法を使用して・・・。

'==================================
Sub test()
  Dim rndNO(1 To 20) As Integer
  Dim intNO As Integer
  Dim p As Integer
  Dim t As Integer
  Randomize
  For p = 1 To 20
   t = 30
   intNO = Int(Rnd() * t) + 1  '1からtまでの乱数の発生

   Do Until IsError(Application.Match(intNO, rndNO(), 0)) '同じ数字がでたら、違うまでループ

   intNO = Int(Rnd() * t) + 1  '1からtまでの乱数の発生
   
    Loop
   rndNO(p) = intNO
   Next

  For i = 1 To 20
   Cells(i, 1).Value = rndNO(i)
   Next
End Sub


これは、トピック変えたほうがいいかもしれませんよ!!


>
>  Dim rndNO(1 To 20) As Integer
>  Dim intNO As Integer
>  Dim p As Integer
>  Dim t As Integer
>
>  For p = 1 To 20
>   t = 30
>   Randomize
>   rndNO(p) = Int(Rnd() * t) + 1  '1からtまでの乱数の発生
>   intNO = rndNO(p)
>
>   Do Until rndNO(p) <> intNO '同じ数字がでたら、違うまでループ
>               ↑
>        ここの式が思いつかないしわからない。
>
>   rndNO(p) = Int(Rnd() * t) + 1
>   intNO = rndNO(p)
>     
>   Loop
>
>   Next
> コレクションを勉強したらなんていわないで、この配列を使って何とかならないものでしょうか。
> rndNO(p)が、今まで作った配列の中にあるかないかを調べるような式や関数をどなたか教えていただけないでしょうか? このコードからは無理ならば、諦めてシートを使います。
> よろしくお願いします。

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