Excel VBA質問箱 IV

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

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


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

【77580】Re:innertextの特殊文字によるsplit
発言  γ  - 15/10/26(月) 22:39 -

引用なし
パスワード
   ご存じと思いますが、読者に向けて、
結果だけでなく調べ方をメモしておきます。

innertextをシート上のセルに書き出してください。
そして、"≫"がセルの先頭に来るように頭を削ってください。

Sub test4()
  Debug.Print AscW(Range("A1").Value)
End Sub  
とすると、最初の文字"≫"の Unicode文字コードを返します。
(Asc関数のヘルプを参照)
この場合、187になります。

----------

逆に文字コードを与えて、文字を得るには、
ChrW関数を使います。(Chr関数のヘルプを参照)

  a = Split(s, ChrW(187))
のように使います。
ChrW(&HBB)は 16進数表記で、内容は同じ。


VBEはユニコード未対応ですから、ユニコード文字をコード中に書くことは
できません。
つまり、  a = Split(s, "≫") とはできません。

したがって、ChrWを使って、
  a = Split(s, ChrW(187))
とせざるを得ません。

# なお、表記上 "≫"を流用しましたが、実際は別の文字です。
・ツリー全体表示

【77579】Re:innertextの特殊文字によるsplit
お礼  Satsuki  - 15/10/26(月) 22:25 -

引用なし
パスワード
   ▼γ さん:
早速のご回答ありがとうございます。

> a = Split(s, ChrW(&HBB))
上記の方法でできました。
大変助かりました。
ありがとうございました。

またわからないことがありましたら、よろしくお願いいたします。
・ツリー全体表示

【77578】Re:innertextの特殊文字によるsplit
発言  γ  - 15/10/26(月) 21:09 -

引用なし
パスワード
   Dim s As String に文字列が入っているとして、

 Dim a As Variant
 a = Split(s, ChrW(&HBB))
すると 
配列a に分割されませんか?
・ツリー全体表示

【77577】innertextの特殊文字によるsplit
質問  Satsuki  - 15/10/26(月) 19:29 -

引用なし
パスワード
   こんにちは、Satsukiと申します。
いつもいろいろ教えて頂いてありがとうございます。

HTMLのinnertextで以下の文字列を取り出し、bunruimeiに入れました。
メインページ ≫ 大分類 ≫ 中分類 ≫ 小分類 ≫ 名前

エクセルシートの各セルに大分類と小分類を入力したいのですが、
tmp = Split(bunruimei, "≫")
で上手く行かなかったので、ソースを見たら
「≫」は「»」になっていました。
ネットで調べて、
tmp = Split(bunruimei, "»")
tmp = Split(bunruimei, Chr(187))
tmp = Split(Replace(bunruimei, "»", ",", 1, 4), ",")
など色々試しましたが、上手く分割できません。どのようにしたらいいでしょうか?

どなたかご教示お願いいたします。
・ツリー全体表示

【77576】Re:マッチしたら指定範囲を別シートへコ...
発言  β  - 15/10/26(月) 19:16 -

引用なし
パスワード
   ▼soul-taker さん:

>これを下記のように記述したところ、うまくいかずに悩んでいます。

どううまくいかなかったのでしょう。

・マッチするはずなのに何も転記されなかった?
・実行したけどとちゅうで実行時エラーになった?
・実行まえにコンパイルエラーになった?

そのあたりを明確にしないと、回答側としては、悩んでしまいます。

Worksheets(A) や Worksheets(B)

この A や B は変数ですけど、どこかに定義されているのでしょうか?
で、その変数内には、あらかじめ シート名が格納されているのでしょうか?

もしかして シート名が "A" や "B" ということですか?

であれば

Worksheets("A") や Worksheets("B")

ですけど?
・ツリー全体表示

【77575】マッチしたら指定範囲を別シートへコピー
質問  soul-taker  - 15/10/26(月) 16:25 -

引用なし
パスワード
   初めて投稿致します。
よろしくお願いします。

・sheetA
 「A5:I20」に文字データが入っています。
 (途中に空白列有り。最終行は月度によって変動。)

・sheetB
 「A5:A30」に文字データが入っています。
 (途中に空白列有り。最終行は月度によって変動。)

・sheetAの「A5」列と同じ値のものがsheetBの「A5」列内に
 あった場合、その同じ値の行の「C列からI列」をsheetA→
 sheetBにコピーする。
 (sheetAもsheetBも都度、最終行が変わるので、文字デー
  タの範囲が変わる。)
・できれば、途中で並べ替えの作業等や作業列の作成はしたく
 ない。

 <例>
  【sheetA】
       A  B  C D E F G H I
    5  0001    ○ あ     ○ か
    6  0006    ○ い
    7
    8  0035        ○ ○ ○ き
    9  0018    ○ う         ○
    ・
    ・
    19  0099        ○   ○
    20  0102    ○ え
 

  【sheetB】
    sheetBは、最初はA列のみにデータがあり、C〜
    I列は空白の状態。
    5行目、6行目、9行目が、それぞれsheetAの5行目
    6行目、8行目と同じなので、それぞれのsheetAの
    A列でマッチしたC列〜I列をsheetBのC列〜I
    列にコピーして、下記の結果としたい。

       A  B  C D E F G H I
    5  0001    ○ あ     ○ か
    6  0006    ○ い
    7  0042
    8
    9  0035        ○ ○ ○ き
    10  0051
    ・
    ・
    30  0099        ○   ○


これを下記のように記述したところ、うまくいかずに悩んでい
ます。

Dim r1 As Range, r2 As Range, c As Range
Dim m As Variant

Sheets(A).Select

With Worksheets(A)
  Set r2 = .Range("A5", .Cells(.Rows.Count, 1).End(xlUp))
End With
With Worksheets(B)
  Set r1 = .Range("A5", .Cells(.Rows.Count, 1).End(xlUp))
End With
 
For Each c In r1
  m = Application.Match(c.Value2, r2, 0)
  If IsNumeric(m) Then
    r2.Item(m, 3).Resize(, 7).Copy c.Item(1, 3)
  End If
Next

別のところで、うまくいっていた事例を移植したのですが、
(実のところ、中身がきちんと理解できていないので)どこ
がマズイのかが見つけられませんでした。

どなたか、ご助言いただけますと助かります。
何とぞ、よろしくお願い致します。
・ツリー全体表示

【77574】Re:メール自動作成マクロの質問です
お礼  SHO  - 15/10/26(月) 9:41 -

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

ご助言ありがとうございました。
今回のソースは見当もつかず丸投げになってしまいました。
大変申し訳ありませんでした。
今後はメールアドレスを設定するなどしてすぐ気付けるようにします。

ソースありがとうございました。
ソースもとても親切なものを書いていただき感動しております。
このような書き方があるととても勉強になりました。

今回は本当にどうもありがとうございました。
・ツリー全体表示

【77573】Re:メール自動作成マクロの質問です
発言  γ  - 15/10/25(日) 23:52 -

引用なし
パスワード
   >まずはγさんのおっしゃる通り簡単な連結から始めていきたいと思います。
>ソースを考えていただいてもよろしいでしょうか?

連結から始めていきたいから、ソース作ってください、って変じゃないですか?
前進させる主体はあなただということをお忘れ無く。
ここはソースを受け取る場所じゃないです。
ご自分でできるところまでは、ご自分でトライしましょう。
もし詰まっているなら、どこが不明なのか、明らかにしましょう。

それと、もう少し反応をテンポ良くしたほうが良いと思います。
質問して、それに回答があったんですから、
返事くらい間を置かずにしてはどうですか?
お忙しいなら、いったん閉じましょう。
・ツリー全体表示

【77572】Re:負荷のなくシートないのデータを取得...
発言  β  - 15/10/25(日) 19:42 -

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

もう、ご覧にならないかもしれませんが。

>他の人と共有されているファイルなので、残念ながら行番号を追加することはできないんです。

提案したコードは現在使われているリスト範囲の外の右側に行番号をセットしています。

ですから

  With ActiveSheet.AutoFilter.Range
    With .Offset(, .Columns.Count).Resize(, 1)
      .Formula = "=ROW()"
      ●ここでCopy して、クリップボードからの取り込み処理
      .ClearContents
    End With
  End With

このようにすれば、問題はないと思いますが?
・ツリー全体表示

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

引用なし
パスワード
   ▼β さん:
>▼Show さん:
>
>↑でいう「処理の前」というのは、「コピペの前」という意味です。

回答ありがとうございます。他の人と共有されているファイルなので、残念ながら行番号を追加することはできないんです。それから、フィルタを掛ける前に、データを取るという提案ですが、確かにこの方法しかないですね。フィルタは、データは絶えず入力されるので実際は、現状はフィルタを解除して実行しています。しょうがないですね。

ありがとうございました。
・ツリー全体表示

【77570】Re:メール自動作成マクロの質問です
発言  γ  - 15/10/24(土) 11:09 -

引用なし
パスワード
   以前のあなたの投稿を参考にしてコード例を作ってみました。
変数宣言は省略しています。

  s = ""
  GYOMAX = Cells(Rows.Count, 1).End(xlUp).Row
  GYO = 10
  Do Until GYO > GYOMAX
    strRec = Cells(GYO, 1).Text & Cells(GYO, 2).Text & Cells(GYO, 3).Text & Cells(GYO, 4).Text
'     lngREC = lngREC + 1
'    xlAPP.StatusBar = "出力中です....(" & lngREC & "レコード目)"
'    ' レコードを出力
'     Print #intFF, strREC
    s = s & strRec & vbCrLf
    GYO = GYO + 1
  Loop
  objMAIL.body = s

A列のデータがある最終行までを対象に、4列の値を連結しています。
そのあたりの前提は明示されていないので、勝手に設定しましたが、
そちらで直してください。
・ツリー全体表示

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

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

↑でいう「処理の前」というのは、「コピペの前」という意味です。
・ツリー全体表示

【77568】Re:メール自動作成マクロの質問です
発言  γ  - 15/10/23(金) 21:02 -

引用なし
パスワード
   ▼SHO さん:
>まずはγさんのおっしゃる通り簡単な連結から始めていきたいと思います。
>ソースを考えていただいてもよろしいでしょうか?
>よろしくお願いします。
どのあたりに詰まっているのでしょうか。

データのある領域を特定するところですか?
それはシートを見ているあなたのほうが有利なはずです。

領域の中のセルを文字列に変換するところですか?

できているところまで書いてもらえませんか?
・ツリー全体表示

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

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

ふと思いつきました。
フィルターされていても列はすべて表示されていますね。
わからないのは、それが何行目だったかということでしょうかね。
処理の前に、フィルターリストの最後の列の次に、行番号をふっておく。

  With ActiveSheet.AutoFilter.Range
    With .Offset(, .Columns.Count).Resize(, 1)
      .Formula = "=ROW()"
    End With
  End With

で、その列も含めてコピペすれば、行番号が最後のセルに入っていますね。
・ツリー全体表示

【77566】Re:負荷のなくシートないのデータを取得...
発言  β  - 15/10/23(金) 19:09 -

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

提示のコードはコピペ利用ですから、フィルターで非表示になっている行は取得不可能です。
私自身は使ったことがないのですが ADO を使ってシートを扱う方法もあるのかなとは思います。
そのほか身の、いくつか手はあるかもしれません。
でも、どうなんでしょうか、処理効率としてはコピペが早いのでは?

ところで、すべての行が必要なら、フィルターをかける前に、この処理をしたらいかがですか?
・ツリー全体表示

【77565】Re:メール自動作成マクロの質問です
発言  SHO  - 15/10/23(金) 17:03 -

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

コメントありがとうございます。
また返信遅れて申し訳ありません。

まずは件名のコメントありがとうございました。
無事表示させることが出来ました。

頂いた不明点なのですが、
>(1)列は複数にわたっているのですね。
そのとおりです。
>(2)文字列と文字列の間はどうするのですか?
空白等無く連結できれば大丈夫です
>(3) =C10 と突然、式のようなものがでてきているが、意味不明。
すみません。C10に時間が入っており、時間を引いておりました。

まずはγさんのおっしゃる通り簡単な連結から始めていきたいと思います。
ソースを考えていただいてもよろしいでしょうか?
よろしくお願いします。
・ツリー全体表示

【77564】Re:負荷のなくシートないのデータを取得...
質問  Show  - 15/10/23(金) 16:36 -

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

時間がかかりましたが、やりたいことは、一つの問題を除いてできるようになりました。基本的には、提案頂いた方法で(UsedRange)テキストをクリップボードにコピーして、それに対して、改行やタブは残したまま、正規表現で検索してます。改行やタブの情報から、位置情報を割り出して、見つけた値が実際にどのセルにあるのか計算してその後Selectしてます。

一つの問題とは、UsedRange を使っているのでフィルターが掛かっている列がテキストとして取れないことです。UsedRange を使わずにフィルターされているテキストも取り込む方法はありますか?教えて下さい。何か私の説明に不明な点があれば、教えて下さい。(実際問題として、フィルタされている情報は必要ないのですが、位置情報を割り出すときに、改行を数えて、見つけた列はワークシートの何行目か計算するときに、フィルタされて実際のワークシートの行数とコピーされたデータ内の行数が違うので、行の計算ができないのが問題です。UsedRange から生成されるRangeに対して、Cells を使って相対的にセルを特定できるかやってみましたが、だめでした。)
・ツリー全体表示

【77563】Re:マクロ実行後に「応答なし」
お礼  viaggio  - 15/10/23(金) 14:53 -

引用なし
パスワード
   >ウッシ様 

回答ありがとうございます。

VBAの知識もないまま、既存のものを切り貼りして
作っているので、よく意味も理解できませんが、

このまま使わせていただきましたら、
早くなりました。

今後、こちらを参考にさせて頂きたいと思います。

ありがとうございました。
・ツリー全体表示

【77562】Re:マクロ実行後に「応答なし」
回答  ウッシ  - 15/10/23(金) 14:36 -

引用なし
パスワード
   こんにちは

原因は分かりませんが、コードの書き方で、変数の宣言を強制するように
ツール、オプションで設定しておきましょう。

Option Explicit

Sub 選択した項目の前回登録情報をコピー()
  Dim mSh As Worksheet
  Dim sR As Range
  Dim m  As String
  Dim rc As Variant
  Dim tSh As Worksheet
  
  On Error Resume Next
  Set tSh = Workbooks("151022_同一再稼働支援ツール.xlsm") _
        .Worksheets("登録票")
  On Error GoTo 0
  
  If tSh Is Nothing Then
    MsgBox "151022_同一再稼働支援ツール.xlsmが開かれていないか、" & _
        (Chr(10) & Chr(13)) & _
        "登録票シートが存在しません。" & _
        (Chr(10) & Chr(13)) & _
        "処理を中断します"
    Exit Sub
  End If
  
  Set mSh = ActiveWorkbook.ActiveSheet
  Set sR = Selection
    
  m = "選択しているセルの内容を、前回登録時の情報に書き換えます。"
  m = m & (Chr(10) & Chr(13))
  m = m & "この機能はセルの位置が完全一致している時のみ使用できます。"
  m = m & (Chr(10) & Chr(13))
  m = m & "よろしければ[OK]を押下してください。"
  
  rc = MsgBox(m, vbOKCancel + vbQuestion, "※要注意※")
 
  If rc = vbOK Then
    Workbooks("151022_同一再稼働支援ツール.xlsm") _
      .Worksheets("登録票").Range(sR.Address).Copy sR
  Else
    MsgBox "処理を中断します"
  End If
  
  Application.Calculation = xlCalculationAutomatic
  Application.ScreenUpdating = True
  Application.EnableEvents = True

End Sub

インデントを付けてコードを見やすく。

  Application.EnableEvents = True

としてあると言う事はチェンジイベントがあるのですか?

  Application.Calculation = xlCalculationAutomatic

の計算実行との順序は大丈夫ですか?
・ツリー全体表示

【77561】Re:コメントサイズの自動調整エラー
お礼  くまさん  - 15/10/22(木) 16:51 -

引用なし
パスワード
   ▼β さん:
以前にコメント頂いていた件、結局コメントを書き込むブックを再作成したところ、現象は収まりました。
色々アドバイスしていただき、ありがとうございました。


>▼くまさん さん:
>
>ついでに申し上げますと、item() の正体がわからなかったので
>Sub WComment(xlSheet As Worksheet, WMon As Long, WItem As Long)
>と変更し、プロシジャ内で、item と i を 参照しているコードも
>
>xlRange = xlRange.Value
>ComTxt = .Range("B5") & " " & .Range("D5") & " " & "PC"
>
>このように変更して実行してみましたが、何度やってもエラーにはなりません。
>
>もっとも xlRange や .Range("B5") や .Range("D5") に実際にはどんな値が入っているのかもわからないんですが。
・ツリー全体表示

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