Excel VBA質問箱 IV

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

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


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

【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
・ツリー全体表示

【77499】Re:フィルター並べ替え後の検索
発言  β  - 15/10/16(金) 17:27 -

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

とりあえず。
M社は固定で。該当なしは3つの指定の結果がゼロ件ならメッセージ。

Sub Test()
  
  ActiveSheet.AutoFilterMode = False '念のためいったん解除
  ActiveSheet.Range("A1").AutoFilter  'オートフィルター設定
  
  With ActiveSheet.AutoFilter.Range
    .AutoFilter Field:=1, Criteria1:="M社"
    .AutoFilter Field:=2, Criteria1:="<>"
    .AutoFilter Field:=3, Criteria1:=">=" & Date, Operator:=xlAnd, Criteria2:="<=" & Date
    If .Columns(1).SpecialCells(xlCellTypeVisible).Count = 1 Then
      MsgBox "該当なし"
    End If
  End With

End Sub
・ツリー全体表示

【77498】Re:フィルター並べ替え後の検索
発言  β  - 15/10/16(金) 17:12 -

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

いくつか質問です。

1.M社は固定ですか?
  それとも、抽出したい業者を、何らかの手段で指定して抽出ですか?
2.該当なしですが
  日付(当日?)、業者、伝票の指定で抽出した結果としてゼロ件だったときに
  メッセージを出すのでいいのですか?
・ツリー全体表示

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

引用なし
パスワード
   mySub (a)をCall文で書くとCall mySub((a))になるとは知りませんでした。疑問をこの掲示板で立てたことで、私自身のVBAに対する理解が少し深まりました。誠にありがとうございます。私は沖縄在住の69歳のリタイア組です、ボケ防止のためにVBAの本を読んでプロシージャを組み、頭の体操をしています。何かを作る目的があるわけではなく、リタイアしていますので仕事で使おうとしているわけでもありません。ただ単に、本を読んで疑問に感じたことやもっと異なった視点から説明がほしい時に掲示板に立てているだけです。プログラム言語はVBAが初めてで、始めて3年ぐらいなります。そんな私が「君たちの理解は間違っている」なんて言える訳がありません。むしろ逆で私の主張のここがおかしいとか、間違っていると皆さんに指摘してもらいたいのです。そうする事で私のVBAの理解度を高めていきたいのです。しかし誤解が生じたと言うことは、私の文章が誤解を与える文章だったと言うことでしょう。以後気をつけてレスしたいと思います。私の疑問は今のところプロシージャを作成する技術的なものではなく、概念的なものです。知らなくてもプロシージャ作成にはあまり関係のないことだと思っています。つぎはキーワードについて疑問を主張したいと思います。皆さんよろしくお願いいたします。
・ツリー全体表示

【77496】フィルター並べ替え後の検索
質問  キキ  - 15/10/16(金) 16:52 -

引用なし
パスワード
   はじめまして、こんにちは。マクロ初心者です。
おわかりになる方がおられましたら、ご教授頂ければ幸いです。

題名が意味不明なものになってしまいましたが、処理したいことは以下の内容でございます。

●エクセルシート画面●
A列:業者名/B列:伝票番号/C列:商品納品日
各列にはそれぞれのデータが入っており、2000行近くあります。

●処理したい内容●
「1.→本日納品するものをC列の日付フィルターで指定
2.-1→A列にM社がある場合→M社をフィルターで指定
2.-1-1→B列に伝票番号の入力がある場合(空白以外の場合)→フィルターで空白以外を指定
2.-1-2→B列に伝票番号の入力がない場合(空白の場合)→ポップアップで<該当データはありません>と表示
2.-2→A列にM社がない場合、ポップアップで<該当データはありません>と表示

説明がわかりずらいようでしたら申し訳ございません。。

何卒よろしくお願い申し上げます。
・ツリー全体表示

【77495】Re:タイで実行するとエラーになります
お礼  とし  - 15/10/16(金) 16:15 -

引用なし
パスワード
   お世話になります。

ウッシさん。回答ありがとうございます。

>コントロールパネル → 時計、言語、および地域 → 地域と言語で開く
>ダイアログの管理タブの下側にある
>「Unicode 対応ではないプログラムの言語」は日本語になっていますか?

  →こちらもタイに確認を依頼してみます。ありがとうございます。
・ツリー全体表示

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