Excel VBA質問箱 IV

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

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


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

【81399】Re:表の比較
発言  T-K  - 20/7/15(水) 23:57 -

引用なし
パスワード
   配列を表に入れるこのプログラムは、教えていただいた
ものです。私が作成したものではありません。

出力用に既定の表があり、その表の行(商品データ)と列(日付)の&値をDictinaryのKeyとして
行と列の交差している値(注文数)とその値の入力されているアドレスをItemとして
Dictionaryに登録しているようです。
Hashテーブルという既定の機能を利用しているようですが、
アドレスを利用してどのようにコンピュータがそれを解釈しているかは
いまだにイメージできていません。そのようなものとおもっていまもつかっっています。
配列にはそのような機能はないようです。
プログラムを作成していただいて感謝しますが、
処理速度が遅いようであれば、現状と変わらないため参考までとさせていただきます。Matchで照合しているようですが、少しむずかしいです。
とりあえず調べてみます。
・ツリー全体表示

【81398】Re:表の比較
発言  マナ  - 20/7/15(水) 21:40 -

引用なし
パスワード
   ▼T-K さん:

処理速度には、期待しないでください。
あくまで、配列の勉強が目的です。

>一番の理由は、配列を理解するため。
・ツリー全体表示

【81397】Re:表の比較
発言  マナ  - 20/7/15(水) 21:04 -

引用なし
パスワード
   ▼T-K さん:

dictionaryについて質問してもよいですか。
なぜ、配列を登録しているのでしょう。
アドレスだけではだめなのでしょうか。

>fDic(com & dt) = VBA.Array(c.Value, c.Address(External:=True))
・ツリー全体表示

【81396】Re:表の比較
発言  マナ  - 20/7/15(水) 21:02 -

引用なし
パスワード
   ▼T-K さん:

無理矢理、配列を使ってみました。
たぶん、直接セルに数式を埋め込んで、
計算後に値に変換のほうがよいと思います。
色付けは、条件付き書式で対応してください。

Sub test()
  Dim tbl As Range
  Dim v
  Dim j As Long, k As Long
  Dim mX, mY

  Set tbl = Sheets("Sheet1").Range("A1").CurrentRegion
  
  With Sheets("Sheet2").Range("A1").CurrentRegion
    v = .Value
    For j = 2 To UBound(v, 1)
      For k = 3 To UBound(v, 2)
        mX = Application.Match(CLng(DateValue(v(1, k))), tbl.Rows(1), 0)
        mY = Application.Match(v(j, 1), tbl.Columns(1), 0)
        If IsNumeric(mX) * IsNumeric(mY) Then
          v(j, k) = Application.Index(tbl, mY, mX)
        End If
      Next
    Next
    .Value = v
  End With
 
End Sub
・ツリー全体表示

【81395】Re:表の比較
お礼  T-K  - 20/7/15(水) 17:45 -

引用なし
パスワード
   回答ありがとうございます。
配列では厳しそうですね
データを整理してみます、
・ツリー全体表示

【81394】Re:表の比較
回答  γ  - 20/7/15(水) 9:15 -

引用なし
パスワード
   さて、通常の配列は、整数のインデックスを持ちますが、
このケースでは、
 "ABC41621" ---> Array(100,"[Book1]Sheet1!$A$1")
 "ABC41622" ---> Array(200,"[Book1]Sheet1!$A$2")
 "ABC41623" ---> Array(300,"[Book1]Sheet1!$A$3")
という対応関係に関する情報が必要になります。

これを配列で管理しようとしたら、
 0番目のindexに Array(100,"[Book1]Sheet1!$A$1") を持たせ
 1番目のindexに Array(200,"[Book1]Sheet1!$A$2") を持たせ
 2番目のindexに Array(300,"[Book1]Sheet1!$A$3") を持たせ
といった一次元配列に納めるんですか?

すると、
"ABC41621"が何番目の要素になるかは、どうやって知るんですか?

喩えていえば、
今後、都道府県名は使わずに、0県,1県、2県とよぶことにする、
とルール化するようなものですな。現場は混乱するでしょう。

そのためには、別途
 "ABC41621" ---> 0
 "ABC41622" ---> 1
 "ABC41623" ---> 2
というような関係をどこかに持たせて、
ユーザー自身が逐一検索しなければなりません。
そうしたことを、Dictinaryは内部で効率的に行ってくれるのです。
(Hashテーブルという特別に工夫した仕組みを活用することで
 高速・効率的に行っているのが、Dictionaryというデータ構造なわけです。)

VBAの元になっているVB6という言語仕様には、Dictionaryを持っておらず、
外部のライブラリーに依存していますが、
気の利いたプログラム言語では、必ずといってよいほど言語仕様として
装備されている、とても一般的なデータ構造です。
(名称は色々で、Hashとか、DictionaryとかAssociated Arrayとか呼ばれます)

ですから、配列と同程度に普通に使えるものですし、
Dictinaryを使ったので重くなったということは無いはずです。


重くなってきたというのは、基本的にはデータ量が増えたことに起因しているのでしょう。
関係しなくなっている古いデータがあれば、それは別途のログに移すとか、
そうした方面の工夫の余地はありませんか?
・ツリー全体表示

【81393】Re:表の比較
発言  T-K  - 20/7/14(火) 19:54 -

引用なし
パスワード
   返信ありがとうございます。
一番の理由は、配列を理解するため。 
もう一つは、dictionaryのこのプラグラム
を仕事で今も使用しているが、
使用していくなかで、処理が重くなってきた為です。 
データを蓄積してけば、重くなるのは理解できます。
少しでも軽く処理が出来ないかと考えたときに、
配列はどうなのか、と考えました。
配列を登録してセルに出力はできますが、
dictionaryのように、keyに対してセルのアドレスに
値を出力する方法がわかりません。

お手数お掛けして申し訳ありません。
よろしくお願い致します。
・ツリー全体表示

【81392】Re:ハイパーリンクについて
お礼  bo25  - 20/7/14(火) 15:54 -

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

【81391】Re:ハイパーリンクについて
発言  γ  - 20/7/14(火) 15:19 -

引用なし
パスワード
   関数ではないハイパーリンクについて調べてください。
何から何まで説明しきれませんよ。
・ツリー全体表示

【81390】Re:ハイパーリンクについて
質問  bo25  - 20/7/14(火) 11:30 -

引用なし
パスワード
   ▼γ さん:
ご回答ありがとうございました。
hyperlink関数では対応できないのですね。。。

再度質問させていただいてもよろしいでしょうか。

ご回答で、hyperlink関数を使わないものに変更してみては?
とのことですが、具体的にどの関数を使用すればよいでしょうか。


現在作成中のエクセルですが、

sheet1には検索値があり、vba登録したいシートです。
sheet2にwebページURLを含めた一覧表があります。


したいことは、

vbaボタンを押すと、sheet1の検索値に一致したsheet2のURLのページを表示することです。

(現在は、最初の質問のとおり、INDEX+MATCH関数で抽出し、HYPERLINK関数で引用していました)

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

【81389】Re:ハイパーリンクについて
回答  γ  - 20/7/14(火) 5:54 -

引用なし
パスワード
   いわゆるハイパーリンクには2種類ありますね。
・HYPERLINK関数によるもの
・HYPERLINK関数によらないもの(本来のハイパーリンク?)

セルのhyperlinkプロパティで管理されるものは、
上記の後者のもの(関数によらないもの)に限定されます。
ですから、エラーになりますね。
こればかりは仕様なので、致し方ないです。
争っても仕方がありません。
HYPERLINK関数を使わないものに変更してみては?


(なお、今回の質問に直接関係しませんが、
FollowHyperlinkイベントが、HYPERLINK関数によるものでは起きないことも、
重要な違いのひとつです。)
・ツリー全体表示

【81388】Re:表の比較
発言  γ  - 20/7/14(火) 5:43 -

引用なし
パスワード
   7年以上前のものですね。懐かしい。

さて、
Dictionaryを使わず、配列で実現できないか、
と言う質問に至った経緯を、逆に、もう少し教えていただきたいですね。
・ツリー全体表示

【81387】ハイパーリンクについて
質問  bo25  - 20/7/14(火) 1:54 -

引用なし
パスワード
   はじめまして。初質問です。

エクセルシートからウェブHPに飛ぶvbaを作成中です。

作成したvba
Range("AZ8").Hyperlinks(1).follow NewWindow:=True

なお、Range("AZ8")には、=HYPERLINK(INDEX+MATCH)関数を入力しており、他シートの一覧表から参照するようにしています。

このvbaを起動したとき、
「実行エラー9 インデックスが有効範囲にありません」
となります。

やはり、参照URLは直打ちでないといけないのでしょうか?

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

【81386】Re:表の比較
質問  T-K  - 20/7/13(月) 23:33 -

引用なし
パスワード
   以前この題目で問い合わせした、T-Kです。
Dictionaryにて値をKeyにして重複のない値をエクセルへ出力処理するやり方を
教えていただきました。ありがとうございました。

またおしえていただきたいのは、この内容の処理を配列でも
表現が可能なのでしょうか?

セルの値を配列に格納->それを加工してシートに出力という流れだと思いますが、
Dictionaryのように文字をKeyとできないこと 重複していても格納されてしまうこと等考えると、Dictionaryのほうが使い勝手はいいように思いますが、
もしその点で分かる方いらしたら教えてください。
・ツリー全体表示

【81385】Re:名前空間のあるxmlデータの抽出
お礼  Bernoulli  - 20/7/13(月) 17:31 -

引用なし
パスワード
   > Y様
固有の情報を投稿してしまいまして、失礼しました。
この件につきましては、当方で調査して参ります。ありがとうございました。
・ツリー全体表示

【81384】Re:名前空間のあるxmlデータの抽出
回答  γ  - 20/7/13(月) 17:14 -

引用なし
パスワード
   こういうドメイン知識を、ExcelVBAの質問掲示板にあげるのはいかがなものかと思います。
ご自分で調べるべきです。

ちなみに、ネット検索したところ、
下記のドキュメントを読むとよいのではないかと思います。
(1)
気象庁XMLとは
ht tps://aitc.jp/events/20130711-Kansai/20130711_111.pdf
(2)
気象庁防災情報XMLフォーマット(本文)[PDF形式:223KB](平成28年3月31日一部修正)
ht tp://xml.kishou.go.jp/jmaxml_20160331_format_v1_2.pdf
(↑そのままだとエラーになるので、あえて半角スペースを入れています。)


動作するものが得られましたが、あえて書きません。
・ツリー全体表示

【81383】Re:簡単なマクロなんですが・・・動きま...
発言  poor  - 20/7/12(日) 14:21 -

引用なし
パスワード
   マナさん

ご返信ありがとうございます。
今すぐ確認できないのですが、後ほど確認してみます。
ありがとうございます。
・ツリー全体表示

【81382】Re:簡単なマクロなんですが・・・動きま...
発言  マナ  - 20/7/11(土) 23:27 -

引用なし
パスワード
   ▼poor さん:
   
順番だけでは、ありませんでした。

    i = i + 1
    WB.Cells(1,i).Value = data.Worksheets(1).Cells(15,2).Value
・ツリー全体表示

【81381】Re:簡単なマクロなんですが・・・動きま...
発言  マナ  - 20/7/10(金) 17:51 -

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

   
>    Cells(1,i) = data.Worksheets("Sheet1").Cells(15,2).Value
>    i = i + 1

順番を逆にしないと、i=0からはじまりますよ。
・ツリー全体表示

【81380】簡単なマクロなんですが・・・動きません...
質問  poor  - 20/7/10(金) 16:57 -

引用なし
パスワード
   はじめまして。
急ぎで作らないといけないマクロがあるのですが、エラーがでて困っています。

やりたいこと
・フォルダ内の全.csvファイルのB15からB250までのデータを一つのシートにまとめたい。

・書いたコード
Sub OpenFilesInFolder()

  Dim WB As Worksheet
  Set WB = ThisWorkbook.Worksheets(1)

  Dim path, fso, file, files
  path = "C:\Users\XXXXXXXX…"
  Set fso = CreateObject("Scripting.FileSystemObject")
  Set files = fso.GetFolder(path).files

  'フォルダ内の全ファイルについて処理
  For Each file In files

    'ファイルを開いてブックとして取得
    Dim data As Workbook
    Set data = Workbooks.Open(file)

    'ブックに対する処理
    
    Cells(1,i) = data.Worksheets("Sheet1").Cells(15,2).Value
    i = i + 1

    '保存せずに閉じる
    Call data.Close(SaveChanges:=False)
    

  Next file

End Sub

このコードを実行するとブックに対する処理のところで止まってしまいます。
※上のコードではひとまず1個のセルだけでも転記できないか試したのでCellsを使っています。本当はB15:B250をまるまる転記したいのです。

質問としては、

・B15からB250のような複数セルの領域の転記方法が調べてもよくわからない、調べて出てくるコードを入れてみても動かないので正しいコードを教えて頂きたい。
 最初は.Range=.Rangeでできるのかと思っていたのですがどうもうまくいきません。

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

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