VBA初心者ですのでどうか詳しく教えてください。下記のマクロをエクセルで組んだのですが・・・

--------------------------------------------------------------------

Sub hideworksheets()

Worksheets("sheet1").Visible = False

End Sub




Sub ボタン_Click()

ActiveWindow.SelectedSheets.PrintOut Copies:=1
Sheets("sheet1").Select
ActiveWindow.SelectedSheets.PrintOut Copies:=1
Sheets("sheet2").Select
ActiveWindow.SelectedSheets.PrintOut Copies:=1
Sheets("sheet3").Select
ActiveWindow.SelectedSheets.PrintOut Copies:=1
Sheets("sheet4").Select
ActiveWindow.SelectedSheets.PrintOut Copies:=1

End Sub


------------------------------------------------------------

1.上記設定で"sheet5"という別シートにボタンを設置した場合、このボタンを実行すると、シート1~4のほかにシート5まで印刷されてしまいます。シート5を印刷したくない場合のVBAの記述について教えてください。

2.「Sub hideworksheets()

 Worksheets("sheet1").Visible = False

   End Sub」
  
の箇所で、シート1を非表示にしたいのですが、このマクロを実行時、「Sub ボタン_Click()」以下のマクロを実行しようとすると、「実行時エラー1004 worksheeクラスのselectメソッドが失敗しました」のエラーがでてしまいます。シート1を非表示にし、無事印刷のマクロを実行する為の記述を教えてください。

このQ&Aに関連する最新のQ&A

A 回答 (5件)

Sheet1は印刷する必要があると思って回答していました。


補足を見ると、Sheet1の表示、非表示にかかわらずSheet1は印刷の必要はないようなので簡単にしました。

補足がSheet2だけのことなのか分かりませんので Select Case の中で印刷範囲の設定、印刷、印刷範囲の解除をしています。

Sub 印刷test()
  Dim ws As Worksheet 'ワークシート

  For Each ws In Worksheets '全てのシートを調べる
    With ws
      Select Case .Name
        Case "Sheet2"
          .PageSetup.PrintArea = "A1:AB42"
          .PrintPreview
          .PageSetup.PrintArea = ""
        Case "Sheet3"
          .PrintPreview
        Case "Sheet4"
          .PrintPreview
      End Select
    End With
  Next
End Sub

蛇足ですが・・・・・・
Sheet2、Sheet3、Sheet4のみを印刷したいなら直接的に書いたほうが分かりやすいかもしれません。(下記)
また、PrintAreaの指定が固定であれば、シート上(印刷範囲の設定)で設定しておけばマクロの中で設定する必要はありません。
印刷範囲が変動する場合はマクロの中で自動的に設定したりします。マクロの実行のたびに印刷範囲を変更するとマクロの意味がなくなってしまいます。
1つのシートの印刷範囲を1種類にしておけば、そのシートの余白などの細かい印刷設定をシート上(プレビュー)で行えば、マクロ側ではほとんど設定する必要はありません。(今回はExcel2000です。同じでしょう)

Sub 印刷test2()
  With Worksheets("Sheet2")
    .PageSetup.PrintArea = "A1:AB42"
    .PrintPreview
    .PageSetup.PrintArea = ""
  End With

  With Worksheets("Sheet3")
    .PrintPreview
  End With

  With Worksheets("Sheet4")
    .PrintPreview
  End With
End Sub

最後に、マクロを記録した結果から不必要な箇所を除いたり、繰り返し処理、判定処理を組み込むようにすれば間違いが減り、分かりやすく短くなり、上達すると思います。
    • good
    • 0
この回答へのお礼

いろいろ教えていただきまして、ありがとうございました。
VBAを始めて、1週間がたちましたが、詳しく教えていただいたので
VBAの作成の方法がだいぶわかりました。本を読んでやっていたときは
さっぱりわかりませんでしたが、親切に教えていただいたおかげで助かりました
また、何か質問をする事がありかもわかりませんが、そのときはよろしくお願いします。

お礼日時:2002/01/11 18:55

少し書き換えてみました。

コメントを見てもらえば行っていることは分かると思います。

Excel97で動作確認しました。ご参考に。

Sub 印刷test()
  Dim ws As Worksheet 'ワークシート
  Dim PrintFlg As Boolean '印刷するかの判定

  On Error GoTo ErrorHandler 'エラー対応(非表示シート対応)

  For Each ws In Worksheets '全てのシートを調べる
    Select Case ws.Name
      '印刷したいシートは PrintFlg を True にする
      Case "Sheet1": PrintFlg = True
      Case "Sheet2": PrintFlg = True
      Case "Sheet3": PrintFlg = True
      Case "Sheet4": PrintFlg = True
      '上以外のシート名なら PrintFlg は False
      Case Else: PrintFlg = False
    End Select
    If PrintFlg = True Then ws.PrintPreview '今はプレビュー。PrintOutで印刷
  Next

  Exit Sub '終わり

ErrorHandler:
  'シートが非表示の場合
  If Err = 1004 Then
    ws.Visible = True '表示する
    ws.PrintPreview '今はプレビュー。PrintOutで印刷
    ws.Visible = False '非表示に戻す
  End If
  Resume Next '次の処理
End Sub

この回答への補足

もうひとつ、教えてください。よろしくお願いします。
---------------------------------------------------------------------
Sub 印刷test()
  Dim ws As Worksheet 'ワークシート
  Dim PrintFlg As Boolean '印刷するかの判定

  On Error GoTo ErrorHandler 'エラー対応(非表示シート対応)

  For Each ws In Worksheets '全てのシートを調べる
    Select Case ws.Name
      '印刷したいシートは PrintFlg を True にする
      Case "Sheet2": PrintFlg = True
      Case "Sheet3": PrintFlg = True
      Case "Sheet4": PrintFlg = True
      '上以外のシート名なら PrintFlg は False
      Case Else: PrintFlg = False
    End Select
    If PrintFlg = True Then ws.PrintPreview '今はプレビュー。PrintOutで印刷
  Next

  Exit Sub '終わり

ErrorHandler:
  'シートが非表示の場合
  If Err = 1004 Then
    ws.Visible = True '表示する
    ws.PrintPreview '今はプレビュー。PrintOutで印刷
    ws.Visible = False '非表示に戻す
  End If
  Resume Next '次の処理
End Sub
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
上記のマクロに下記のマクロを書き込みたいのですが教えてください

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Sub printappointedrange()

Worksheets("Sheet2").Activate
Range("A1:AB42").Select 'セル範囲の選択

With ActiveSheet
.PageSetup.PrintArea = Selection.Address '印刷範囲の指定
.PrintOut '印刷
.PageSetup.PrintArea = False '印刷範囲のクリア
End With

End sub
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

補足日時:2002/01/10 20:16
    • good
    • 0

#2以外の方法です



On Error Resume Next

Sheets("sheet1").PrintOut Copies:=1
Sheets("sheet2").PrintOut Copies:=1
Sheets("sheet3").PrintOut Copies:=1
Sheets("sheet4").PrintOut Copies:=1

という方法です。
On Error Resume Nextでエラーとなっても強制的に次のステートメントを実行します。
あまり勧めれませんが・・・
    • good
    • 0

2.への回答です



If Worksheets("sheet1").Visible = True Then
 Sheets("sheet1").Select
 ActiveWindow.SelectedSheets.PrintOut Copies:=1
End If
If Worksheets("sheet2").Visible = True Then
 Sheets("sheet2").Select
 ActiveWindow.SelectedSheets.PrintOut Copies:=1
End If
    :

こんな感じでしょうか?
    • good
    • 0

1)


ActiveWindow.SelectedSheets.PrintOut Copies:=1 ←これを消せば良いです。
Sheets("sheet1").Select
ActiveWindow.SelectedSheets.PrintOut Copies:=1
Sheets("sheet2").Select
ActiveWindow.SelectedSheets.PrintOut Copies:=1
Sheets("sheet3").Select
ActiveWindow.SelectedSheets.PrintOut Copies:=1
Sheets("sheet4").Select
ActiveWindow.SelectedSheets.PrintOut Copies:=1
Sheets().selectで、それぞれのシートをアクティブにして、
Active…でアクティブなシートを印刷してますので、最初のシート5の状態で印刷している部分が不要でしょう。

2)
非表示なのでシートを選択できないのが原因ではないでしょうか。
ちょっと回避策はすぐには浮かばないです。
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qクラスを作るとメソッドの数が多くなりすぎる

クラスを作ると,たいがい,メソッドの数が多くなりすぎて,メソッドをさがすのに一苦労します.

なにか,クラスのメソッドの設計でいい方法はないでしょうか?

メソッドが増えすぎる原因として,

・フィールド変数1つにつき,取得メソッド,設定メソッドで(最大)2つ必要.

ということがあります.
あと,

・private のメソッド(クラス内部でよく使われる手続きをまとめたもの)が結構必要.
・private のメソッドから呼び出す private のメソッドが結構必要.

ということがありますが,publicメソッドがこれらのメソッドと紛れてしまう,ということがあります.

Aベストアンサー

>> 4.privateメソッドの一番外側のメソッドをprotectedにしてそれ
>> を内部クラスかスーパークラス化し、コーディングが頻繁に発生
>> する部分のメンテナンス性を向上させる。
>私の基本的知識不足で完全に理解しきれないのですが,
>非常に役に立ちそうなテクニックのような予感がします.

たとえば doSomething() というpublicメソッドが、doMiddle()というprivateメソッドを呼んでいて、なおかつさらにdoBase()というprivateメソッドが呼ばれているとします。もちろんdoBase()の下にいくつも下位メソッドがあっても構いません。

最初はdoSomething()だけでよかったのが、仕様変更の積み重ねでdoAdd1() doAdd2()と増えていき、そのたびにdoMiddle()に変更が頻繁に発生するがdoBase()は特に変わらないという場合に、メンテしたいのはdoMiddle()だけなので、doBase()はそのクラスの中に実装されている必要はないので、doBase()をprotectedメソッドとした配下ロジックを継承元クラスとして、クラス分けすることができます。

実際にはこんな簡単なケースではないのですが、だいたいぐちゃぐちゃなプログラムというのは、ひとつのメソッドですべて解決しようとしていたり、ロジックが部品化されておらず何百行にわたるメソッドになっていたりします。

それをリファクタリングして、共通に使われる部分、個別で使われる部分の線引きをすれば、共通で使われる部分を継承元として、機能別に小さなクラス(またはメソッド)の集合となり、実際にはかなりの仕様変更に耐えることが多いです。

クラス数が増えることに難色を示す人がいますが、クラス数を増やさないといけないのは、それだけシステムに機能数が増えていることの現れなのです。

また混乱されている原因のうち、プログラマがシンプルに実装出来していない以外の問題として、たまにjavaを正しく理解していない設計者が実権(?)を握っていたりすると、継承回数を抑制したり、機能は減らさないのにメソッド数を抑制したりして実装プログラマや稼動後のメンテナンスプログラマに負担をしいている場合がありますね。

あとアジャイルについては、指摘された本は知りませんが、とにかく「シンプル」に「軽く」作ることですね。

>> 4.privateメソッドの一番外側のメソッドをprotectedにしてそれ
>> を内部クラスかスーパークラス化し、コーディングが頻繁に発生
>> する部分のメンテナンス性を向上させる。
>私の基本的知識不足で完全に理解しきれないのですが,
>非常に役に立ちそうなテクニックのような予感がします.

たとえば doSomething() というpublicメソッドが、doMiddle()というprivateメソッドを呼んでいて、なおかつさらにdoBase()というprivateメソッドが呼ばれているとします。もちろんdoBase()の下にいくつも下位メソ...続きを読む

Q=IF(Sheet1!MX9="", "",Sheet1!MX9) で表した結果に条件付き書式を

こんにちは、エクセル2010を使っています。

A1セル
=IF(Sheet1!MX9="", "",Sheet1!MX9) B1セル =IF(Sheet1!MY9="", "",Sheet1!MY9)
と数式が入っていて、結果が 29% 36% などとなって居ます。

このセルに、【30%以上の場合は】と条件を与えても動作するどころか空白まで全てに条件が適用されてしまいます。

これを通常通り条件付き書式を与えるにはどうしたら良いでしょうか。

詳しい方、よろしくお願いいたします。

Aベストアンサー

少し面倒ですが、現状のA1、B1の計算式を変えない方法として
条件付き書式をいじってみては?

A1を選択して 条件付き書式 → 新しいルール → 数式を使用して、書式設定するセルを決定 を選択
下部に表示されたテキストボックスに、
=VALUE(A1)>=0.3 (0.3は30%の意)
と入力、設定したい書式を選択して設定する

あとは、A1のセルをコピー、B1に書式のみ貼り付けでOK

QFinalyメソッドを2回呼べとはどういうことですか?

ガーベージコレクション(FinalyとDispose)の疑問です。

Finalyメソッドを2回呼べとはどういうことですか?

本にはこう書いています。

Disposeメソッドを呼び出すとき、ガーベージコレクションがFinalizeメソッドを呼び出すので合計2回実行される。
クラスフィールドによって、クライアントがDisposeメソッドを2回呼び出しても何も実行しないようにする必要がある。

Finalyメソッドが定義されているオブジェクトをマネージヒープから削除するには、
最低でももう1回はガーベージコレクションを実行しなければならない。
これは、Finalyメソッドによって、現在のオブジェクトがグローバル変数に代入される可能性があるからだ。


Dispseメソッド 2回呼んだらダメ クラスフィールドで回避

Finalyメソッド 2回呼べ     ・・・対応方法不明・・・


Finalyメソッドを2回呼べとはどうしろといっているのですか?

Aベストアンサー

そもそもFinalyメソッドなどと言うものが,.NET Frameworkの標準のライブラリには存在しません。
たまたま,その本のコードでFinalyというメソッドを作っていて,それの実装についての説明か何かなのではないでしょうか。

QExcel でシート間の重複データ(Sheet1のA=Sheet2のA かつ Sheet1のB=Sheet2のB)

Excel2000です。

Sheet1のA列・B列・C列・・・にデータが入っています。
Sheet2のA列・B列・C列・・・にデータが入っています。

Sheet1のA列とSheet2のA列は、似たようなデータが入っています。
Sheet1のB列とSheet2のB列も、同様です。
C列以降のデータは、シート間で全然関係ありません。

Sheet1の行データ(A列・B列)が、Sheet2(A列・B列)にも存在しているかどうか、
を知るには、どうすればよいですか。
C列以降の列のデータは、比較する際に使いません。

つまり、
Sheet1のA = Sheet2のA
かつ
Sheet1のB = Sheet2のB
であるような行を知りたいのですが、

どうすればよいのでしょうか。

Aベストアンサー

Sheet1、Sheet2 ともに空いている列に =A1&B1 のような連結データを作り、Matchなどで比較するとか、、、

Sheet1 の E1 =A1&B1
Sheet2 の E1 =A1&B1
Sheet1 の F1 =MATCH(E1,Sheet2!E:E,0)

Q関数とメソッドの違い

初歩的な質問なのですが、
関数とメソッドの違いが分からず悩んでいます。
書籍や人によって、
関数とメソッドは同じ物として書いている物もあれば、
メソッドはクラスに関連付いた関数としていたり、
クラスでもpublic関数だけとか、
引数のある物がメソッド、
逆に無い物がメソッド等々…で、
どれが正しいのか良く分からないのです。

関数とメソッドの違いを教えていただけますよう、
お願いいたします。

Aベストアンサー

正解だけ先に言っておきましょう。オブジェクト指向での定義は
「メソッドとは、オブジェクトに送られてきたメッセージを処理するモノ」
「関数とは、メソッドの実装」
ついでに、
「メッセージとは、オブジェクトに何かしらお願いするために送られるモノ」
です。メッセージとメソッドと関数は明確に違うのですよ。


上記の通りなんですが、質問の文について、なにが正しいか、という解答は「文脈による」としか言いよ
うが無いんです。
解説書の一部分だけ抜き出して考えるのは非常に危険な行為です。
文脈を色々変えてみます。例えばオブジェクト指向の話をしているとしたら、

>1. 関数とメソッドは同じ物として書いている物もあれば、
バツ。意味的に全く異なります。
'\0'と""とNULLと0くらい違います。等価なんていってしまったら石が飛びます。(私が投げます:-p)

> 2.メソッドはクラスに関連付いた関数としていたり、
サンカク。C++での実装はそうでしょうが、オブジェクト指向を考える上で、その考え方は危険です。

> 3.クラスでもpublic関数だけとか、
> 引数のある物がメソッド、
> 逆に無い物がメソッド等々…で、
バツ。引数の数でメソッドで無くなる?そんなバカな!
例えprivateでもメソッドですよ。


オブジェクト指向言語C++のことを考えよう!という文脈ならば、
1.サンカク。実装は確かにそうなってます。ですが、上記の通り意味的に違うんです。
2.○。C++において、メソッドは「クラスに関連ついた関数」として実装されてます。
3.そんなわけないでしょう。

オブジェクト指向?なにそれ?構造体に関数がくっついただけでしょ?と乱暴極まりない文脈なら、
1.○。当然!
2.なにいってるの?
3.サブルーチンとファンクションの違いだ!


と、文脈で全然変わるんですよ。これに関しては、本一冊だけだとなかなか気付きにくいです。
是非とも多数の本を読み比べることをお勧めします。

正解だけ先に言っておきましょう。オブジェクト指向での定義は
「メソッドとは、オブジェクトに送られてきたメッセージを処理するモノ」
「関数とは、メソッドの実装」
ついでに、
「メッセージとは、オブジェクトに何かしらお願いするために送られるモノ」
です。メッセージとメソッドと関数は明確に違うのですよ。


上記の通りなんですが、質問の文について、なにが正しいか、という解答は「文脈による」としか言いよ
うが無いんです。
解説書の一部分だけ抜き出して考えるのは非常に危険な行為です...続きを読む

QPrivate Sub Worksheet_Calculate()のことでお聞きします

いつもgooの皆さんに大変お世話になっております
マクロの勉強を初めて2ヶ月の者です

Private Sub Worksheet_Change(ByVal Target As Range)にマクロを書いているのですが
「特定のセル範囲が変更されたときに処理を実行する」は分かるのですが
特定のセル範囲が変更されなくても、例えば、セルの値がインストールされているアドインで
変化した時の処理はどこに書いたらいいのでしょうか?

今現在、H列のTarget.RowとJ列のTarget.Rowにはアドインで、機器の温度が表示されていますが
この2点の温度変化で
Application.Speech.Speak "温度接近", True
などどやりたいのですが、Private Sub Worksheet_Calculate()に書けばいいのでしょうか
その場合、Private Sub Worksheet_Change(ByVal Target As Range)内の
Target.Row等の値はどうやったらPrivate Sub Worksheet_Calculate()で使えますか?
それとも、もしかしたら標準モジュールに書くのでしょうか?

うまく説明できていませんが、どなたか教えてください

いつもgooの皆さんに大変お世話になっております
マクロの勉強を初めて2ヶ月の者です

Private Sub Worksheet_Change(ByVal Target As Range)にマクロを書いているのですが
「特定のセル範囲が変更されたときに処理を実行する」は分かるのですが
特定のセル範囲が変更されなくても、例えば、セルの値がインストールされているアドインで
変化した時の処理はどこに書いたらいいのでしょうか?

今現在、H列のTarget.RowとJ列のTarget.Rowにはアドインで、機器の温度が表示されていますが
この2点の...続きを読む

Aベストアンサー

こんばんは。

今回の質問は、ご質問者さんには、別のイベントというか、紹介しましたね。その中に含まれていたかもしれません。

今回の件は、マクロを勉強して2ヶ月の人の話ではなく、3年やっても、5年やっても知らない人は知らないことで、かなりハイレベルというか、古めかしいというか、ほとんど知られていない技術だと思います。こういう話は、1冊の本にもなっています。本来、計測メーカー側の専門業者に頼んでしまったほうが早い気もします。たぶん、彼らは、公表はしていませんが、それ専用のVBA用のマクロを持っているはずです。

>特定のセル範囲が変更されなくても、例えば、セルの値がインストールされているアドインで
>変化した時の処理はどこに書いたらいいのでしょうか?

ふつうは、どこでもよいので、
=Now()
という式を書いて、
Private Sub Worksheet_Calculate()
に、イベントを拾わせるわけです。
しかし、少し、工夫が必要で、時々、これが困った動きをします。

Calculate のイベントが、ワークブック全体に働いてしまい、どこのシートを使っても、Calculateイベントが動いてしまいます。この方針で話が本格的になった時に、この対処法は、あらためて紹介します。

>(Worksheet_Change)のTarget.Row等の値はどうやったらPrivate Sub Worksheet_Calculate()で使えますか?

単に、モジュール変数を使って橋渡しするのか、それとも、同時で働くということなら、 Worksheet_Calculateのイベントでなくてもよいはずです。どのように使うのか、こちらではわかりかねます。本来、別の働きをするものです。もちろん、キーで入力した際は、Worksheet_Calculateのイベントは、起動します。

>Application.Speech.Speak "温度接近", True
>などどやりたいのですが、Private Sub Worksheet_Calculate()に書けばいいのでしょうか

ActiveX コントロールで入ってきた値が、どのように加わっていくのかにもよりますが、セルの位置は、Worksheet_Changeイベントのようにセルの位置は感知しませんから、インプットの場所が動いていくのでしたら、マクロで最後尾を探さなくてはなりません。

>それとも、もしかしたら標準モジュールに書くのでしょうか?
同様のコマンドで、標準モジュールに書く方法もあります。とても古い方法で、オブジェクト・ウィンドウにも出てこないはずです。しかし、まだ、同様の働きはしますが、今は、シートモジュールが主流になっています。

こんばんは。

今回の質問は、ご質問者さんには、別のイベントというか、紹介しましたね。その中に含まれていたかもしれません。

今回の件は、マクロを勉強して2ヶ月の人の話ではなく、3年やっても、5年やっても知らない人は知らないことで、かなりハイレベルというか、古めかしいというか、ほとんど知られていない技術だと思います。こういう話は、1冊の本にもなっています。本来、計測メーカー側の専門業者に頼んでしまったほうが早い気もします。たぶん、彼らは、公表はしていませんが、それ専用のVBA用の...続きを読む

Qメソッド宣言内でクラス名が書かれる理由

public static void main(String arg[]){

上記は、メソッド宣言ですが、このメソッド宣言の中に書かれているStringは、「標準クラスの1つ」だと聞いています。(標準クラスの意味さえ僕はわかりませんが、、参考書に書かれてあるのを見てもチンプンカンプン)

何故Stringは標準クラスの1つなのに、メソッド宣言の中に書かれているんですか?

質問1:私の仮説では、メソッドがどこのクラスに属するかを明示するためにメソッド宣言内にStringが書かれていると考えてます。それでよろしいですか?

質問2:メソッド宣言とは本質的にどういうことですか?プログラミング初心者の僕でもわかるように解説お願いします。

Aベストアンサー

public static void main(String arg[]){

は、main というメソッドを定義し、
そのmainメソッドは Stringクラスのインスタンスの配列を引数として得る、
ということを示しています。

( ) の中はそのメソッドが呼ばれたときに受け取る引数を定義しています。

main はすこし特殊で、実際には、この場合は
C:> java program a b c d
と実行されたときに
arg[0] = "a"
arg[1] = "b"
arg[2] = "c"
arg[3] = "d"
と代入されます。
これをmainメソッド内で使うわけですね。

質問1:
ですので、その仮説はまちがってます。
class SampleClass {
public int func(int x, int y) {
return x + y;
}
}
と書いてあったとすれば
メソッド func が クラス SampleClass に属することになります。
そして メソッド func は 引数として x と y を受け取ることになります。

まぁ、つまり、質問者様は 引数 という概念をまだ知らないだけ
ということです。

質問2:
たぶん、他のプログラミング言語もご存知ないのでしょう。
メソッドとは、そのクラス、またはクラスより作られたインスタンス(オブジェクト)
に対する操作である・・・
と、ではわかりませんよね?

人 というクラスを作ったとします。
人クラスから実際のオブジェクトの山田太郎を作りました。
人 山田太郎 = new 人("山田太郎");

山田太郎さんに名前を聞いてみましょう。

山田太郎.名前を教えて();

この"名前を教えて"の部分がメソッドになります。

多少御幣はありますが、
要は
そのクラス、またはオブジェクトに対する操作(命令)がメソッドです。
その命令を作ることがメソッドの宣言です。

命令には補助的な情報が必要な場合があります。

山田太郎.行け("学校");

というふうに行けという命令に、具体的にどこへ、という補助的な情報が必要ですよね。
この"学校"の部分が 引数 というものになります。

main(.....)
の括弧の中はそのメソッドがどんな引数を得るのか、
ということを表現しているのです。

public static void main(String arg[]){

は、main というメソッドを定義し、
そのmainメソッドは Stringクラスのインスタンスの配列を引数として得る、
ということを示しています。

( ) の中はそのメソッドが呼ばれたときに受け取る引数を定義しています。

main はすこし特殊で、実際には、この場合は
C:> java program a b c d
と実行されたときに
arg[0] = "a"
arg[1] = "b"
arg[2] = "c"
arg[3] = "d"
と代入されます。
これをmainメソッド内で使うわけですね。

質問1:
ですので、その仮説はまちがって...続きを読む

QExcel2013 VBA sheet1とsheet2のデータを合成してsheet3を作るには

sheet1に氏名、sheet2にその氏名の人の趣味が入っています。

新たにsheet3を作成して、
氏名1
趣味
氏名1

氏名2
趣味
氏名2

氏名3
趣味
氏名3

氏名4
趣味
氏名4

としたいです。
VBAのコードを教えて下さい。

例えば
①sheet1には
A1;1 B1;阿部 C1;あべ
A2;2 B2;佐藤 C2;さとう
A3;3 B3;山名 C3;やまな
A4;4 B4;山本 C4;やまもと

②sheet2にはその人の趣味が入っています。

A1;1  B1;釣り C1;つり
A2;空白 B2;踊り C2;おどり
A3;空白 B3;歌 C3;うた

A4;2  B4;読書 C4;どくしょ
A5;空白 B5;野球 C5;やきゅう


A6;3 B6;映画鑑賞 C6;えいがかんしょう

A7;4  B7;釣り C7;つり
A8;空白 B8;踊り C8;おどり
A9;空白 B9;歌 C9;うた

③sheet3を新に作成して

A1;1 B1;阿部 C1;あべ
A2;空白  B2;釣り C2;つり
A3;空白 B3;踊り C3;おどり
A4;空白 B4;歌 C4;うた
A5;空白 B5;阿部 C5;あべ

A6;2 B6;佐藤 C6;さとう
A7;空白 B7;読書 C7;どくしょ
A8;空白 B8;野球 C8;やきゅう
A9;空白 B9;佐藤 C9;さとう

A10;3 B10;山名 C10;やまな
A11;空白 B11;映画鑑賞 C11;えいがかんしょう
A12;空白 B12;山名 C12;やまな

A13;4 B13;山本 C13;やまもと
A14;空白  B14;釣り C14;つり
A15;空白 B15;踊り C15;おどり
A16;空白 B16;歌 C16;うた
A17;空白 B17;山本 C17;やまもと



のようにしたいです。

実際、データは、sheet1は419列、sheet2は2563列あります。

sheet1に氏名、sheet2にその氏名の人の趣味が入っています。

新たにsheet3を作成して、
氏名1
趣味
氏名1

氏名2
趣味
氏名2

氏名3
趣味
氏名3

氏名4
趣味
氏名4

としたいです。
VBAのコードを教えて下さい。

例えば
①sheet1には
A1;1 B1;阿部 C1;あべ
A2;2 B2;佐藤 C2;さとう
A3;3 B3;山名 C3;やまな
A4;4 B4;山本 C4;やまもと

②sheet2にはその人の趣味が入っています。

A1;1  B1;釣り C1;つり
A2;空白 B2;踊り C2;おどり
A3;空白 B3;歌 ...続きを読む

Aベストアンサー

こんばんは!

Sheet3にSheet1のデータを二度表示させるのがイマイチ理解できませんが、
ご質問通りにやってみました。

Sub Sample1()
Dim i As Long, lastRow As Long, myCnt As Long
Dim c As Range, wS1 As Worksheet, wS2 As Worksheet
Set wS1 = Worksheets("Sheet1")
Set wS2 = Worksheets("Sheet2")
Application.ScreenUpdating = False
wS2.Rows(1).Insert
wS2.Range("D:D").Insert
With Worksheets("Sheet3")
.Cells.ClearContents
lastRow = wS2.Cells(Rows.Count, "B").End(xlUp).Row
Range(wS2.Cells(2, "D"), wS2.Cells(lastRow, "D")).Formula = "=IF(A2="""",D1,A2)"
For i = 1 To wS1.Cells(Rows.Count, "A").End(xlUp).Row
With .Cells(Rows.Count, "B").End(xlUp).Offset(1)
.Value = wS1.Cells(i, "B")
.Offset(, -1) = wS1.Cells(i, "A")
.Offset(, 1) = wS1.Cells(i, "C")
End With
Set c = wS2.Range("A:A").Find(what:=wS1.Cells(i, "A"), LookIn:=xlValues, lookat:=xlWhole)
If Not c Is Nothing Then
myCnt = WorksheetFunction.CountIf(wS2.Range("D:D"), wS1.Cells(i, "A"))
.Cells(Rows.Count, "B").End(xlUp).Offset(1).Resize(myCnt, 2).Value = _
c.Offset(, 1).Resize(myCnt, 2).Value
End If
'▼
.Cells(Rows.Count, "B").End(xlUp).Offset(1).Resize(, 2).Value = _
wS1.Cells(i, "B").Resize(, 2).Value
'▲
Next i
.Rows(1).Delete
wS2.Rows(1).Delete
wS2.Range("D:D").Delete
Application.ScreenUpdating = True
.Activate
End With
MsgBox "完了"
End Sub

※ コード内の▼から▲までがもう一度Sheet1のデータを表示させているコードです。
細かい検証はしていませんが、
こんな感じではどうでしょうか?m(_ _)m

こんばんは!

Sheet3にSheet1のデータを二度表示させるのがイマイチ理解できませんが、
ご質問通りにやってみました。

Sub Sample1()
Dim i As Long, lastRow As Long, myCnt As Long
Dim c As Range, wS1 As Worksheet, wS2 As Worksheet
Set wS1 = Worksheets("Sheet1")
Set wS2 = Worksheets("Sheet2")
Application.ScreenUpdating = False
wS2.Rows(1).Insert
wS2.Range("D:D").Insert
With Worksheets("Sheet3")
.Cells.ClearContents
lastRow = ...続きを読む

Q【アクセス修飾子】アクセス修飾子無しのクラスにpublicなメソッド

アクセス修飾子無しのクラスのメソッドにpublicを付ける意味がわかりません。

class MyClass {
 public void method() {}
}

例えばこのようなクラスがあったとします。
このクラスはアクセス修飾子無しで他のパッケージからはアクセス出来ない為、メソッドにpublicを付ける意味は無いと思うのですが、付けてもコンパイルは通ります。

何故なんだろう、と考えてみたのですが、例えばpublicなメソッドを持つpublicなクラスを継承し、そのメソッドをオーバーライドした時にメソッドにpublicを付けざるを得ない、あるいは、インターフェイス(暗黙的にメソッドにpublicが付く)を実装したときにメソッドにpublicを付けざるを得ない等、そういう場合に対応するための『遊び』みたいなものなのでしょうか?

御教授よろしくお願いします。

Aベストアンサー

> 例えばpublicなメソッドを持つpublicなクラスを継承し、そのメソッドをオーバーライドした時にメソッドにpublicを付けざるを得ない、あるいは、インターフェイス(暗黙的にメソッドにpublicが付く)を実装したときにメソッドにpublicを付けざるを得ない等、そういう場合に対応するための『遊び』みたいなものなのでしょうか?

『遊び』ではなく、実際にそのような形で外部のクラスに内部クラスのメソッド等を使わせるような場合に使用します。

例えば、java.util.zip.ZipFile#getInputStreamはInputStreamクラスを返しますが、実装では場合によりInputStreamクラスを継承した内部クラス(内部クラスなのでpublicは付いていない。private)を返します。
readメソッドはオーバーライドされ、独自の実装が加えられていますが、アクセス修飾子はpublicであるため、外部パッケージのクラスからもアクセスすることができます(通常のInputStreamと同じようにreadが出来る)。
詳しくは実際にソースを見て下さい。

> 例えばpublicなメソッドを持つpublicなクラスを継承し、そのメソッドをオーバーライドした時にメソッドにpublicを付けざるを得ない、あるいは、インターフェイス(暗黙的にメソッドにpublicが付く)を実装したときにメソッドにpublicを付けざるを得ない等、そういう場合に対応するための『遊び』みたいなものなのでしょうか?

『遊び』ではなく、実際にそのような形で外部のクラスに内部クラスのメソッド等を使わせるような場合に使用します。

例えば、java.util.zip.ZipFile#getInputStreamはInputStream...続きを読む

Qsheet1(1月)からsheet12(12月)をsheet13(H17年度)に集計したい

sheet1(1月)
A   B  C
1 得意先  銀行  金額
2 aa社 xx 50
3 cc店 yy 30
4 ee社 xx 20

sheet2(2月)
  A B C
1 bb zz 50
2 ee xx 30
3 cc yy 50
4 dd ww 30

目的のsheet
sheet13(H17年度)
A     B    C    D
1 得意先  1月   2月   3月
2 aa社   50  
3 bb社 50
4 cc社 30 50
5 dd社 30
6 ee社 20 30

Aベストアンサー

元ファイルをシート分けせずに、月フィールドを作って整理し
ピポットテーブルを使えば一発です。

得意先銀行金額月
aaxx501月
ccyy301月
eexx201月
bbzz502月
eexx302月
ccyy502月
ddww302月

としておき、ピポットテーブルで
行:得意先、列:月、データ:合計/金額とすればよいでしょう


人気Q&Aランキング

おすすめ情報