 |
Coders' city Nasza pasja to programowanie!
|
| Zobacz poprzedni temat :: Zobacz następny temat |
| Autor |
Wiadomość |
Hegemon12
Dołączył: 30 Lis 2008 Posty: 39
|
Wysłany: Pon Lut 08, 2010 7:43 pm Temat postu: |
|
|
No i super Gościu, kod śmiga, tylko właśnie głowie się jak tu jeszcze dać mu w zakres dwie lub trzy komóreczki: Dodaje do przykładowego B2 jeszcze C8 jak poniżej, ale przenosi mi zawartość B2 do C8, a chciałbym żeby komórki te były niezależne od siebie. pobrane = Range("B2, C8").Value Range("B2, C8").Value = Left(zmiana, Len(zmiana) - 1)
Ostatnio zmieniony przez Hegemon12 dnia Pon Lut 08, 2010 8:12 pm, w całości zmieniany 1 raz |
|
| Powrót do góry |
|
 |
|
|
karolinavb Site Admin
Dołączył: 25 Maj 2005 Posty: 5614
|
Wysłany: Pon Lut 08, 2010 7:50 pm Temat postu: |
|
|
2010-02.... Zapomniałeś dodać, że w module (standard lub klasy), gdzie znajduje się ten kod, nie maprawa być "Option Explicit". Nawiasem mówiąć, ten kto "tego nie ma" sam prosi się o kłopoty... ------------------------------------------ Ja mam w okienku edycji projektu VBA, Tools/Options, zakładka Editor zaznaczone wszystkie opcje... Otwieram okienko edycji kodu klasy worksheet... wpisuję Twój kod... I Twój kod się normalnie nie kompiluje... Option Explicit... brak deklaracji zmiennych... Być może ten początkujący jest łepski i ma takie ustawienia, one są niekonieczne, ale właściwe!!!! A skoro wspomniałeś o "początkującym"... takie gadżety jak zaprezentowłaś mogą być "zgubne"...
| Cytat: | | ma ta wadę ze musisz wpisać Application.EnableEvents = False |
A Application.EnableEvents nie jest żadną "wadą" , jeśt świadomym działaniem, jesio piszący rozumie co to jest obsługa błędów, oraz jesio zapewnia sobie powrót do właściwych ustawień... Artik kurde, jest obsługa błędów w Twoim kodzie ?????
| Cytat: | | ale troszeczkę go też analizuj | Ty też... i nie prezentuj kodu, który przy ustawieniach jak u mnie "beka"... Ale jesio Hegemon12 jest zadowolony... powodzenia... |
|
| Powrót do góry |
|
 |
Artik Moderator
Dołączył: 10 Maj 2006 Posty: 1156 Skąd: Szczecin
|
Wysłany: Pon Lut 08, 2010 9:58 pm Temat postu: |
|
|
| karolinavb napisał: | | Artik kurde, jest obsługa błędów w Twoim kodzie ????? | No kurde, nie ma! Lecz na razie nie widzę zagrożeń (może dlatego, że nockę mam nie przespaną).
| Hegemon12 napisał: | | po wyjściu z wypełnianej komórki (z paska formuły) za pomocą ENTERA literki jeszcze bardziej się 'rozjeżdżają' | Enter od zawsze służył do zatwierdzania czegoś, Esc do anulowania. Nie moja wina, że ktoś używa narzędzi niezgodnie z przeznaczeniem. :-) Miałem świadomość zachowania się kodu w opisany przez ciebie sposób. Kod trzeba by przerobić tak, by odczytać wartość przed wprowadzeniem (z wykorzystaniem Undo), porównać z obecnie wprowadzonym i podjąć decyzję czy przerabiać czy nie. ... Mimo początkowych oporów, może faktycznie wykorzystać kod Gościa, jeśli komórek zmienianych będzie dosłownie kilka. (Idę na łatwiznę :-) ) | Kod: |   Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  Dim pobrane, odstep As String, znak As Integer, zmiana As String
  Dim ZakresDoZmian As Range
  Dim Rng As Range
 
  Set ZakresDoZmian = Union([A1], [C5], [H8])
 
  For Each Rng In ZakresDoZmian
  pobrane = Rng.Text
  odstep = " "
  If Mid(pobrane, 2, 1) <> odstep And pobrane <> vbNullString Then
  zmiana = vbNullString
  For znak = 1 To Len(pobrane)
  zmiana = zmiana & Mid(pobrane, znak, 1) & odstep
  Next
  Rng.Value = Left(zmiana, Len(zmiana) - 1)
  End If
  Next Rng
  End Sub
|
Ale kod jeszcze nie jest wolny o wad. Nie zadziała właściwie dla tekstu: O kurde, z powodu trochę mało pewnego warunku | Kod: |  Mid(pobrane, 2, 1) <> odstep
|
Artik _________________ Wymagasz? - masz! ;-) Szkolenia Excel |
|
| Powrót do góry |
|
 |
2010-02-08 Gość
|
Wysłany: Pon Lut 08, 2010 10:05 pm Temat postu: |
|
|
oczywiście wielka karolinavb ma rację należy deklarować zmienne a szczególnie początkujący czyli ja i ty Hegemon12
| Kod: |   Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  Dim odstep, pobrane, zmiana As String
  Dim znak As Integer
 
  odstep = "_"
 
  pobrane = Range("B2").Value
  If Mid(pobrane, 2, 1) <> odstep And pobrane <> "" Then
  zmiana = ""
  For znak = 1 To Len(pobrane)
  zmiana = zmiana & Mid(pobrane, znak, 1) & odstep
  Next
  Range("B2").Value = Left(zmiana, Len(zmiana) - 1)
  End If
 
  pobrane = Range("C8").Value
  If Mid(pobrane, 2, 1) <> odstep And pobrane <> "" Then
  zmiana = ""
  For znak = 1 To Len(pobrane)
  zmiana = zmiana & Mid(pobrane, znak, 1) & odstep
  Next
  Range("C8").Value = Left(zmiana, Len(zmiana) - 1)
  End If
 
  End Sub
|
Dodane przez moderatora (łączenie postów)
Artik cudnie tylko jedno ale , co i u mnie jest niedopracowane 9 linia pobrane = Replace(Rng.Text, " ", "") hi hi taka błahostka a taka polemika
Dodane przez moderatora (łączenie postów)
| Kod: |   Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  Dim odstep, pobrane, zmiana As String
  Dim znak As Integer
  Dim ZakresDoZmian As Range
  Dim Rng As Range
  odstep = "_"
  Set ZakresDoZmian = Union([B2], [C8], [H8])
  ' UNION nie znałem ale poznałem :)
  For Each Rng In ZakresDoZmian
  pobrane = Replace(Rng.Text, odstep, "")
  If pobrane <> "" Then
  zmiana = vbNullString
  For znak = 1 To Len(pobrane)
  zmiana = zmiana & Mid(pobrane, znak, 1) & odstep
  Next
  Rng.Value = Left(zmiana, Len(zmiana) - 1)
  End If
  Next Rng
  End Sub
|
Mid(pobrane, 2, 1) <> odstep ... to prowadziło do nikąd
Od moderatora: może jednak warto się zarejestrować? Mógłbyś wtedy edytować swoje posty zamiast zmuszać do tego moderatorów. |
|
| Powrót do góry |
|
 |
Artik Moderator
Dołączył: 10 Maj 2006 Posty: 1156 Skąd: Szczecin
|
Wysłany: Pon Lut 08, 2010 11:34 pm Temat postu: |
|
|
| 2010-02-08 napisał: | należy deklarować zmienne a szczególnie początkujący | Tyle, że "dzieciom" się wybacza, ale "młodzieży" - ja ty - już nie! :-)
Artik _________________ Wymagasz? - masz! ;-) Szkolenia Excel |
|
| Powrót do góry |
|
 |
Hegemon12
Dołączył: 30 Lis 2008 Posty: 39
|
Wysłany: Wto Lut 09, 2010 9:40 am Temat postu: |
|
|
Dziecko dziękuje dorosłym za bezpieczne przeprowadzenie przez ciemną dolinę VBA !
Qrcze, a jednak jeszcze jedno pytanie :( Chce zrobić rozstrzelenie tekstu w kilku arkuszach. Jednak kod działa pod jednym arkuszem, przeklejony do drugiego arkusza w edytorze VBA już nie działa. Czy jest prosty sposób żeby temu zaradzić ?
| Kod: |   Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  Dim odstep, pobrane, zmiana As String
  Dim znak As Integer
  odstep = " "
  pobrane = Range("K42").Value
  If Mid(pobrane, 2, 1) <> odstep And pobrane <> "" Then
  zmiana = ""
  For znak = 1 To Len(pobrane)
  zmiana = zmiana & Mid(pobrane, znak, 1) & odstep
  Next
  Range("K42").Value = Left(zmiana, Len(zmiana) - 1)
  End If
|
|
|
| Powrót do góry |
|
 |
karolinavb Site Admin
Dołączył: 25 Maj 2005 Posty: 5614
|
Wysłany: Wto Lut 09, 2010 8:53 pm Temat postu: |
|
|
| Cytat: | | Tyle, że "dzieciom" się wybacza, ale "młodzieży" - ja ty - już nie! :-) | Kurcze, Artur nie masz racji!!!! Można byłoby wybaczyć "Odpowiadaczowi 2010-02", ale On pisze
| Cytat: | no ale bez urazy Artik wiedza twa wielka szacun ... nie czepiam się a kolega Hegemon12 dopiero zaczyna przygodę | I prezentuje kod… Korzystający kliknięciem (po raz 1-szy) otwiera okienko edycji klasy WorkSheet, przed nim pracowałam ja. Mam zaznaczone stosowne opcje… On zatem ma Option Explicit, wpisuje kod gościa…Sorry i dupa… W porzo byłoby gdyby gość zaznaczył w poście, że w module, klasie nie ma Option Explicit… Bez urazy, synu, gościu, skoro zwracasz uwagę, że pytacz jest początkujący, 3maj się reguł!!!! Określaj warunki!!!!
| Cytat: | | należy deklarować zmienne… | Po czym:
| Cytat: | | Dim odstep, pobrane, zmiana As String | Na górze, dział Teoria. To tylko ostania zmienna jest typu String, reszta Variant… Ponadto:
Bez obsługi błędów + na Nothing może prowadzić do uszkodzenia skoroszytu!!! Ta uwaga dotyczy także Ciebie, królu Arurze ;-))
Hegemon12 Przepraszam, ale czy zawsze Target to jest Range("K42") ????? Bo Ty ciągle operujesz na Range("K42") ????
Ostatnio zmieniony przez karolinavb dnia Sro Lut 10, 2010 7:08 am, w całości zmieniany 1 raz |
|
| Powrót do góry |
|
 |
2010-02-09 Gość
|
Wysłany: Wto Lut 09, 2010 9:17 pm Temat postu: |
|
|
| Cytat: | | Od moderatora: może jednak warto się zarejestrować? Mógłbyś wtedy edytować swoje posty zamiast zmuszać do tego moderatorów. |
010-02-08 vel 2010-02-07 miło by było gdybyś się zarejestrował na forum. Nic nie kosztuje, spamu nie dostajesz, a lepiej by się gadało. Jakoś tak głupio gadać z datą. ;-) I ustabilizował byś się nieco. ... Artik
powyższy post jest odpowiedzią na te dwa nurtujące pytania
karolinavb wiedza wiedza a może nawet wiedza .... tylko czy jest coś poza tą wiedzą <- pytanie retoryczne
Odpowiedź od moderatora: tak się składa, że ostatnia sugestia była ode mnie. A ta twoja wypowiedź nie brzmi zbyt miło - szczególnie w odniesieniu do Karoliny. marcin_an |
|
| Powrót do góry |
|
 |
karolinavb Site Admin
Dołączył: 25 Maj 2005 Posty: 5614
|
Wysłany: Sro Lut 10, 2010 7:13 am Temat postu: |
|
|
Dzięki Marcin. "Czepiam" się, a to przeważnie wywołuje reakcje... Hegemon12 Czy to koniecznie musi być spacja, może CHR(160), wygląda jak zwykla spacja, a umożliwiłoby userowi wpisać tekst: Tytuł Mojej Książki czy Nazwisko i Imię, który po opuszczeniu komórki wyglądałby tak:T y t u ł M o j e j K s i ą ż k i a przy wejściu do komórki user powinien widzieć w pasku formuły i mieć do edycji ponownie normalny teskt: Tytuł Mojej Książki ------------------------------------------ Do Gościa, którego bardzo przepraszam, że ośmielam ponownie się napisać uwagi ;-)) Istotnie poza wiedzą, zresztą wcale nie taką dużą, nie prezentuję sobą nic, o ile masz na myśli, to o czym ja myślę ;-)) Jestem robotem.
Kod Gościa z Pon Lut 08, 2010 10:05 pm (wersja ostatnia)
| Cytat: | Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim odstep, pobrane, zmiana As String Dim znak As Integer Dim ZakresDoZmian As Range Dim Rng As Range odstep = "_" Set ZakresDoZmian = Union([B2], [C8], [H8]) ' UNION nie znałem ale poznałem :) For Each Rng In ZakresDoZmian Debug.Print Time; Target.Address ' dopisałam !!!!! pobrane = Replace(Rng.Text, odstep, "") If pobrane <> "" Then zmiana = vbNullString For znak = 1 To Len(pobrane) zmiana = zmiana & Mid(pobrane, znak, 1) & odstep Next Rng.Value = Left(zmiana, Len(zmiana) - 1) End If Next Rng End Sub | | Cytat: | | ' UNION nie znałem ale poznałem :) |
To skoro tak, to proszę jesio raz zajrzeć do kodu Artura:
| Cytat: | ....Set Zakres = Intersect(Target, ZakresDoZmian) If Not Zakres Is Nothing Then... |
Który jak widzę już sam się zagubił i zaczął to pomijać. Wcale nie tykam zakresów zawartych w zbiorze ZakresDoZmian (korzystając z przytoczonego wyżej kodu gościa), zaglądam do okienka Immediate i co widzę: 07:03:16 $P$4 07:03:17 $P$7 07:03:17 $P$10 07:03:18 $P$12 07:03:19 $P$14 07:03:20 $P$16 itd… Kod wykonywany jest wielokrotnie, kiedy "nie musi". Co więcej, obaj panowie pominęli właściwość Calculation, więc jeżeli Hegemon12 ma trochę bardziej obciążony skoroszyt… |
|
| Powrót do góry |
|
 |
Hegemon12
Dołączył: 30 Lis 2008 Posty: 39
|
Wysłany: Sro Lut 10, 2010 8:54 am Temat postu: |
|
|
| Cytat: | Hegemon12 Czy to koniecznie musi być spacja, może CHR(160), wygląda jak zwykla spacja, a umożliwiłoby userowi wpisać tekst: |
Fajny pomysł. Sprawdze to. Właśnie pewną drobną niedogodnością przy spacji jest to że później na pasku formuły gdy chce się dokonać jakiejś korekty tekst jest już rozstrzelony.
| Cytat: | Przepraszam, ale czy zawsze Target to jest Range("K42") ????? Bo Ty ciągle operujesz na Range("K42") ???? |
NIE, K42 to tylko przykładowy przykład :) Można w to miejsce podstawić jakiekolwiek inne komórki. |
|
| Powrót do góry |
|
 |
|
|
Możesz pisać nowe tematy Możesz odpowiadać w tematach Nie możesz zmieniać swoich postów Nie możesz usuwać swoich postów Nie możesz głosować w ankietach Możesz dodawać załączniki na tym forum Możesz pobierać pliki z tego forum
|
 Debug: strone wygenerowano w 0.25277 sekund, zapytan = 8
|