Excel VBA質問箱 IV

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

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


246 / 3841 ページ ←次へ | 前へ→

【77519】Re:マクロの繰り返し
発言  マナ  - 15/10/18(日) 12:56 -

引用なし
パスワード
   ▼もでぃ さん:

必要な部品としては下記のような感じです

1)A列の最終行セルを求めるマクロ
2)A列の2行めから最終行セルまで繰り返すマクロ
3)A列の4つ右のセル(E列)、5つ右のセル(F列)の値を取得するマクロ
4)A列の6つ右のセル(G列)に値を入れるマクロ
・ツリー全体表示

【77518】マクロの繰り返し
質問  もでぃ  - 15/10/18(日) 11:26 -

引用なし
パスワード
   次のようなコードを作成しました。

Sub sample()
If Range("E2").Value = "有" Or Range("F2").Value = "有" Then
Range("G2").Value = "有"
Else
Range("G2").Value = ""
End If
End Sub

E2セルかF2セルのどちらかに「有」という文字があれば
G2セルに「有」という文字を入れるというものです。

これを「A列の最終行(文字がある行)」まで繰り返し行いたいのですが
やり方がわかりません。

別の言い方をすれば

このシートのE列もしくはF列に「有」があれば
同じ行のG列に「有」をいれる

という意味合いです。

ただ、E列もしくはF列に「有」があったりなかったりしますので
必ず文字がある「A列」の文字があるところまで繰り返したいのです。

よろしくお願いします。
・ツリー全体表示

【77517】Re:参照渡しと値渡し
発言  γ  - 15/10/18(日) 8:59 -

引用なし
パスワード
   間に合いませんでした。

コメントはしますが、返事を求めるものではありません。

>そうでは無くメインルーチンが渡しを決めてサブルーチンを呼ぶことができることを知った
それは事実ではありません。

既に何度も説明がありましたが、
引数に余計なカッコをつけることで、
元の変数とは別の領域にクローンが作成され、
その参照が渡されているだけで、
元の引数の値が変化していないために、ByBalのように見えているだけです。
依然としてByRefであることに変わりはありません。

一方、ByValで定義されているプロシージャを、
呼び出し側でByRefと変更することもできません。
メインルーチン側で渡し方法を決めるなどということはできません。

>サブのほうで渡しを決めるのが基本的
"基本的"ではありません。
例外なく、プロシージャにおける定義に従っています。

呼出元が主導権を握ることができる、ないしコントロールができる、
という認識をお持ちのようですが、それでは、
ByValで定義されているプロシージャを、
ByRefとして機能するメイン側の呼び出し方があるのか、
考えてごらんになると良いでしょう。

---------------------
賄賂云々の譬えを申し上げたが、適切さを欠きました。
というのは、渡す側、受ける側に独立の人格があるような譬えだったからです。

メインプロシージャ、subプロシージャ、functionプロシージャ側に
独立の人格?など無く、各プロシージャーを厳格に定義し、それらを認識した上で、
プロシージャに実行の一部を委ねるのは、同一の主体でしかありません。
各プロシージャの定義を承知したうえで使っているのです。

あたかもそれぞれに意志があるかのような擬人化したモデルで、
コードの理解を図ろうとすると無理が生ずるのではないでしょうか。
・ツリー全体表示

【77516】Re:参照渡しと値渡し
お礼  Nobu10 E-MAIL  - 15/10/18(日) 7:19 -

引用なし
パスワード
   ありがとうございました。
・ツリー全体表示

【77515】Re:参照渡しと値渡し
発言  β  - 15/10/18(日) 6:27 -

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

こちらの掲示板では、↑の Nobu10 さんの【礼】マーク付の解決コメントで終了となります。
(別掲示板とは異なり、そのあとも、Nobu10さん含めて書きこみはできるのですが)
・ツリー全体表示

【77514】Re:負荷のなくシートないのデータを取得...
お礼  Show  - 15/10/18(日) 5:11 -

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

丁寧にサンプルと共に説明いただき、ありがとうございます。まだ、提示いただいたコードをまだ試していませんが、まずはお礼がてら返信しました。分からない部分があれば、また質問させてください。
・ツリー全体表示

【77513】Re:アドインタブにアドイン側からボタン...
回答  名無しのプログラマー  - 15/10/18(日) 0:18 -

引用なし
パスワード
   ▼独覚 さん:
>ここのサイトの基本方針から引用です。
>
>>マルチポストについて
>>別のサイト(掲示板)にまったく同じ目的の投稿をすることを、一般に「マルチポスト」といいます。
>>当質問箱では、マルチポストは原則認めています。
>>つまり、ほかのサイトで質問したことをこのサイトで質問してもかまわないということです。
>
>>しかし、もしマルチポストをするのなら、可能な限り「○○にも同じ質問を出しました」ということを宣言してください。
>>そして、仮に他のサイトで解決したのなら、ここにも必ずその顛末を書いてください。
>>質問しっぱなし、というのはモラルに反します。「解決したからいいや」というのではありません。
>
>>また、マルチポストを明示的に禁止しているサイトとのマルチポストをしてはいけません。
>
>ということですのでマルチポスト先の報告をお願いいたします。


ご指摘ありがとうございます。
今回エクセルの学校にも同じ質問を載せていただき無事解決致しました。
ありがとうございました。
・ツリー全体表示

【77512】Re:参照渡しと値渡し
お礼  Nobu10 E-MAIL  - 15/10/18(日) 0:01 -

引用なし
パスワード
   回答者の皆様、誠にありがとうございます。本を読むよりずっと理解が深まりました。
皆さんの回答を読み、私なりに理解した事はサブルーチンの方で渡し方を決めるのが一般的であると言っている、と思っていますが、私もそのことには異存は無く納得しています。しかし、そうでは無くメインルーチンが渡しを決めてサブルーチンを呼ぶことができることを知ったので、引数の渡し方はどのルーチンが決めるのかと疑問を持ったわけです。ちなみに、サブのほうで渡しを決めるのが基本的ということですよね。この点で(渡し)と言うより(受け)のほうが適しているのではないかと考えたわけです。
(渡し)については歴史的な用語としての使い方に名残があるようですので、特にこれ以上論議する必要がないと考え、この掲示板の項を解決済みで終了したいのですが、終了の仕方が分かりません。以前はやったのですが、すみません教えてください。
・ツリー全体表示

【77511】Re:呼び出し側で引数の渡し方を決めたい...
発言  ichinose  - 15/10/17(土) 21:41 -

引用なし
パスワード
   >Fortran の知識は全くないのですが、Val(b) というのが、もしかしたら
>b の値 ということで、テンポラリーに、メモリー域のどこかにセットされて、
>そのテンポラリー域を参照渡ししていたのではないでしょうか?
>VBAでも (a) とやると、a のクローンを(うけがわが byRef なら)参照渡ししているわけですので。

当時の私には、C言語プロジェクトの同僚から、Cは原則、値渡し と聞いていただけなので、内部の事など想像すらしませんでしたが、今 考えれば、そういうことなんでしょうねえ。


VBAで同じような環境でコードを書いてみれば、どちらがよいか結論がでそうなので
このような投稿をしましたが、
私の意見は、あくまでも 機能をもっている呼び出されるプロシジャーが
必要な引数の渡し方も決定するのがよい という意見です。
VBEは、便利なので
呼び出しを記述するときに 引数が 参照渡しか値渡しかわかるようになっていますしね!!

参照設定なしで 外部オブジェクトを使用するときに
安全のために値渡しでというなら 呼び出し時に (a) という使用方法は
分かる気がしますね!!

マニュアル調べろ と言われればそのとおりですが・・・・。
・ツリー全体表示

【77510】Re:呼び出し側で引数の渡し方を決めたい...
発言  β  - 15/10/17(土) 19:55 -

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

Fortran の知識は全くないのですが、Val(b) というのが、もしかしたら
b の値 ということで、テンポラリーに、メモリー域のどこかにセットされて、
そのテンポラリー域を参照渡ししていたのではないでしょうか?

VBAでも (a) とやると、a のクローンを(うけがわが byRef なら)参照渡ししているわけですので。
・ツリー全体表示

【77509】呼び出し側で引数の渡し方を決めたい理由
発言  ichinose  - 15/10/17(土) 19:42 -

引用なし
パスワード
   もう何年もやっていないので はっきりした記憶ではないですが、
Fortranは、このパラメータ渡しが参照渡しでした。

つまり、値渡しという概念がありませんでした。



call aaa(val(b))

と変数bをVal関数(ここがうろ覚え)で囲むことで値渡しで渡すことができました。


つまり、呼び出す側がパラメータの渡し方を指定していたのです。

参照渡しだけの仕様ですから、呼び出し先でパラメータがどのように使われるのか
心配だったのでしょうかねえ?

値を壊されたては、堪らない ということで値渡しの選択が出来たのでしょうか?


こんなことを考えていたら、VBAだって、一部の例外はありますが、

Option Explicit
Sub test()
  Dim a As Long
  Dim ans As Long
  a = 5
  足し算2を足す a, ans
  MsgBox ans
  a = 7
  足し算2を足す a, (ans)
  MsgBox ans
End Sub
'===========================================================
Sub 足し算2を足す(ByRef 数 As Long, ByRef 答え As Long)
  答え = 数 + 2
End Sub


このように呼び出されるプロシジャーでは、引数を参照渡しにして、

呼び出す側で (a) や a  という記述で

値渡しと 参照渡しを使い分けることができます。


これでいくつも実験してみて、

パラメータ渡しがどちらがよいか試してみては いかがですか?
・ツリー全体表示

【77508】Re:負荷のなくシートないのデータを取得...
発言  β  - 15/10/17(土) 17:37 -

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

もう1つ、シート上のセルの値をすべて1つの文字列として連結させるなら。

Sub Sample2()
  Dim r As Range
  Dim s As String
  
  Set r = Range("A1", ActiveSheet.UsedRange)
  
  r.Copy
  
  With CreateObject( _
   "new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}") 'Ms Forms x.x Object Linrary
    .GetFromClipboard    'クリップボードからDataObjectにデータを取得
    s = .GetText     'そのデータを取り込み
  End With
  
  Application.CutCopyMode = False
  
  s = Replace(Replace(s, vbTab, ""), vbCrLf, "")
  
  'ここで領域内のセルがすべて連結されて1つの文字列になっているので、その文字列に対して必要な処理を
  
End Sub
・ツリー全体表示

【77507】Re:負荷のなくシートないのデータを取得...
発言  β  - 15/10/17(土) 17:26 -

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

たとえば、シートの行単位に処理をすればいいということなら、以下のコードは
シートの行ごとに、その値を1つの文字列に連結するサンプルです。
列数にもよりますが、そんなに大きな負荷にはならないと思います。

Sub Sample()
  Dim v As Variant
  Dim s As String
  Dim i As Long
  
  v = WorksheetFunction.Transpose(Range("A1", ActiveSheet.UsedRange))
  
  For i = 1 To UBound(v, 2)
    s = Join(WorksheetFunction.Transpose(Application.Index(v, Evaluate("row(1:" & UBound(v, 1) & ")"), Array(i))), "")
    MsgBox s
    's に現在の行のセルの値が連結されているので、それに対する正規表現などによる処理をここで
  Next
  
End Sub
・ツリー全体表示

【77506】Re:負荷のなくシートないのデータを取得...
発言  β  - 15/10/17(土) 16:10 -

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

データの取り出しには、大小は別にして負荷はかかりますね。
セル領域をメモリーに取り込む際に、負荷を減らす効果が期待できる方法の1つが
配列に取り込みことだと思います。たとえば

Variant型変数 = Range("A1:Z1000").Value

こうすれば、瞬時に 26000セルの値が 1000行、26列の2次元配列に格納されます。

Variant型変数 = ActiveSheet.UsedRange.Value

こうすれば、シート上の使用領域の矩形部分が取り込まれます。

取り込んだ後は、メモリー内ですから、1つ1つ処理してもセルを直接参照するより
負荷が、ぐ〜んと減りますが、正規表現を使うなら、できるだけまとめて処理したほうが
よろしいですよね。

いろいろ手立てはあると思います。
2次元配列の各行を1次元配列にして Join関数で文字列にすることもできると思いますし
それこそ、2次元配列内の各要素を、いったん1次元配列に収めて、どさっとJoinしてやれば
1つの文字列になりますので、正規表現チェックも1回ですみますね。

ただ、この場合、該当の抽出部分が、どのセルだったかということをどう把握するか、ここが
工夫のしどころだと思います。

具体的な要件を説明されれば、皆さんからグッドアイデアが寄せられると思います。
・ツリー全体表示

【77505】Re:参照渡しと値渡し
発言  γ  - 15/10/17(土) 12:50 -

引用なし
パスワード
   こんにちは。
横合いから失礼します。
既に適切な指摘がございましたが、念のため追記します。

プロシージャを定義した段階で、参照渡し、値渡しのどちらにするかは
決める仕組みになっています。指定を書略したらByRefです。
呼び出す際に、それを承知して使うわけです。

貴兄の指摘のように、
> つまり(〜渡し)は呼出元ではなく呼出先プロシージャの主導権によって
> 決定されると言っていいのではないでしょうか。
どちらが主導権を持っているかというようなことではないと思います。

>つまり、ByRef、ByVarを書くべきところは呼出元であると思います。

VBAは、そういう設計の言語ではありません。(該当する言語例を知りません)
型の指定や、引数の引き渡しなどすべて、
呼び出されるプロシージャ側で一意的に定義するのが決まりです。

・呼び出す側で動的に変更することもできませんし、
・受ける側が、呼び出す側の指定に応じて、どんな呼び出し方にも対応できるとか、
そういう仕組みにはなっておりません。

プロシージャは複数箇所で何度でも呼び出すことが想定されますから、
呼び出す側で逐一指定しなければならないとしたら、
少なくとも、相当に記述効率が悪くなるでしょう。

いずれにしても、あなたがこれから言語を設計でもしようとしているなら、
そうした議論が有益かもしれませんが、
既にある言語のことを議論しているのでしょうから、
まずは、その言語のきまりを正確に理解することが大切だと思います。

もし言語設計をこう変えるべきだという議論をしたいのなら、
こうした場所は適切ではありません。(適切な場所も知りませんが)

------------------------
呼称の件にもふれましょう。

下世話な譬え話で恐縮ですが、
賄賂を渡す、受取るといった行為が世間には見られますね。

賄賂というものは、その効果、期待に関して、
両者にほぼ共通した認識があると言ってよいでしょう。
受け取る側がその性格を決めているわけでもなく、
渡す方もその効果を信じているからこそ、阿吽の呼吸で渡すのです。

そうした行為に対して、
賄賂を「受け取る」と呼ぶべきで、賄賂を「渡す」と呼ぶべきではない、
と主張されているようなもので、余り生産的な話でもなかろうと思います。
(いやあ、極端なたとえ話だったかも)

---------
ちなみに、別掲示板の件、拝見していた私も、βさんと同じ印象を持ちました。
ローカル変数というタイトルの別掲示板のご発言で、捨て台詞的に、
あなた方は間違っている? 私ならこう書く、と主張された件です。

もともと、適用するスコープを「広くする」にはどうするか、
というのが元記事なんですよ。
プロシージャレベル変数の説明が仮に不足してとしても、
それが致命的だとも思いません。
そこに重点があるわけではないからです。
プロシージャレベルの話はあくまで前段なのです。

にもかかわらず、あなたは、スコープを一番狭くしたときについての説明記述は、
こうあらねばならない、おかしい、と主張されたわけです。

主張された内容自体を単独で拝見すれば、誤字を除き概ねよいと思いますが、
記事を記載した側の気持ちを忖度すれば、
それはテーマが違うといったところかもしれません。
いずれにせよ、鬼の首でも取ったように主張することでもないと思います。
・ツリー全体表示

【77504】負荷のなくシートないのデータを取得する...
質問  Show  - 15/10/17(土) 12:34 -

引用なし
パスワード
   シート上にある全てのテキストを負荷を少なく取得する方法ってありますか?
行と列が膨大なファイルがあってできれば、Range で一つ一つ
セルごとにデータを集めるようなことをしたくありません。

目的は何かというと要するに、データの検索に正規表現を使いだけです。
似たようなデータが何行もあるので、検索するに時間がかかります。
正規表現を使っていくつかのキーを組み合わせることによって、
データ内をバックグラウンドでVBAコードで検索し、位置を割り出して、
目視で検索の負荷を減らすの目的です
・ツリー全体表示

【77503】Re:参照渡しと値渡し
発言  cai  - 15/10/16(金) 22:44 -

引用なし
パスワード
   >結果を見ればクーロンを渡していることになります。
クローンを参照渡ししていると考えたらどうでしょうか。
・ツリー全体表示

【77502】Re:参照渡しと値渡し
発言  ichinose  - 15/10/16(金) 18:42 -

引用なし
パスワード
   質問の意図を誤解していたようです。

>プロシージャを作成する技術的なものではなく、概念的なものです。知らなくてもプロシージャ作成にはあまり関係のないことだと思っています。
いいえ、そんなことはありません。プロシジャーやパラメータの意味を深めるには
大切だと思いますよ!!

>ByRef、ByVarを書くべきところは呼出元であると思います。

これは 違います。あくまでも呼出先です。




Sub 足し算2を足す(ByVal 数 As Long, ByRef 答え As Long)
  答え = 数 + 2
End Sub


上記のコードは、指定された数字に2を足した数を 返す という機能を持ちます よね?

入力データ 数  長整数型 値渡し
出力データ 答え 長整数型 参照渡し

足し算2を足す というプロシジャーが機能を遂行できるように
パラメータの性質を決めるのが 理屈だと思いませんか?


「数」という変数は、「足し算2を足す」というプロシジャーでは、参照さえできれば
良いので 値渡しであり、 「答え」という変数は、結果を格納するので
参照渡しのパラメータにする。

「足し算2を足す」というプロシジャーの機能に沿って パラメータを決めるのですよ!!


だから、現状の文法で良いのです。


Sub test1()
  Dim a As Long
  Dim b As Long
  a = 5
  b = 1
  Call 足し算2を足す(a, b)
  MsgBox b
End Sub


Sub test2()
  Dim a As Long
  Dim b As Long
  a = 5
  b = 1
  Call 足し算2を足す(a, (b))
  MsgBox b
End Sub


因みに test2では、参照渡し が 値渡しになっているように見えますし、
結果はおなじですが、メカニズムは、若干違いますよ!!


追伸

私は、Nobu10さんの質問や投稿内容 良いと思いますよ!!
少なくとも作成依頼の投稿に比べたら断然です。
比較することすら 失礼だと思うくらいです。
・ツリー全体表示

【77501】Re:参照渡しと値渡し
お礼  Nobu10 E-MAIL  - 15/10/16(金) 18:27 -

引用なし
パスワード
   いろいろと教えていただいて、ありがとうございます。自分でもつまらない質問だと思いますが、自分を納得させながら一歩一歩、歩んで行きたいと思います。これからもつまらない質問をすると思いますがよろしくお願いいたします。
・ツリー全体表示

【77500】Re:フィルター並べ替え後の検索
お礼  キキ  - 15/10/16(金) 17:50 -

引用なし
パスワード
   β様

ご回答頂きありがとうございます!
本日は退社してしまいました為、回答のお礼のみ先に返信させて頂きます。

来週月曜日に確認させていただきます^^
ありがとうございましたm(__)m
・ツリー全体表示

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